基本上我正在制作一个蛇游戏,我想在游戏菜单和实际的蛇游戏之间随意切换,所以我有一个变量int visibleCanvas
,然后切换到下面。因此,基本上我将主菜单可见性设置为false,并将游戏视为可见且可聚焦。
然而,屏幕变黑并且它不会绘制实际游戏,直到我按下“全屏按钮”(窗口)然后按我想要的那样显示游戏。
菜单和SnakeC以及扩展Canvas的类。
switch (visibleCanvas) {
case 0:
menu.setBackground(Color.black);
menu.setVisible(true);
menu.setFocusable(true);
menu.setPreferredSize(new Dimension(640, 480));
break;
case 1:
menu.setVisible(false);
snakeC.setBackground(Color.black);
snakeC.setPreferredSize(new Dimension(640, 480));
snakeC.setVisible(true);
snakeC.setFocusable(true);
snakeC.requestFocus();
break;
}
答案 0 :(得分:1)
您没有重新验证并重新绘制Component层次结构。如果您不这样做,那么您的应用程序窗口不会直接重绘,但仅在需要时(例如在调整大小后)。
顺便说一句,如果您正在制作游戏,您可能需要使用BufferStrategy来研究双缓冲,因为它可能有助于防止动画期间的闪烁,并允许您定期重绘画布(确保一个常量)帧速率,因此,平滑的动画)。
否则,这段代码演示了一个工作示例,它在单击第一个时切换Canvas实例(您可以用您想要的任何触发器替换MouseListener):
public static void main(String[] args) {
final JFrame frame = new JFrame("Test");
frame.setLayout(new BorderLayout());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final Canvas canvas1 = new Canvas();
final Canvas canvas2 = new Canvas();
canvas1.setBackground(Color.RED);
canvas2.setBackground(Color.BLUE);
canvas1.addMouseListener(new MouseAdapter() {
@Override public void mouseClicked(MouseEvent e) {
frame.remove(canvas1);
frame.add(canvas2, BorderLayout.CENTER);
System.out.println("Canvas switched to Canvas2");
frame.revalidate();
}
});
SwingUtilities.invokeLater(new Runnable() {
@Override public void run() {
frame.add(canvas1);
frame.setSize(640, 480);
frame.setVisible(true);
}
});
}