为什么我的 GUI 无法出现在页面上?

Why does my GUI fail to appear on the page?

import javax.swing.*;
import java.awt.*;

public class Grid extends JFrame{
    public Grid(){
        super("Pathfinding Algorithms");
        setContentPane(new drawGrid());
        setSize(1920,1080);
        setExtendedState(JFrame.MAXIMIZED_BOTH);
        setUndecorated(true);
        setVisible(true);
    }
    class drawGrid extends JPanel { 
        public void paintComponent(Graphics g){
            g.setColor(Color.BLACK);
            g.drawLine(0,50,1920,50);
        }
    }
    public static void main(String[] args){
        new Grid();
    }
}

出于某种原因,每当我 运行 这段代码时,什么都没有显示。我没有收到任何错误,也没有收到任何输出消息。 我该如何解决这个问题?

按照教程学习 Swing 的基础知识。 Oracle provides one 免费。

在那里你会找到 this example code 来与你的代码进行比较。

在该示例代码中,您会发现 main 方法进行此调用:

javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
});

摆动线程

每个 Swing 应用程序都有一个专用于 GUI 的线程,即评论中提到的 event dispatching thread (EDT) 线程。绘图、使用鼠标和键盘跟踪用户的输入、响应 window dragging/resizing 以及所有其他 屏幕上的工作 必须 执行该线程 专用于 Swing。

相比之下,您的代码 运行ning 在主线程上。

上面看到的 invokeLater 调用是一种将 GUI 创建代码发送到 Swing 线程上的 运行 的方法。所以你可以这样修改你的代码:

javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new Grid() ;
            }
});

但是,我建议您学习该教程和其他示例,以更好地了解如何使用 Swing。例如,通常最好避免在代码片段中看到的构造函数中做不必要的工作。并注意.

中列出的问题

顺便说一句,Swing 得到完全支持,但在 maintenance-mode.

您可能需要考虑替代方案,JavaFX (OpenJFX). JavaFX is being actively developed, with a release every six months synchronized to Java releases. Development is led by the Gluon company in cooperation with Oracle Corp. as a sub-project on the OpenJDK project

相同的线程规则适用于 JavaFX,其中线程专用于 GUI。切勿在 Swing 或 JavaFX/OpenJFX 中从另一个线程访问或操作 GUI 小部件。