Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将新组件添加到在另一个类中创建的JPanel中_Java_Swing_Jpanel_Awt_Jlabel - Fatal编程技术网

Java 将新组件添加到在另一个类中创建的JPanel中

Java 将新组件添加到在另一个类中创建的JPanel中,java,swing,jpanel,awt,jlabel,Java,Swing,Jpanel,Awt,Jlabel,我有一个JFrame,它的网格是JPanels(使用Borderlayout)。每个JPanel都有一个JButton(由于位于Borderlayout中,因此会扩展到全尺寸)。所以我有类似扫雷舰的东西 这些按钮有一个监听器,带有构造函数监听器(面板),因此我可以从监听器使用面板 如果我执行panel.removeAll()在侦听器中,然后按钮消失,但是JPanel仍然存在,因此我获得了一个可用空间 我做panel.setBackground(粉红色),它可以工作,但是如果我想添加一个组件,比如

我有一个
JFrame
,它的网格是
JPanels
(使用
Borderlayout
)。每个
JPanel
都有一个
JButton
(由于位于
Borderlayout
中,因此会扩展到全尺寸)。所以我有类似扫雷舰的东西

这些按钮有一个监听器,带有构造函数监听器(面板),因此我可以从监听器使用面板

如果我执行
panel.removeAll()在侦听器中,然后按钮消失,但是
JPanel
仍然存在,因此我获得了一个可用空间

我做
panel.setBackground(粉红色),它可以工作,但是如果我想添加一个组件,比如另一个按钮或
JLabel
,它就不能工作。它在同一个类中工作,但不能分开,也不能在该类的某个方法中工作

多谢各位。希望你能理解

这是我的listener类:

public class ListenerCasillas implements ActionListener {

    JPanel panel;

    ListenerCasillas(JPanel panel){

    this.panel = panel;

    }

    @Override
    public void actionPerformed(ActionEvent e) {

        panel.removeAll();//works
        panel.setBackground(Color.green);//works
        panel.add(new JLabel("1"));//doesn't work
        panel.repaint();//works

    }

}
这里是创建网格的类:

public class Game extends JFrame {
    Game(){
        super("MineSweeper 0.0");
        setLocation(300, 300);
        setResizable(false);

        setLayout(new GridLayout(mainclass.rows, mainclass.cols));

        Dimension d = new Dimension(30, 30);

        for(int i = 0; i < mainclass.rows; i++){
            for(int j = 0; j < mainclass.cols; j++){
                JPanel panel = new JPanel();
                panel.setLayout(new BorderLayout());
                panel.setPreferredSize(d);

                add(panel);

                JButton boton = new JButton();

                boton.addActionListener(new ListenerCasillas(panel));
                panel.add(boton);
            }
        }

        setVisible(true);
        pack();
    }
}
公共类游戏扩展JFrame{
游戏(){
超级(“扫雷艇0.0”);
设置位置(300300);
可设置大小(假);
setLayout(新的GridLayout(mainclass.rows,mainclass.cols));
尺寸d=新尺寸(30,30);
对于(int i=0;i
完整java项目(如果要测试):

解决方案是在
ListenerCasillas
s
actionPerformed()
方法中调用
revalidate()

public class ListenerCasillas implements ActionListener {
    JPanel panel;

    ListenerCasillas(JPanel panel){
        this.panel = panel;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        panel.removeAll();
        panel.setBackground(Color.green);
        panel.add(new JLabel("1"));
        panel.revalidate();
        panel.repaint();
    }
}

有关
repaint()
revalidate()
的详细信息,请查看SO。

如果移动
panel.repaint()到执行的
操作的末尾
?在修改过程中告诉它重新油漆似乎是很奇怪的。it@phflack这只是为了移除按钮,我改变了它,但它是一样的。这是有意义的,因为添加一个组件应该强制重新绘制。如果更改
维度d=新维度(30,30),会发生什么情况到更大的?300x300应该有足够的空间来渲染标签(用于测试)@phflack Nothing,非常大的绿色正方形。