(Java) erscheinend / Disappearing JLabel in einem JPanel verschwindet nur auf Resize
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?
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.