2012-12-19 58 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