2016-04-25 21 views
1

Innerhalb der Methode actionPerformed einen JButton, habe ich den folgenden Code:Wie man Knopfänderungen macht Repaint -during-Methode, nicht nach?

btnLogin.setText("Logging In..."); 
btnLogin.setPreferredSize(new Dimension(110, 29)); 
btnLogin.setEnabled(false); 

//more stuff here, irrelevant to this 

Dies funktioniert, aber es dauert nur visuelle Wirkung (wird neu gestrichen), sobald das Verfahren abgeschlossen ist.

Wenn ich in dem Bereich // more stuff here Code habe, der lange dauert, werden die Auswirkungen der Änderungen von BtnLogin erst wirksam, wenn dieser Code abgeschlossen ist.

Ich habe versucht, die Eingabe:

this.revalidate(); 
this.repaint(); 

Direkt nach den ersten drei Zeilen und mehreren anderen Lösungen, um zu versuchen, das verdammte Ding zu zwingen, während des Verfahrens neu zu zeichnen, aber egal was passiert, es passiert nur bei das Ende!

Eine andere Sache, die ich bemerkt habe, ist, dass, wenn ich ein JOptionPane in der Mitte der Methode aufrufen, der Rahmen (im Hintergrund) neu streichen wird, so dass das interessant ist.

Was passiert automatisch am Ende der Methode, die ich aufrufen muss, damit es während der Methode geschieht?

Vielen Dank im Voraus!

Antwort

2

Sie blockieren den Swing-Ereignis-Thread mit dem lang laufenden Code, und dies verhindert, dass Swing die Textänderungen zeichnet. Die Lösung:

  • Führen Sie den Code mit langer Laufzeit in einem Hintergrundthread aus, wie z.
  • Aber stellen Sie sicher, dass Sie alle Swing-Aufrufe am Swing-Ereignisthread vornehmen.
  • Lesen Sie das Tutorial Concurrency in Swing, um Details zu den Problemen mit dem Swing-Ereignisthread und Threading zu erfahren.
  • +0

    Wie ändere ich die Schaltflächeneigenschaft, die Zeilen im Swing-Ereignisthread statt im Methodenthread ändert? – Heaney

    +0

    @Heaney: Ich erklärte, was Sie oben tun müssen. –

    +0

    @Heaney: und du ** nimmst ** den Änderungscode für den Swing Event-Thread. Was Sie tun müssen, ist den lang laufenden Code von diesem Thread abzurufen. –