我调用。在方法的第四行重新验证。
这没有任何作用,因为没有向面板添加任何组件。需要在添加组件后执行重新验证()。
显示的面板不是jpanel,显示的面板是jpanel2,这就是为什么我在方法末尾将jpanel2指定给jpanel的值。
您不能仅仅更改一个参照,然后期望组件从一个面板移动到另一个面板。
组件需要添加到添加到GUI的面板中。
编辑:
首先,回转组件以“J”开头。不要在Swing应用程序中使用AWT组件(菜单栏、菜单、菜单项)。
问题是您的LAF:
new MineSweeper();
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
组件是使用当前LAF创建的。首次创建游戏时,默认LAF用于创建所有按钮(和其他组件)。此LAF允许您更改按钮的背景色。
但是,然后更改LAF。因此,当您重置游戏板时,按钮现在使用系统LAF创建。这个LAF显然不允许您更改按钮的背景色。
这应该很容易测试。创建GUI:
//UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
JButton button = new JButton("testing");
button.setBackground(Color.RED);
JFrame frame = new JFrame("SSCCE");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add( button );
frame.pack();
frame.setLocationByPlatform( true );
frame.setVisible( true );
首先按照上面的步骤测试代码,看看按钮的背景是否发生了变化。
然后取消LAF更改的注释并重新测试。
一种不依赖LAF的可能解决方案是使用图标来表示按钮的背景色。然后,您可以将任何文本居中放置在图标顶部。类似于:
import java.awt.*;
import javax.swing.*;
public class ColorIcon implements Icon
{
private Color color;
private int width;
private int height;
public ColorIcon(Color color, int width, int height)
{
this.color = color;
this.width = width;
this.height = height;
}
public int getIconWidth()
{
return width;
}
public int getIconHeight()
{
return height;
}
public void paintIcon(Component c, Graphics g, int x, int y)
{
g.setColor(color);
g.fillRect(x, y, width, height);
}
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
public static void createAndShowGUI()
{
JPanel panel = new JPanel( new GridLayout(2, 2) );
for (int i = 0; i < 4; i++)
{
Icon icon = new ColorIcon(Color.RED, 50, 50);
JLabel label = new JLabel( icon );
label.setText("" + i);
label.setHorizontalTextPosition(JLabel.CENTER);
label.setVerticalTextPosition(JLabel.CENTER);
panel.add(label);
}
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().add(panel);
f.setSize(200, 200);
f.setLocationRelativeTo( null );
f.setVisible(true);
}
}