Java JFrame setTitle不工作

Java JFrame setTitle不工作,java,swing,jframe,jfilechooser,titlebar,Java,Swing,Jframe,Jfilechooser,Titlebar,不确定为什么会发生这种情况,但当我尝试更改JFrame上的标题时,它不会更新。JFrame是静态的,我这样称呼它: Assets.frame.setTitle("test"); 我有一段代码,其中我传入了一个文件名,它似乎可以工作,就像当我打印出Assets.frame.getTitle()时,它打印出我想要的标题一样。但在实际的JFrame上,它不会更改标题。我在程序的其他部分也调用了这个方法,它似乎在那里工作。是否有一些特殊字符会导致方法无法更新我不知道的实际帧 编辑: 我正在尝试做什么(

不确定为什么会发生这种情况,但当我尝试更改JFrame上的标题时,它不会更新。JFrame是静态的,我这样称呼它:

Assets.frame.setTitle("test");
我有一段代码,其中我传入了一个文件名,它似乎可以工作,就像当我打印出
Assets.frame.getTitle()
时,它打印出我想要的标题一样。但在实际的JFrame上,它不会更改标题。我在程序的其他部分也调用了这个方法,它似乎在那里工作。是否有一些特殊字符会导致方法无法更新我不知道的实际帧

编辑:

我正在尝试做什么(打开文件)

Main.setTitle()方法是:

public static void setTitle(String title) {
    Assets.frame.setTitle(title + " - " + "My Program");
}
在程序执行附近定义并实例化框架,按下JButton时调用open方法。这是我在项目中唯一的JFrame,它一直在使用,直到程序退出


我不知道它的重现性有多好,因为当我运行另一个类似的方法时它也会工作,该方法也调用Main.setTitle()。这只是一个不起作用的实例。

确保仅从事件调度线程更新UI。请参见
SwingUtilities.invokeLater()

我正在尝试做什么(打开文件)

然后,也许可以从Swing教程中的部分开始。它将向您展示如何更好地构造您的程序,这样您就不必到处都需要静态变量和方法。您可以下载演示代码并使用它,然后根据需要修改它

然后,在逻辑中,如果要更新框架的标题,则可以使用
SwingUtilities.windowForComponent(…)
方法来获取添加组件的框架


您发布的代码仍然不能帮助我们理解代码的设计或方法调用的上下文,所以为什么不能为您的问题提供具体的答案呢。这就是为什么要求您提供一个“可运行的示例”。但是我建议你先重新构造你的程序。

我的猜测是,你正在更改的帧不是屏幕上的帧。考虑提供一个说明你的问题的方法。这不是一个代码转储,而是您正在做的一个示例,它突出了您所遇到的问题。这将减少混乱和更好的响应
JFrame是静态的,
表明设计不好。通常,您不应该使用静态变量引用应用程序中的组件。
static
static
无处不在<代码>静态不是跨对象通信机制,您应该限制如何使用它。相反,将所需对象的引用传递给其他类,也许可以使用
接口
来限制更改这些其他类可能带来的影响。老实说,我只使用了static,因为我可以使用Tools.open()和Tools.save()在其他类中,我不知道它对我的程序有影响。为什么使用静态方法更新组件是个坏主意?我会尝试重新构造我的程序,使其不包含那么多静态组件,因为我认为它们都是。谢谢大家的建议,我将研究如何正确地构造swing组件。我的建议对这个问题毫无意义,它不会影响结果。我可以用SwingUtilities.invokeLater()?@MadProgrammer将Assets.frame.setTitle()与SwingUtilities包围起来吗?你是说只要open()就没有效果正在从按钮操作事件调用,对吗?i、 事实上,我是说你可以(但不应该)调用EDT外部的
setTitle
,尽管这是一个很好的建议,除非OP有一些线程竞争条件,否则不会有任何区别。我还“暗示”这个问题没有足够的上下文来做出坚定的建议(至少对问题的过程是这样的)。此外,如果有人想知道我是如何解决这个问题的(很抱歉有更多的静态问题),我将setTitle()方法改为((JFrame)(SwingUtilities.windowForComponent(Constants.main))。setTitle(title+“-”+“我的程序”);我将研究SwingUtilities方法,我不知道静态组件是个坏主意。感谢分享您的知识
public static void setTitle(String title) {
    Assets.frame.setTitle(title + " - " + "My Program");
}