java游戏开发中的窗口崩溃

时间:2015-06-27 15:55:50

标签: java swing awt

这是我的代码,它会创建一个窗口,可以接管我的全屏,并且背景颜色为蓝色,并且会以黑色打印“Hello World”但是当我运行此应用程序时屏幕冻结,文本“Hello World”出现,5秒后线程终止,但背景颜色不变,屏幕变得像这样! enter image description here 谁能指出我做错了什么?

这是我的Screen课程:

import java.awt.DisplayMode;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Window;
import javax.swing.JFrame;

public class Screen {
    private GraphicsDevice graphic_card;

    public Screen() {
        GraphicsEnvironment environment = GraphicsEnvironment.getLocalGraphicsEnvironment();
        graphic_card = environment.getDefaultScreenDevice();
    }

    public void set_full_screen(DisplayMode mode, JFrame window) {
        window.setUndecorated(true);
        window.setResizable(false);
        graphic_card.setFullScreenWindow(window);
        if ((mode != null) && (graphic_card.isDisplayChangeSupported())) {
            try {
                graphic_card.setDisplayMode(mode);
            } catch (Exception exception) {
                // No handling of exception
            }
        }
    }

    public Window getFullScreenWindow() {
        return graphic_card.getFullScreenWindow();
    }

    public void restore_screen() {
        Window window = graphic_card.getFullScreenWindow();
        if (window != null) {
            window.dispose();
        }
        graphic_card.setFullScreenWindow(null);
    }
}

这是我的Mayank课程:

import java.awt.Color;
import java.awt.DisplayMode;
import java.awt.Font;
import java.awt.Graphics;
import javax.swing.JFrame;

public class Mayank extends JFrame {
    public static void main(String[] args) {
        DisplayMode display_mode = new DisplayMode(800, 600, 16, DisplayMode.REFRESH_RATE_UNKNOWN);
        Mayank mayank = new Mayank();
        mayank.run(display_mode);
    }

    public void run(DisplayMode display_mode) {
        setBackground(Color.BLUE);
        setForeground(Color.BLACK);
        setFont(new Font("Arial", Font.PLAIN, 24));
        Screen game_screen = new Screen();
        try {
            game_screen.set_full_screen(display_mode, this);
            try {
                Thread.sleep(5000);
            } catch (Exception exception) {
                // No handling of exception
            }
        } finally {
            game_screen.restore_screen();
        }
    }

    public void paint(Graphics g) {
        g.drawString("Hello World!!", 200, 200);
    }
}

1 个答案:

答案 0 :(得分:3)

我不知道你在哪里得到这段代码,但是它错了。

我创建了一个显示蓝色背景5秒的GUI,然后将背景更改为白色。

这是GUI。

Hello World Test

  1. 所有Swing应用程序必须以调用SwingUtilities invokeLater方法开始,以便在Event Dispatch thread (EDT)上创建和执行Swing组件。

  2. 始终在JPanel上绘图。永远不要直接在JFrame上绘制。

  3. 您的计时器阻止了EDT。您必须在单独的线程中放置计时和更新事件。当您从单独的线程更改GUI时,必须执行invokeLater方法以确保在EDT上完成绘图面板的更新。

  4. 这是代码。

    package com.ggl.testing;
    
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Font;
    import java.awt.Graphics;
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    
    public class Manyak implements Runnable {
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Manyak());
        }
    
        @Override
        public void run() {
            JFrame frame = new JFrame("Hello Word Test");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            DrawingPanel drawingPanel = new DrawingPanel();
    
            frame.add(drawingPanel);
            frame.pack();
            frame.setVisible(true);
    
            new Thread(new Delay(drawingPanel)).start();
        }
    
        public class DrawingPanel extends JPanel {
    
            private static final long serialVersionUID = -685508126882892538L;
    
            private Color color;
    
            public DrawingPanel() {
                this.setPreferredSize(new Dimension(400, 400));
                this.color = Color.BLUE;
            }
    
            public void setColor(Color color) {
                this.color = color;
                this.repaint();
            }
    
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
    
                g.setColor(color);
                g.fillRect(0, 0, getWidth(), getHeight());
    
                g.setColor(Color.BLACK);
                g.setFont(new Font("Arial", Font.PLAIN, 24));
                g.drawString("Hello World!", 120, 200);
            }
    
        }
    
        public class Delay implements Runnable {
    
            private DrawingPanel drawingPanel;
    
            public Delay(DrawingPanel drawingPanel) {
                super();
                this.drawingPanel = drawingPanel;
            }
    
            @Override
            public void run() {
                try {
                    Thread.sleep(5000L);
                } catch (InterruptedException e) {
    
                }
    
                SwingUtilities.invokeLater(new Runnable() {
    
                    @Override
                    public void run() {
                        drawingPanel.setColor(Color.WHITE);
                    }
    
                });
    
            }
    
        }
    }