2009-11-06 96 views
0

我剛開始編寫GUI程序,這是我的第二個GUI程序。對於這兩個項目(包括家庭作業),我都有同樣的問題。 GUI對象(例如JTextField)不會顯示應用程序何時運行,直到調整窗口大小或將鍵盤焦點移動到它們之後。如果我不做這兩件事中的一件,那麼我只需要一個空的應用程序窗口。在Mac上不顯示Java對象的GUI對象

任何想法,爲什麼發生這種情況,我能做些什麼來解決它?我正在使用Mac OS 10.6.1。

我的代碼如下。隨意評論我的編碼風格,但請關注我遇到的問題。

import javax.swing.*; 
import java.awt.*; 

public class ToDo extends JFrame { 

    private int height = 30, 
       width = 300; 

    public ToDo() { 
     this.setSize(400,400); 
     this.setVisible(true); 
     this.setLayout(null); 
     this.setResizable(true); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.setTitle("To Do List"); 
     JTextField todoItem[] = new JTextField [10]; 
     Container contentpane = this.getContentPane(); 
     contentpane.setLayout(null); 
     for(int i=0; i<10; i++) { 
      todoItem[i] = new JTextField(); 
      todoItem[i].setBounds(10,(height*(i)+10),width,height); 
      contentpane.add(todoItem[i]); 
     } 

    } 

    public static void main(String[] args) { 
     new ToDo(); 
    } 
} 

回答

0

猜測:在setBounds之前添加組件。

0

我可能是錯的 - 從我在java中完成一個圖形用戶界面很長一段時間 - 但我猜你的問題是在完成添加元素之前使JFrame可見。我認爲你需要事後做,或者在框架上致電更新。

編輯 - 此外,不確定將佈局設置爲空是一個好主意。我一直使用GridBag,但如果將它設置爲null,它可能會失去它的默認值。

+0

如果你只是想要一個靜態佈局(它根本沒有響應來調整窗口的大小),那麼將layout設置爲null不是問題 – 2009-11-06 22:08:41

2

有一些關於如何在Swing線程實現後不應觸摸Swing對象的規則。我總是忽略這些規則,但很可能是你在Mac OS下被他們咬了。

作爲正式正確方向的一步,儘量不要做setVisible(),直到你將所有東西組裝起來,即在構造函數的底部。

參考資料:http://www.math.vu.nl/~eliens/documents/java/tutorial/ui/swing/threads.html

+0

真的,真的不要忽視這些規則 - 每個JRE的新版本更多地依賴於Kosher線程。當然是 – 2009-11-06 22:36:38

+0

。照我說的做,不要照我的意思去做! 但我剛剛引用的文件似乎表明,我做這件事的方式畢竟是OK的。說真的,我認爲如果JRE發生變化就會破壞它(即構建GUI,然後在主線程中設置setVisible()),那麼全世界將會有一系列破碎的程序 - 太陽將無法存活這樣的變化:) – 2009-11-06 22:49:09

+0

我們還沒有討論過線程,所以感謝您提供該鏈接。這非常有幫助。 – DiegoFuego 2009-11-07 01:04:51