Frage

Ich arbeite in Java, und ich habe eine JPanel in einem JFrame. In diesem JPanel, unter anderem habe ich ein JLabel, die ich nach Belieben erscheinen und verschwinden machen will. Ich habe versucht, die Sichtbarkeit zu Wahr / Falsch-Einstellung, das Hinzufügen und aus dem JFrame und JPanel zu entfernen und, online angesehen zu haben, habe ich versucht validate () ing und revalidate () ing ad infinitum. Was hier getan werden kann, um dieses Problem zu lösen?

War es hilfreich?

Lösung

Im Allgemeinen ist die setVisible Aufruf der Methode ist ausreichend, um eine Swing-Komponente zu machen oder ausgeblendet werden.

Nur um sicher zu sein, dass es funktioniert, habe ich versucht, die folgenden:

public class Visibility {
  private void makeGUI() {
    JFrame f = new JFrame();
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    final JLabel l = new JLabel("Hello");
    final JButton b = new JButton("Hide Label");
    b.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        l.setVisible(false);
      }
    });

    f.getContentPane().setLayout(new BorderLayout());
    f.getContentPane().add(l, BorderLayout.CENTER);
    f.getContentPane().add(b, BorderLayout.SOUTH);
    f.setSize(200, 200);
    f.setLocation(200, 200);
    f.validate();
    f.setVisible(true);
  }

  public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
      public void run() {
        new Visibility().makeGUI();
      }
    }); 
  }
}

Das obige Programm ist in der Lage, die Sichtbarkeit zu beeinflussen, indem sie auf einem JButton klicken.

Könnte es ein Threading-Problem sein?

Mein nächster Verdacht war, dass vielleicht ein Thread die nicht auf der Event Dispatch Thread (EDT ) eine schlechte Sache ist, wie Schaukel nicht Thread-sicher ist. Ich war ein wenig überrascht, es hat funktioniert, und die Tatsache, dass es funktioniert, kann nur ein Zufall sein.

Repaint die JPanel?

Wenn die Sichtbarkeit des JLabel nur auf Größenänderung betroffen ist, bedeutet dies wahrscheinlich, dass der JLabel nur gezogen wird, wenn der JPanel neu gestrichen wird.

Eine Sache, zu versuchen, die der JPanel nennen repaint Methode, um zu sehen, ob die Sichtbarkeit des JLabel wird sich ändern.

Aber diese Methode scheint nur ein Pflaster auf eine Situation zu, wenn die Hauptursache aufgrund eines Thread ist aus dem EDT versucht, Änderungen an die GUI zu machen. (Nur als Anmerkung, die repaint Methode ist Thread-sicher, so kann es durch off-EDT Threads aufgerufen werden, aber auf repaint Berufung ist eine Abhilfe als eine Lösung.)

Versuchen Sie es mit SwingUtilities.invokeLater

Schließlich wahrscheinlich das, was ich versuchen würde, ist die Lektion: Concurrency in Swing von der Java-Tutorials , um weitere Informationen, um herauszufinden, wie Multi-threaded mit Swing-Code schreiben gut verhalten.

Andere Tipps

setVisible () oder das Entfernen es sollte funktionieren, stellen Sie sicher, dass Sie es aus dem Event Dispatch Thread obwohl tun. Es gibt Hilfsmethoden in Eventqueue für die Blöcke in diesem Thread ausgeführt wird.

http: / /helpdesk.objects.com.au/java/how-do-i-update-my-gui-from-any-thread

Sie müssen revalidate () aufzurufen, auf den Eltern JPanel, wenn Sie seine Komponenten müssen neu angelegt werden.

Wenn Sie ein Beispiel veröffentlichen können, die das Problem zeigt, kann ich für Sie einen Blick an ihm haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top