如何更新在Java中监听按钮的组件

问题描述 投票:1回答:1

由于这个问题似乎很明显,我很抱歉提出这个问题,但是我无法独自找到解决方案。

我正在用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()上调用这些方法,但不起作用。

有人可以尝试帮助我吗?

java swing jbutton actionlistener repaint
1个回答
1
投票

[您正在从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();
}
© www.soinside.com 2019 - 2024. All rights reserved.