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
sactionPerformed()
方法中调用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,非常大的绿色正方形。