2012-07-14 54 views
4

我不像我想的那樣理解Java GUI。在我的畫框方法中,我想擦掉所有當前的按鈕,然後添加新的按鈕。 (總體目標是有一個界面,用戶可以看到角色並點擊按鈕下載與角色相關的文檔,因爲每個角色都不同,當用戶從我的列表中選擇一個新用戶時,一組新的文檔和按鈕將可供他們使用。)在重新繪製方法中在GUI中添加組件

這是一個測試框架,我剛剛寫道,顯示事情橫向。它有我在實際的程序中使用類似的範例,沒有太多雜亂:

public class GUITest extends JFrame 
{ 

/** 
* @param args 
*/ 
public static void main(String[] args) 
{ 
    Container gui_test = new GUITest(); 

} 

private JComponent content = null; 

public GUITest() 
{ 
    super(); 

    setVisible(true); 
} 

public void paint(Graphics g) 
{ 
    this.removeAll(); 

    content = new JPanel(); 

    JComponent test_button = new JButton("New Button 1"); 
    JComponent button = new JButton("New Button 2"); 

    content.add(button); 
    content.add(test_button); 

    this.add(content); 

    super.paint(g); 
} 

} 

沒有調用的removeAll()按鈕將繼續在JPanel的頂部拋出,但與呼​​叫,沒有出現。我不知道這是爲什麼,因爲我正在添加組件,對吧?

編輯
明白了,讓我給你一個更詳細的分類。客戶通過在西面板上查看遊戲中的角色列表來導航我的程序。他們可以從列表中選擇一行,在東面顯示字符細節。細節是一個圖像和描述。最近,我添加了該特定字符的相關文件,該文件將顯示在東面板的底部。我創建了密鑰監聽器,因此客戶端可以通過按下一個數字鍵快速查看文檔,但我也希望讓他們能夠點擊該按鈕來啓動pdf視圖並查看文檔的內容。

由於每個字符都有不同的相關文檔和不同數量的文檔,我每次都重新繪製按鈕,以反映相關文檔的數量和文檔的適當標題。這是重繪出現奇怪的地方。你給了我一個很好的錯誤解釋,但我不知道如何讓客戶端訪問文檔,除了繪製文檔的描述以及啓動它所需的熱鍵。那有意義嗎?

+2

我可以建議您閱讀http://docs.oracle.com/javase/tutorial/uiswing/&http://docs.oracle.com/javase/tutorial/2d/index.html(瞭解更多信息看看引擎蓋下) – MadProgrammer 2012-07-14 02:07:53

回答

7

從來沒有將組件添加到您的GUI或刪除paint或paintComponent方法中的組件。只是不要這樣做。永遠。期。

這些方法僅用於繪圖,並且需要儘可能快,否則您的程序將顯示無響應。不僅如此,您還沒有完全控制何時甚至是否會調用這些方法,因此程序邏輯和結構不應用於這些方法。

而是使用事件偵聽器(如ActionListeners,ListSelectionListeners或帶有鍵綁定)對用戶事件做出反應。

編輯
關於

明白了,讓我給你一個更詳細的分類。客戶通過在西面板上查看遊戲中的角色列表來導航我的程序。他們可以從列表中選擇一行,在東面顯示字符細節。細節是一個圖像和描述。最近,我添加了該特定字符的相關文件,該文件將顯示在東面板的底部。我創建了密鑰監聽器,因此客戶端可以通過按下一個數字鍵快速查看文檔,但我也希望讓他們能夠點擊該按鈕來啓動pdf視圖並查看文檔的內容。

我會使用JList來保存左側的可選信息列表,並會用ListSelectionListener對它做出反應。在聽衆中,我會更改相關的顯示信息。我也避免在Swing中使用KeyListeners,而是傾向於使用Key Bindings,因爲它們在聚焦方面更加靈活並且不那麼刻板。

關於

由於每個字符都有不同的相關文檔和不同數量的文檔,我粉刷的按鈕每一次,以反映相關的文檔,爲文檔的相應職稱的量。這是重繪出現奇怪的地方。你給了我一個很好的錯誤解釋,但我不知道如何讓客戶端訪問文檔,除了繪製文檔的描述以及啓動它所需的熱鍵。那有意義嗎?

我不確定你在做什麼,或者你在做什麼。

+0

謝謝!這很有意義,因爲瘋狂的東西正在發生,就像按鈕有時會出現,而不是其他的。在這種情況下,有什麼選擇? – Sal 2012-07-14 00:32:37

+0

我確實擁有可以打開文檔而不必點擊按鈕的按鍵偵聽器,但我應該如何讓客戶端能夠點擊某個按鈕或類似對象?我是否選擇了糟糕的設計?或者,是否有適合這種情況的「輕量級」組件? – Sal 2012-07-14 00:35:17

+1

@Sal:請給出更多細節。我不完全理解你的問題,只是你的程序有什麼困難。 – 2012-07-14 00:36:04

3

由於每個字符都有不同的相關文檔和不同數量的文檔,我每次重新繪製按鈕以反映相關文檔的數量和文檔的適當標題。這是重繪出現奇怪的地方。你給了我一個很好的錯誤解釋,但我不知道如何讓客戶端訪問文檔,除了繪製文檔的描述以及啓動它所需的熱鍵。那有意義嗎?

因此,「繪製」按鈕,爲什麼不改變那裏的文本(setText(...))。

當用戶選擇「字符」。您將需要重建屏幕的某些部分。更改列表模型(如上所示),並刪除/添加文檔容器上所需的任何按鈕。