为什么我的 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 小部件。
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 小部件。