繁体   English   中英

为什么我的 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();
    }
}

出于某种原因,每当我运行此代码时都没有显示任何内容。 我没有收到任何错误,也没有收到 output 消息。 我怎样才能解决这个问题?

按照教程学习 Swing 的基础知识。 Oracle 免费提供一个

在那里,您将找到此示例代码以与您的代码进行比较。

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

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

Swing螺纹

每个 Swing 应用程序都有一个专用于 GUI 的线程,即评论中提到的事件调度线程 (EDT)线程。 绘图、使用鼠标和键盘跟踪用户输入、响应 window 拖动/调整大小以及所有其他屏幕上的工作必须在专用于 Swing 的线程上执行

相反,您的代码在主线程上运行。

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

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

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


顺便说一句,完全支持 Swing 但处于维护模式

您可能需要考虑替代方案JavaFX ( OpenJFX )。 JavaFX 正在积极开发中,每六个月发布一次,与 Java 版本同步。 开发由Gluon公司牵头,与 Oracle Corp. 合作,作为OpenJDK 项目的子项目。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM