java - java游戏开发中的窗口崩溃

标签 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 类(class):

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

最佳答案

我不知道你从哪里得到这段代码,但它是错误的。

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

这是 GUI。

Hello World Test

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

  2. 始终在 JPanel 上绘图。切勿直接在 JFrame 上绘图。

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

这是代码。

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

            });

        }

    }
}

关于java - java游戏开发中的窗口崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31090617/

相关文章:

java - 运行时依赖项错误 "mvn compile"

java - JButton 未出现在 JPanel 上

java - JScrollPane 没有出现?

java - 将更改应用于 BufferedImage

java - 为什么不显示附加了按下的键字符的 String 对象?

java - 如何在 Mac 上设置 Logback?

java - 如何将滚动 Pane 动态添加到 Swing java 中的选项卡式 Pane 中

java - JOOQ 如何从表中选择最小值 'id'

java - 在最小化和取消最小化之前无法调整内部框架的大小

java - 在 Java : java. awt.Font 中渲染字体行为不正确