【问题标题】:Why does my GUI fail to appear on the page?为什么我的 GUI 没有出现在页面上?
【发布时间】:2021-12-31 15:42:03
【问题描述】:
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();
    }
}

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

【问题讨论】:

  • 您的代码对我有用。整个屏幕被涂成灰色,一条黑色的水平线在屏幕顶部附近贯穿整个屏幕。
  • 与@Abra 相同的报告。话虽如此,该代码中存在许多问题和一些冗余,这意味着行为可能不是一致的访问机器。
  • 关于那些问题和冗余:1)这里不需要扩展JFrame。只需使用一个简单的实例。 2) drawGrid 应命名为 DrawGrid 以匹配常见的 Java 命名法。 3) setSize(1920,1080); 是多余的,给定setExtendedState(JFrame.MAXIMIZED_BOTH); 4) setVisible(true); 应该紧跟在pack() 之后。 5) public void paintComponent(Graphics g) 添加@Override 表示法用于方法名称和参数的编译时检查。 6) 在任何被覆盖的方法中,总是首先调用super() 方法。 7) new Grid(); 应该在 EDT 上调用。
  • .. 8) 鉴于对setUndecorated(true); 的调用,使用JWindow 可能更有意义。 --- 我怀疑问题来自第 4 点和第 7 点,但将它们全部实施并回复我们。或者,将这段代码扔掉,然后重新开始,完成 Java 教程的“创建 GUI”之后。
  • “什么是“EDT”?” 什么是a search engine?提示:每当您听到不理解的术语或缩写时,请将其添加到语言名称中(例如“java”)并将该查询弹出到搜索引擎中。另一个提示:添加@Abra(或重要的@)以通知此人有新评论。

标签: java swing user-interface


【解决方案1】:

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

您会在此处找到this example code 以与您的代码进行比较。

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

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

摇摆线程

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

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

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

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

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


顺便说一下,Swing 是完全支持的,但在 maintenance-mode 中。

您可能需要考虑替代方案,JavaFX (OpenJFX)。 JavaFX 正在积极开发中,每六个月发布一次,与 Java 版本同步。开发由Gluon 公司与甲骨文公司合作领导。as a sub-project onOpenJDK project

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

【讨论】:

    猜你喜欢
    • 2011-08-04
    • 1970-01-01
    • 2021-11-13
    • 2015-08-04
    • 2012-10-20
    • 1970-01-01
    • 1970-01-01
    • 2015-02-09
    • 1970-01-01
    相关资源
    最近更新 更多