基本上我有一个简单文本编辑器的JFrame。 您正在处理的文件名出现在标题中。 所以我设置了一些代码来在必要时更改标题,它被称为罚款。
问题是在调用代码后JFrame标题不会改变。 getTitle()函数和所有内容都显示标题已更改。只有当你把焦点放在JFrame上时,标题实际上才会以图形方式改变。
我实现的一个快速而肮脏(非常如此)的修复是toBack()后跟toFront()有效地迫使你失去焦点 - 这就是以非常丑陋的方式完成这个伎俩。
我已经尝试过invalidate()和validate(),各种repaint()调用和setVisible(true),但是没有人能够做到这一点。
我已经做了一些搜索,似乎无法找到解决方案,这是一个小错误但是很烦人。有没有人有一些见解?
这是我使用的代码
private void() updateTitle() {
setTitle(((filename == null) ? "untitled" : filename) + ((unsaved) ? "*" : ""));
toBack();
toFront();
}
这就是扩展JFrame的类。
编辑:
值得一提的是没有循环或线程或任何东西捆绑EDT。简单明了的东西。禁用所有侦听器以及尝试调试此操作的所有内容。 SetTitle在程序中被称为NOWHERE else。如果我将getTitle()结果打印到控制台,它将告诉我应该显示的标题,但是不会显示,直到焦点在窗口上丢失
EDIT2:
事实证明这只是我的jdk中的一个错误。重新安装jdk修复了问题。很抱歉误导了你们,感谢您的回复。
答案 0 :(得分:4)
这个简单的例子(只是调用setTitle()
)对我有用:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
public class Frame2
{
public static void main( String[] args )
{
final JFrame frame = new JFrame( );
JButton button = new JButton( "press me" );
button.addActionListener( new ActionListener( )
{
@Override
public void actionPerformed( ActionEvent e )
{
frame.setTitle( "New Title" );
}
} );
frame.setTitle( "Title" );
frame.add( button );
frame.setSize( 400, 400 );
frame.setVisible( true );
}
}
要注意的一件事是:您应该在Event Dispatch Thread上致电setTitle()
。
按如下方式调整方法可能会有所帮助:
private void() updateTitle() {
SwingUtilities.invokeLater( new Runnable()
{
@Override
public void run( )
{
setTitle(((filename == null) ? "untitled" : filename) + ((unsaved) ? "*" : ""));
}
});
}