2012-04-08 38 views
1

基本上我有一個簡單的文本編輯器的JFrame。 您正在處理的文件名出現在標題中。 所以我設置了一些代碼來在必要時更改標題,並且它被調用的很好。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。如果我打印的getTitle()導致到控制檯,它會告訴我的標題是應該顯示,但不是顯示,直到焦點在窗口上失去

EDIT2:

原來這只是我的JDK中的一個錯誤。重新安裝jdk解決了這個問題。抱歉誤導你們,謝謝你們的迴應。

+2

*「值得一提的。」 *代碼勝於雄辯。爲了更快地獲得更好的幫助,請發佈[SSCCE](http://sscce.org/)。 – 2012-04-08 08:32:05

+0

如果您已得到答案,請接受答案,方法是在答案左側打勾,不要將其標題更改爲已解決。 – MByD 2012-04-08 15:50:29

回答

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