2012-12-19 57 views
4

我有兩個類,一個AnalogClock類和一個MainInterface類。從其他類更改JFrame的標題

我在AnalogClock類中創建了timeChanged方法,每當時間變化時它都會被調用。我的AnalogClock基本上是一個帶有繪圖的JPanel。在MainInterface中,我設置了一個JFrame並添加了一個我的AnalogClock的對象。

每當'timeChanged'被調用時,是否可以改變我的窗口的標題?我試圖使用getParent()getRootParent(),但他們不承認setTitle()

+2

通過引用'JFrame'並調用'setTitle()' –

+0

哪個類有timeChanged方法? –

+0

@AaronKurtzhals timeChanged是AnalogClock的一種方法,並且謝謝你我會嘗試你的解決方案 – ObAt

回答

5

使用getWindowAncestor方法從SwingUtilities

//This gives you the first Window Object that contains the panel component 
Window window = SwingUtilities.getWindowAncestor(panel); 

//Cast it to JFrame 
JFrame frame = (JFrame) window; 

//Now, change the title 
frame.setTitle("New Title"); 
+0

當我使用下面的代碼時,出現'Type mismatch:can not convert from void to JFrame':JFrame f =((JFrame)SwingUtilities.getWindowAncestor (本))的setTitle(timeToString())。 – ObAt

+1

@ObAt:不要試圖將所有代碼壓縮到一行,特別是在調試時。首先獲取窗口,然後嘗試將其轉換爲另一行上的JFrame,然後在另一行上設置其標題。這樣當發生錯誤時,您可以看到在哪裏以及如何。我猜你的「這個」不是一個Swing compnent,但是誰知道? 1+給rockskull的答案。 –

+0

問題是,'.setTitle(「New Title);'返回void,這是一個小的語法錯誤 - 我會修復它,基本上你不需要設置'f' –

1

最簡單的方法是將JFrame的引用傳遞給JPanel並調用setTitle()。使用getParent(),您將識別返回的Container的正確類型,然後一旦找到JFrame參考,就將其轉換爲setTitle

我通常按照第一個建議來做。

0

這聽起來像timeChanged應該在你的MainInterface類,因爲timeChanged需要引用兩個AnalogClockJFrame。原因是你的AnalogClock可能不應該耦合到你的JFrame