2011-03-17 98 views
0

我有一個擴展JFrame並將兩個Jpanel打包到其上的類,一個是狀態欄JPanel,另一個是contentDisplay Panel。向JFrame添加狀態欄的問題

根據contentDisplay面板中所做的更改,我需要動態更改狀態欄Jpanel中的標籤文本。爲了達到這個目的,我使用下面的代碼爲狀態欄面板創建了一個單獨的類。

public class StatusBar extends JPanel { 
    JLabel status; 
    /** Creates a new instance of StatusBar */ 
    public StatusBar() { 
     super(); 
     status = new JLabel("Ready and Running"); 
     this.add(status);  
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g);    
     g.drawString(status.getText(), 10,10); 
     } 

    public void setMessage(String message) { 
     status.setText("Status : " + message);   
     repaint(); 
    } 
} 

我已創建此類的對象並將其添加到JFrame上。該面板被添加,但是當我在隨後的框架實現中調用setMessage()方法時,消息沒有被重新繪製,即狀態面板沒有刷新狀態消息。我該如何解決這個問題? PS:我不想重新驗證()和重繪()我的父JFrame的每一個狀態的變化。我只是希望狀態面板每次都刷新爲上面的代碼。有沒有辦法做到這一點?

回答

3

你不應該需要paintComponent電話...這應該做到:

public class StatusBar extends JPanel { 
    JLabel status; 

    public StatusBar() { 
     this.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 0)) ; 
     status = new JLabel("Ready and Running"); 
     this.add(status);  
    } 

    public void setMessage(String message) { 
     status.setText("Status : " + message);   
    } 
} 

或許,甚至你可以只使用擴展JLabel

public class StatusBar extends JLabel { 

    public StatusBar() { 
     setMessage("Ready and Running"); 
    } 

    public void setMessage(String message) { 
     setText(message) ;   
    }   
} 
+0

不,我已經試過這個。 setText不起作用,因爲我沒有單獨從JFrame類調用它。我需要在由JFrame使用的不同類中調用setMessage。 如果我這樣做,文本將被設置爲標籤,但它不會顯示在框架上。 – 2011-03-17 08:25:33

+1

當你問這個問題時,你不認爲這種信息會有幫助嗎?請編輯您的問題,儘可能多地提供有關您的實際問題的信息。看起來你的問題與__how__更相關,你正在使用類 – 2011-03-17 08:36:18

+2

@Vamsi,調用setMessage方法無關緊要,這是處理問題的適當方法。如果這不適合你,那麼你的問題實際上是在你的代碼中的其他地方。 – jzd 2011-03-17 11:03:05

0

沒有更新的圖形用戶界面是一類這個tutorial中的一個普遍知道的問題正是解釋到底是什麼導致了你的問題。