java - color - jpanel
La selección de elemento de menú de desplazamiento no configura el contenido en el panel de contenido (1)
Tengo un Swing JFrame, que tiene un montón de elementos de menú. El siguiente código intenta pero no establece el contenido del JFrame en la selección del elemento de menú ''Agregar dirección''.
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.setVisible(true);
JMenuBar menuBar = new JMenuBar();
JMenu clientMenu = new JMenu("Client");
JMenuItem address = new JMenuItem("Add Address");
clientMenu.add(address);
menuBar.add(clientMenu);
address.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
setupAddressForm();
}
});
private void setupAddressForm() {
frame.getContentPane().removeAll();
JPanel infoPanel = new JPanel();
JLabel infoLabel = new JLabel();
infoLabel.setText("<html><B>Please enter the address below</B></html>");
infoPanel.add(infoLabel, SwingConstants.CENTER);
frame.getContentPane().add(infoPanel, BorderLayout.NORTH);
JPanel buttonPanel = new JPanel();
JButton submitButton = new JButton("Submit Address");
JButton resetButton = new JButton("Reset");
submitButton.setToolTipText("Submit");
resetButton.setToolTipText("Reset");
buttonPanel.add(submitButton);
buttonPanel.add(resetButton);
frame.getContentPane().add(buttonPanel, BorderLayout.SOUTH);
JPanel fieldPanel = new JPanel();
fieldPanel.setLayout(new GridLayout(10, 10));
JLabel houseNumberLabel = new JLabel("House Number",
SwingConstants.LEFT);
final JTextField houseNumberField = new JTextField(3);
JLabel streetNameLabel = new JLabel("Street Name", SwingConstants.LEFT);
final JTextField streetNameField = new JTextField(10);
JLabel localityLabel = new JLabel("Locality", SwingConstants.LEFT);
final JTextField localityField = new JTextField(10);
JLabel cityLabel = new JLabel("City", SwingConstants.LEFT);
final JTextField cityField = new JTextField(10);
JLabel stateLabel = new JLabel("State", SwingConstants.LEFT);
final JTextField stateField = new JTextField(10);
JLabel zipCodeLabel = new JLabel("Zip Code", SwingConstants.LEFT);
final JTextField zipCodeField = new JTextField(10);
fieldPanel.add(houseNumberLabel);
fieldPanel.add(houseNumberField);
fieldPanel.add(streetNameLabel);
fieldPanel.add(streetNameField);
fieldPanel.add(localityLabel);
fieldPanel.add(localityField);
fieldPanel.add(cityLabel);
fieldPanel.add(cityField);
fieldPanel.add(stateLabel);
fieldPanel.add(stateField);
fieldPanel.add(zipCodeLabel);
fieldPanel.add(zipCodeField);
frame.getContentPane().add(fieldPanel, BorderLayout.CENTER);
submitButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String houseNumber = houseNumberField.getText();
String street = streetNameField.getText();
String locality = localityField.getText();
String city = cityField.getText();
String state = stateField.getText();
String zipCode = zipCodeField.getText();
Address address = new Address();
if (!"".equals(houseNumber) && !"".equals(street)
&& !"".equals(locality) && !"".equals(city)
&& !"".equals(state) && !"".equals(zipCode)) {
address.setHouseNumber(houseNumber);
address.setStreetName(street);
address.setLocality(locality);
address.setState(state);
address.setZipCode(zipCode);
}
}
});
frame.getContentPane().doLayout();
frame.getContentPane().update(frame.getGraphics());
}
Cuando selecciono el elemento de menú ''Agregar dirección'', el cuadro queda en blanco. No es lo que esperaba. Depuré usando el punto de ruptura y veo que se está llamando al método para configurar la dirección. No puedo entender por qué no funciona. ¿Podría alguien señalar si estoy haciendo algo mal aquí?
¿Por qué pasar por toda esta gimnasia? En su lugar, simplemente use CardLayout para cambiar las vistas por usted con un lío o un alboroto mínimo.
También tenga en cuenta que el JFrame que crea en la línea (A) en un método o constructor (no lo dice):
JFrame frame = new JFrame(); // (A)
no es el mismo JFrame que el utilizado en las líneas (B) y (C):
private void setupAddressForm() {
frame.getContentPane().removeAll(); // (B)
JPanel infoPanel = new JPanel();
JLabel infoLabel = new JLabel();
infoLabel.setText("<html><B>Please enter the address below</B></html>");
infoPanel.add(infoLabel, SwingConstants.CENTER);
frame.getContentPane().add(infoPanel, BorderLayout.NORTH); // (C)
Esto se debe a que declaras el JFrame en la línea (A) y, por lo tanto, solo es visible dentro de ese método o constructor.
Editar 1
Además, esto no es correcto:
frame.getContentPane().doLayout();
frame.getContentPane().update(frame.getGraphics());
Ya que no es así como obtienes nuevos componentes para mostrar en un contenedor para Swing. En cambio, haría algo así:
JPanel contentPane = (JPanel) frame.getContentPane();
contentPane.revalidate();
contentPane.repaint();
Pero, de nuevo, realmente no haría ninguno de los dos, y en su lugar usaría un CardLayout como se indicó anteriormente.
Finalmente, si alguna de estas recomendaciones no tiene sentido, solicite una aclaración.