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