【问题标题】:Change Title of JFrame from other Class从其他类更改 JFrame 的标题
【发布时间】:2012-12-07 03:06:05
【问题描述】:

我有两个类,一个 AnalogClock 类和一个 MainInterface 类。

我在 AnalogClock 类中创建了一个timeChanged 方法,它会在时间改变时被调用。我的 AnalogClock 基本上是一个带有绘图的 JPanel。在 MainInterface 中,我设置了一个 JFrame 并添加了一个我的 AnalogClock 对象。

是否可以在调用“timeChanged”时更改我的窗口标题?我尝试使用getParent()getRootParent(),但它们无法识别setTitle()

【问题讨论】:

  • 传递对JFrame的引用并调用setTitle()
  • 哪个类有timeChanged方法?
  • @AaronKurtzhals timeChanged 是 AnalogClock 的一种方法,谢谢我会试试你的解决方案

标签: java swing jframe jpanel titlebar


【解决方案1】:

最简单的方法是将JFrame 的引用传递给JPanel 并调用setTitle()。使用getParent(),您将识别返回的Container 的正确类型,然后在找到JFrame 引用后,将其转换为它并调用setTitle

我通常按照第一个建议去做。

【讨论】:

    【解决方案2】:

    使用来自SwingUtilitiesgetWindowAncestor 方法。

    //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");
    

    【讨论】:

    • 当我使用此代码时,我收到此错误“类型不匹配:无法从 void 转换为 JFrame”:JFrame f = ((JFrame) SwingUtilities.getWindowAncestor(this)).setTitle(timeToString()) ;
    • @ObAt:不要试图将所有代码压缩到一行,尤其是在调试时。首先获取 Window,然后尝试在另一行将其强制转换为 JFrame,然后在另一行设置其标题。这样,当发生错误时,您可以看到错误发生的位置和方式。我猜你的 this 不是 Swing 组件,但谁知道呢? 1+ 对rockskull 的回答。
    • 问题是 .setTitle("New Title); 返回 void。这是一个小的语法错误 - 我会修复它。基本上你不需要设置f
    • 好的。我不应该把所有东西都放在一条线上。我一直在使用 ruby​​,这有点像。我已经编辑了代码。
    • 我应该用什么替换“面板”?
    【解决方案3】:

    听起来timeChanged 应该在您的MainInterface 类中,因为timeChanged 需要同时引用AnalogClockJFrame。原因是您的AnalogClock 可能不应该与您的JFrame 耦合。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-07
      • 2020-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-16
      相关资源
      最近更新 更多