除非我调整窗口大小,否则新画布不可见

时间:2014-05-27 13:40:02

标签: java applet paint repaint visible

基本上我正在制作一个蛇游戏,我想在游戏菜单和实际的蛇游戏之间随意切换,所以我有一个变量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;
}

1 个答案:

答案 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);
        }
    });
}