在焦点丢失之前,JFrame标题不会改变

时间:2012-04-08 04:57:20

标签: java swing focus jframe title

基本上我有一个简单文本编辑器的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修复了问题。很抱歉误导了你们,感谢您的回复。

1 个答案:

答案 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) ? "*" : ""));
    }
  });
}