[英]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 应用程序都有一个专用于 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.