В этом простом коде, если я нажму кнопку несколько раз, несколько JCheckBox будут добавлены в JPanel. Однако дисплей не обновляется, если сразу после add("TEST")
я не вызываю либо revalidate()
(просто invalidate()
не работает), либо updateFrame()
. Кроме того, если я использую revalidate()
, JCheckBoxes появляются, но размер JPanel не изменяется. Мне также известен метод repaint()
, но я не уверен, как использовать его или другие методы.
Какова взаимосвязь между этими методами обновления компонентов, чтобы я мог достичь желаемого минимума (появятся JCheckBoxes и изменится размер панели JPanel)?
Как я могу упростить код?
public class UserInterface2 {
private final JFrame frame;
private JButton button;
private JPanel panel;
public UserInterface2() {
frame = new JFrame("Test App");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(new BorderLayout());
createButton();
panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS));
frame.getContentPane().add(button, BorderLayout.WEST);
frame.getContentPane().add(panel, BorderLayout.CENTER);
}
private void updateFrame() {
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
private void createButton() {
button = new JButton("Text");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
add("TEST");
panel.revalidate();
//updateFrame();
}
});
}
public void show() {
updateFrame();
}
private void add(String text) {
panel.add(new JCheckBox(text));
}
public static void main(String [] args) {
SwingUtilities.invokeLater(() -> new UserInterface2().show());
}
}