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()の結果をコンソールに出力すると、表示されるはずのタイトルが表示されますが、ウィンドウでフォーカスが失われるまで表示されません。

edit2:

それは私の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 );
    }
}

注意すべき点の1つsetTitle()は、イベントディスパッチスレッドで呼び出す必要があることです。

次のようにメソッドを調整すると役立つ場合があります。

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