2012-04-08 13 views
1

Grundsätzlich habe ich einen JFrame für einen einfachen Texteditor. Der Dateiname, an dem Sie gerade arbeiten, wird im Titel angezeigt. Also habe ich Code eingerichtet, um den Titel bei Bedarf zu ändern, und es wird gut genannt.JFrame-Titel ändert sich nicht, bis der Fokus verloren ist

Das Problem ist, nachdem der Code aufgerufen wird der JFrame-Titel wird nicht geändert. Die Funktion getTitle() und alles zeigt den Titel als geändert an. Nur wenn Sie den Fokus auf den JFrame verlieren, ändert sich der Titel grafisch.

Eine schnelle und dreckige (sehr viel) Lösung, die ich implementiert habe, war toBack(), gefolgt von toFront(), die Sie effektiv dazu zwingt, den Fokus zu verlieren - und das macht den Trick auf eine sehr hässliche Weise.

Ich habe versucht, invalidate() und validate(), verschiedene repaint() -Aufrufe und setVisible (true) noch keiner von ihnen tun den Trick.

Ich habe ein wenig gesucht und kann keine Lösung finden, es ist ein kleiner Fehler aber ein nerviger. Hat jemand einen Einblick?

Hier ist der Code, den ich verwende

private void() updateTitle() { 
    setTitle(((filename == null) ? "untitled" : filename) + ((unsaved) ? "*" : "")); 
    toBack(); 
    toFront(); 
} 

und das ist alles in einer Klasse, die JFrame erstreckt.

edit:

erwähnenswert, dass es keine Schleifen oder Fäden oder irgendetwas das EDT zu binden. Einfaches und einfaches Zeug. Deaktivieren Sie alle Listener und alles, um zu versuchen, dies zu debuggen. SetTitle wird NOWHERE sonst in dem Programm aufgerufen. Wenn ich es sagen zu der Konsole aus führen die getTitle() mir den Titel, dass sollte angezeigt, aber ist nicht angezeigt, bis Fokus auf das Fenster verloren

edit2:

Es stellt sich heraus Es war nur ein Fehler in meinem jdk. Neuinstallation der jdk behob das Problem. Entschuldige, dass du mich irreführst, und danke für deine Antworten.

+2

* "Erwähnenswert .." * Code lauter als Worte spricht. Um schneller Hilfe zu bekommen, schreiben Sie eine [SSCCE] (http://sscce.org/). –

+0

Wenn Sie Ihre Antwort erhalten haben, akzeptieren Sie sie, indem Sie das Häkchen links neben der Antwort markieren. Ändern Sie den Titel nicht in SOLVED. – MByD

Antwort

4

Dieses einfache Beispiel (nur anrufen setTitle()) arbeitete für mich:

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

Eine Sache, vorsichtig zu sein: Sie sollten setTitle() während auf der Event Dispatch Thread nennen.

Anpassen des Verfahrens wie folgt helfen können:

private void() updateTitle() { 
    SwingUtilities.invokeLater(new Runnable() 
    { 
    @Override 
    public void run() 
    { 
     setTitle(((filename == null) ? "untitled" : filename) + ((unsaved) ? "*" : "")); 
    } 
    }); 
} 
Verwandte Themen