Мне немного жаль задавать этот вопрос, поскольку он кажется очевидным, но я не могу найти свое решение в одиночку.
Я кодирую небольшое приложение в Java, и Я столкнулся с некоторыми проблемами при «перерисовке» компонентов свинга. По сути, я хочу, чтобы мой JFrame
обновлялся при возникновении события. Мне удалось воспроизвести проблему в приведенном ниже коде. Этот код должен отображать две кнопки (что он делает) и заменять их третьей кнопкой, когда вы нажимаете на первую кнопку (а это не так).
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Example extends JFrame implements ActionListener {
private JButton button = new JButton("Button 1");
private JButton button2 = new JButton("Button 2");
private JButton button3 = new JButton("Button 3");
private JPanel buttons = new JPanel();
public void init() {
this.setVisible(true);
this.setSize(500,500);
buttons.add(button);
buttons.add(button2);
this.add(buttons);
this.button.addActionListener(this);
}
public void update() {
this.removeAll();
buttons.add(button3);
this.revalidate();
}
public static void main(String[] args) {
Example ex = new Example();
ex.init();
}
public void actionPerformed(ActionEvent e) {
if(e.getSource() == button) {
update();
}
}
}
Я почти уверен, что Я что-то не так делаю в методе update()
. На самом деле мне очень сложно понять, как работает removeAll()
, revalidate()
, repaint()
и c, и я думаю, что это проблема. Я попытался вызвать те же методы на панели buttons
, это почти сработало, но у меня все еще есть ошибка графического c, и я хотел бы сделать это для всего контейнера. Я тоже пробовал вызвать эти методы на this.getContentPane()
, но это не работает.
Может кто-нибудь попробовать мне с этим помочь?