1

基本上我有一个用于简单文本编辑器的 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 在程序中的其他地方被调用。如果我将 getTitle() 结果打印到控制台,它会告诉我应该显示的标题,但直到焦点在窗口上丢失时才会显示

编辑2:

事实证明这只是我的 jdk 中的一个错误。重新安装jdk解决了这个问题。很抱歉误导了大家,感谢您的回复。

4

1 回答 1

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 );
    }
}

需要注意的一件事:您应该setTitle()Event Dispatch Thread上调用。

如下调整您的方法可能会有所帮助:

private void() updateTitle() {
  SwingUtilities.invokeLater( new Runnable()
  {
    @Override
    public void run( )
    {
      setTitle(((filename == null) ? "untitled" : filename) + ((unsaved) ? "*" : ""));
    }
  });
}
于 2012-04-08T05:12:18.727 回答