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

时间:2017-03-06 17:08:56

标签: 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[] 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中添加相同的组件时,它就不会发生。我认为它与布局有关,但我不确定。

1 个答案:

答案 0 :(得分:2)

添加新按钮后,您需要在mouseClicked()方法中调用revalidate()repaint()种方法...

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

如果您需要扩展JFrame范围内的内容,也不应该在课程中扩展JPanel,请参阅:Java Swing using extends JFrame vs calling it inside of class