簡體   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