由于这个问题似乎很明显,我很抱歉提出这个问题,但是我无法独自找到解决方案。
我正在用Java编写一个小应用程序,但是遇到一些“重绘”我的swing组件的问题。基本上,我希望事件发生时更新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()
等的工作原理,我想这就是问题所在。我尝试在buttons
面板上调用相同的方法,该方法几乎可以正常工作,但是我仍然有一个图形错误,我想对所有容器都这样做。我也尝试在this.getContentPane()
上调用这些方法,但不起作用。
有人可以尝试帮助我吗?
[您正在从this
中删除所有组件(在本例中为JFrame
(在扩展它时,不需要这样做,而应该从中创建一个实例,而不是从它继承) ,因为您没有更改JFrame
的行为,所以最好只创建它的一个实例。请参见:Extends JFrame vs. creating it inside the program
在这种情况下,您是以这种方式添加组件的:
JFrame > buttons (JPanel) > JButtons
您正在尝试删除
JFrame > everything
其中包括contentPane,应致电。
buttons.removeAll()
update()
方法内部。
并且还要调用this.repaint()
,因此您的update()
方法应成为:
public void update() {
buttons.removeAll();
buttons.add(button3);
this.revalidate();
this.repaint();
}