[英]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.