簡體   English   中英

為什么在JPanel上什么都不顯示?

[英]Why is nothing is displayed on JPanel?

我正在嘗試從數據庫中獲取數據並將結果發布到JPanel

這是簡化的代碼:

public class LedgerView extends JPanel {
    public LedgerView() {
        super();

        this.setLayout(new FlowLayout());

        this.add(new JLabel("ITEMS:"));

        String JDBC_DRIVER = "com.mysql.jdbc.Driver";
        String DB_URL = "jdbc:mysql://localhost/gnufinance";
        String USERNAME = "gnufinance";
        String PASSWORD = "gnuisnotunix";
        Connection conn = null;

        try {
            Class.forName(JDBC_DRIVER);
            conn = DriverManager.getConnection(DB_URL, USERNAME, PASSWORD);
        } catch (Exception e) {
            e.printStackTrace();
        }

        String query = "SELECT * FROM transactions";
        try {
            PreparedStatement ps = conn.prepareStatement(query);
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                String desc = rs.getString(3);
                System.out.println(desc);
                this.add(new JLabel(desc));
            }
        } catch (SQLException e) {
             e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        JFrame view = new JFrame();
        view.setVisible(true);
        view.setSize(300, 300);
        view.add(new LedgerView(), BorderLayout.CENTER);
    }

除了空白的灰色框外,什么都沒有顯示,但是當我刪除JDBC代碼時,將顯示第一個JLabel(ITEMS) 屏幕上什么也沒有,但是while循環中的System.out.println在控制台上正確打印所有數據。 沒有例外。

您必須在“ 事件調度線程 ”或EDT上創建面板。

擺動不是線程安全的; 您對擺動控件所做的任何更改(例如創建新的JLabel )都必須在EDT上發生(這不是您的main方法開始的線程。您可以使用EventQueue.invokeLater()告訴Java將工作移至擺動繪圖線程。

請注意,大多數時候您不希望您的工作(例如訪問數據庫)在EDT上進行,因為這會使您的用戶界面無響應。 換句話說,您的程序將在可能時繪制屏幕時執行訪問數據庫的工作。

這段代碼將解決您眼前的問題,但是您應該考慮訪問其他地方的數據庫(也許現在 ,在您的main方法中),將結果存儲在List ,然后將List傳遞給LedgerView ,這將導致響應速度更快的用戶界面。

public static void main(String[] args) {
    final JFrame view = new JFrame();

    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            view.setSize(300, 300);
            view.add(new LedgerView(), BorderLayout.CENTER);
            view.setVisible(true);
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM