我可以在构造函数中添加组件,但是在构造函数完成后我无法添加相同的组件。有人可以帮帮我吗?这是我的示例代码:
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中添加相同的组件时,它就不会发生。我认为它与布局有关,但我不确定。
答案 0 :(得分:2)
添加新按钮后,您需要在mouseClicked()
方法中调用revalidate()
和repaint()
种方法...
但您也不应该在MouseListener
中使用JButton
,而应使用ActionListener。
如果您需要扩展JFrame
范围内的内容,也不应该在课程中扩展JPanel
,请参阅:Java Swing using extends JFrame vs calling it inside of class