2011-05-30 7 views
11

Busqué mucho en Google y no encontré ninguna solución. Creo que no habrá maestros java para que me ayude ...¿Cómo cambiar los paneles de diseño de la tarjeta desde otro panel?

Este es mi método initialize:


private void initialize() { 
    this.setSize(750, 480); 
    this.setContentPane(getJContentPane()); 
    this.setTitle("Registration"); 
    JPanel topPane = new TopPane(); 
    this.getContentPane().add(topPane,BorderLayout.PAGE_START); 
    cards=new JPanel(new CardLayout()); 
    cards.add(step0(),"step0"); 
    cards.add(step1(),"step1"); 
    cards.add(step2(),"step2"); 
    this.getContentPane().add(cards,BorderLayout.CENTER); 
} 

public JPanel step2(){ 
    EnumMap<DPFPFingerIndex,DPFPTemplate> template = new EnumMap<DPFPFingerIndex, DPFPTemplate>(DPFPFingerIndex.class); 
    JPanel enrol = new Enrollment(template,2); 
    return enrol; 
} 

public JPanel step0(){ 
    JPanel userAgree = new UserAgreement(); 
    return userAgree; 
} 

public JPanel step1(){ 
    JPanel userInfo = new UserInformation(); 
    return userInfo; 
} 

public JPanel getCards(){ 
    return cards; 
} 


Este, es el método en otro step0 JPanel:

jButtonAgree.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent e) { 
       Registration reg = new Registration(); 
       LayoutManager cards = reg.getCards().getLayout(); 
       ((CardLayout) cards).show(reg.getCards(),"step1"); 
      } 
     }); 

Sin ninguna reacción, he intentado revalidar, volver a pintar y otros miembros del personal ... no funciona ... ¡cualquiera tiene algo especial aquí!

+1

Se trata de no llamar a los métodos en la instancia de registro adecuada. En el código anterior está creando una nueva instancia de registro que no está relacionada con la que se muestra en la GUI. En su lugar, debe obtener una referencia al objeto de registro visible. Por favor, consulte mi respuesta a continuación ... –

Respuesta

19

Se trata de exponer los métodos correctos y cadenas constantes al mundo exterior para permitir que la clase intercambie puntos de vista. Por ejemplo, proporcione a su primera clase un campo de CardLayout privado denominado cardlayout y un campo privado de JPanel llamado cards (el titular de la tarjeta JPanel), y algunas constantes String públicas que se utilizan para agregar sus tarjetas JPanels al contenedor de tarjetas. También darle un método público, digamos llamada public void swapView(String key) que permite a clases fuera para intercambiar tarjetas ... algo así:

// code corrected 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class Registration extends JPanel { 
    // use these same constants as button texts later 
    private static final Dimension PREF_SIZE = new Dimension(450, 300); 
    public static final String USER_AGREEMENT = "User Agreement"; 
    public static final String USER_INFO = "User Information"; 
    public static final String ENROLLMENT = "Enrollment"; 
    // we'll extract them from this array 
    public static final String[] KEY_TEXTS = {USER_AGREEMENT, USER_INFO, ENROLLMENT}; 
    private CardLayout cardlayout = new CardLayout(); 
    private JPanel cards = new JPanel(cardlayout); 

    public Registration() { 
     cards.add(createUserAgreePanel(), USER_AGREEMENT); 
     cards.add(createUserInfoPanel(), USER_INFO); 
     cards.add(createEnrollmentPanel(), ENROLLMENT); 
     setLayout(new BorderLayout()); 
     add(cards, BorderLayout.CENTER); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return PREF_SIZE; 
    } 

    private JPanel createEnrollmentPanel() { 
     JPanel enrol = new JPanel(); 
     enrol.add(new JLabel("Enrollment")); 
     return enrol; 
    } 

    private JPanel createUserAgreePanel() { 
     JPanel userAgree = new JPanel(); 
     userAgree.add(new JLabel("User Agreement")); 
     return userAgree; 
    } 

    private JPanel createUserInfoPanel() { 
     JPanel userInfo = new JPanel(); 
     userInfo.add(new JLabel("User Information")); 
     return userInfo; 
    } 

    public void swapView(String key) { 
     cardlayout.show(cards, key); 
    } 

} 

A continuación, una clase exterior puede intercambiar puntos de vista, simplemente llamando a la swapView en la instancia de esta clase se visualizó , pasando la cadena clave apropiada, como en este caso CardTest.USER_INFO para mostrar la información del usuario JPanel.

Ahora usted tiene un problema con este fragmento de código en la que indico por el comentario:

jButtonAgree.addActionListener(new java.awt.event.ActionListener() { 
     public void actionPerformed(java.awt.event.ActionEvent e) { 
      Registration reg = new Registration(); // **** HERE ***** 
      LayoutManager cards = reg.getCards().getLayout(); 
      ((CardLayout) cards).show(reg.getCards(),"step1"); 
     } 
    }); 

En esa línea se está creando un nuevo objeto de registro, probablemente uno que tiene relación alguna con la que está visualizado en la GUI, por lo que los métodos de llamada en este nuevo objeto no tendrán ningún efecto en la interfaz gráfica de usuario actualmente vista. Lo que necesita en lugar de obtener una referencia al objeto de registro visto, quizás dando esta clase un método getRegistration, y luego llamar a sus métodos, así:

class OutsideClass { 
    private Registration registration; 
    private JButton jButtonAgree = new JButton("Agree"); 

    public OutsideClass() { 
     jButtonAgree.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      // make sure registration reference has been obtained first! 
      if (registration != null) { 
       registration.swapView(Registration.USER_AGREEMENT); 
      } 
     } 
     }); 
    } 

    // here I allow the calling class to pass a reference to the visualized 
    // Registration instance. 
    public void setRegistration(Registration registration) { 
     this.registration = registration; 
    } 
} 

Por ejemplo:

@SuppressWarnings("serial") 
class ButtonPanel extends JPanel { 
    private Registration registration; 

    public ButtonPanel() { 
     setLayout(new GridLayout(1, 0, 10, 0)); 
     // go through String array making buttons 
     for (final String keyText : Registration.KEY_TEXTS) { 
     JButton btn = new JButton(keyText); 
     btn.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       if (registration != null) { 
        registration.swapView(keyText); 
       } 
      } 
     }); 
     add(btn); 
     } 
    } 

    public void setRegistration(Registration registration) { 
     this.registration = registration; 
    } 
} 

y la MainClass que maneja esto todo

class MainClass extends JPanel { 
    public MainClass() { 
     Registration registration = new Registration(); 
     ButtonPanel buttonPanel = new ButtonPanel(); 
     buttonPanel.setRegistration(registration); 

     buttonPanel.setBorder(BorderFactory.createTitledBorder("Button Panel")); 
     registration.setBorder(BorderFactory.createTitledBorder("Registration Panel")); 

     setLayout(new BorderLayout()); 
     add(registration, BorderLayout.CENTER); 
     add(buttonPanel, BorderLayout.SOUTH); 
    } 

    private static void createAndShowUI() { 
     JFrame frame = new JFrame("Registration"); 
     frame.getContentPane().add(new MainClass()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowUI(); 
     } 
     }); 
    } 
} 
+0

¡Eso es muy útil! Muchas gracias ! Este problema me tenía duda desde hace muchos días ... jaja ... –

+1

@aladdin: La clave de mi hijo es correcta * Referencias *. Una vez que lo tienes resuelto, el resto es fácil. Me alegro de que haya ayudado. –

+0

Ojalá se pudiera dar a esta publicación más puntaje – Zavior

Cuestiones relacionadas