2017-07-30 1 views
0

ich etwas bemerkt, dass ich als seltsam es diese folgenden Code sein:Swing-Klasse, JLabel appearence ungewöhnliche

public class QuestionFour extends JFrame { 
    private JTextArea txta1; 
    private JTextField txt1; 
    private JButton btnSort; 
    private JButton btnShuffle; 
    private JButton btnReverse; 
    private JPanel pnl1; 
    private JLabel lbl1; 
    private LinkedList linkedList; 

    public QuestionFour() { 
     super(); 
     this.setLocationRelativeTo(null); 
     this.setSize(500, 200); 
     this.setVisible(true); 
     this.setLayout(new FlowLayout()); 
     txt1 = new JTextField(); // 1 
     lbl1 = new JLabel("Enter a number: "); // 2 
     this.add(lbl1); 
    } 

    public static void main(String args[]) { 
     QuestionFour ob = new QuestionFour(); 
    } 
} 

Das Problem, das wurde vorkommendes, wenn ich den Code der JLabel läuft nicht erscheinen, aber wenn ich Kommentieren Sie die Zeile, in der 1 als Kommentar eingegeben wurde, erscheint JLabel, was ich als ungerade ansehe, da ich das TextField nur instanziiere, es aber nicht dem JFrame hinzufüge.

Kann mir bitte jemand das erklären?

Antwort

0

Möglicherweise ist es eine Anomalie, die durch den Aufruf von setVisible(true) außerhalb des UI-Threads verursacht wird. Versuchen Sie dieses:

public QuestionFour() 
{ 
    setLocationRelativeTo(null); 
    this.setSize(500, 200); 
    setLayout(new FlowLayout()); 
    this.txt1 = new JTextField(); // 1 
    this.lbl1 = new JLabel("Enter a number: "); // 2 
    this.add(this.lbl1); 

    javax.swing.SwingUtilities.invokeLater(() -> setVisible(true)); 
} 

Hinweis: Lesen/Schreibzugriff auf jede UI-Komponente (wie JTextField etc.) muss innerhalb von Event-Dispatching Thread (UI-Thread) erfolgen. SwingUtilities bietet Ihnen bequeme Methoden. Sie sollten auch innerhalb des EDT setVisible() aufrufen.

Ein weiteres Problem war, dass Sie am Anfang setVisible(true) aufrufen und später UI-Komponenten hinzufügen. Dies stellt einen "Schreibzugriff" auf UI-Komponenten dar ("Sie fügen etwas in das Hauptfenster ein"). Ihr Klassenkonstruktor wird nicht innerhalb von EDT ausgeführt. In diesem Fall mussten Sie this.add(this.lbl1) in die Methode SwingUtilities einkapseln. Aber es ist besser, wenn Sie zunächst die gesamte Benutzeroberfläche erstellen und dann sichtbar machen.

Für weitere Informationen über die Swing-Bibliothek und Thread-Sicherheit werfen Sie einen Blick auf diese: https://docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html