Java 如何在构造函数之后添加组件(例如使用mouseClicked事件)

Java 如何在构造函数之后添加组件(例如使用mouseClicked事件),java,swing,Java,Swing,我可以在构造函数中添加组件,但在构造函数完成后我不能添加相同的组件。有人能帮我吗?下面是我的示例代码: public class MainFrame extends JFrame implements MouseListener{ JButton btnAdd = new JButton("Add new button"); int i = 0; Container container; public static void main(String[] arg

我可以在构造函数中添加组件,但在构造函数完成后我不能添加相同的组件。有人能帮我吗?下面是我的示例代码:

public class MainFrame extends JFrame implements MouseListener{

    JButton btnAdd = new JButton("Add new button");
    int i = 0;
    Container container;

    public static void main(String[] args) {
        MainFrame frame = new MainFrame();
        frame.setVisible(true);
    }

    public MainFrame() {
        container = getContentPane();
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(800, 700);
        container.setLayout(new FlowLayout());

        container.add(btnAdd);
        btnAdd.addMouseListener(this);

        // Add 2 additional buttons
        i++;
        container.add(new JButton("Btn " + i));
        i++;
        container.add(new JButton("Btn " + i));
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        System.out.println("Layout = " + container.getLayout());
        i++;
        container.add(new JButton("Btn " + i)); //this is not happening! WHYYYY????
        System.out.println("Mouse klicked");
    }

    @Override
    public void mouseEntered(MouseEvent e) {
    }

    @Override
    public void mouseExited(MouseEvent e) {
    }

    @Override
    public void mousePressed(MouseEvent e) {
    }

    @Override
    public void mouseReleased(MouseEvent e) {
    }
}
如果我在构造函数中添加按钮,一切正常。但当我尝试在mouseEvent中添加相同的组件时,却没有发生。我认为这与布局有关,但我不确定。

添加新按钮后,您需要在
mouseClicked()
方法中调用和方法

但是,您也不应该在
JButton
中使用
MouseListener
,而应该使用


您也不应该在类中扩展
JFrame
,如果您需要扩展某个东西来扩展
JPanel
,请参阅:

两个更好的策略:1)将组件添加到具有在构造函数中添加的cardlayout的面板中。添加的另一个组件是一个空白面板,其中添加了鼠标侦听器。当该面板检测到鼠标点击时,它会翻转到显示该按钮的另一张卡。2) 因为它是一个按钮,所以在构造函数中添加该按钮,但禁用它。直到鼠标点击。也如@FrakCool所述。对于按钮,请添加操作侦听器,而不是鼠标侦听器。@Frankcool我确实尝试过重新绘制(),但由于缺少revalidate(),因此无法工作。revalidate()方法对我来说是新的。我不知道这件事。谢谢你的支持!