2016-04-09 6 views
-1

Ich habe class1 und class2. Class1 ist eine Benutzeroberfläche, Klasse2 nimmt Änderungen an der Benutzeroberfläche vor. Class2 ist unten gezeigt.Java: Access-Taste in einer anderen Klasse von Thread

1) Gibt es eine Möglichkeit, die gesamte Klasse 2 zu ermöglichen, Objekte von class1 zu verwenden (JButton btnStartFullBuild, JButton btnShutdownServer, etc)

2) Wie ermögliche ich dem Thread, um die Hintergrundfarbe der Schaltfläche in Class1 zu ändern (mit : btnShutdownServer.setBackground(Color.blue);)

package examples; 
import java.awt.Color; 

import javax.swing.JButton; 

public class Class2 { 

    public static void shutdownServer(JButton btnStartFullBuild, JButton btnShutdownServer) { 
// This works 
     btnShutdownServer.setBackground(Color.blue); 
// This works when passing text, but I cant modify other classes buttons 
     new ThreadTest("Can I modify a button?").start(); 
    } 


} 
class ThreadTest extends Thread { 
    public ThreadTest(String str) { 
     super(str); 
    } 

    public void run() { 
     for (int i = 0; i < 5; i++) { 
      System.out.println("Loop " + i + ": " + getName()); 
      try { 
       sleep((int) (Math.random() * 2000)); 

      } catch (InterruptedException e) { 
      } 
     } 
    } 
} 
+1

Sie sollten das Schwingen wissen absolut nicht fadensicher. Während das, was du tust, vielleicht auch nicht funktioniert, ist es keine gute Idee, es so zu machen. – nhouser9

+0

Ich erkannte, dass ich einen Teil des Codes kopiert hatte, der nicht ausgeführt wurde. Es funktionierte, nachdem ich den Teil des Codes bearbeitet hatte, der tatsächlich ausgeführt wurde (ich habe viele Änderungen vorgenommen) – heyitsmyusername

Antwort

1

Ja, aber Sie wollen wahrscheinlich nicht zu, wie Class2 konnte allerlei böse Dinge tun wollen Sie es nicht zu, wie die Schaltflächen und andere Komponenten entfernen

Eine bessere Lösung wäre die Verwendung einer Observer Pattern, um Class2 zu ermöglichen, Benachrichtigungen zu generieren, auf die interessierte Parteien reagieren können.

Außerdem ist Swing nicht threadsicher. Seien Sie also vorsichtig, wenn Sie versuchen, den Zustand der Benutzeroberfläche außerhalb des EDT-Kontexts zu ändern.

Werfen Sie einen Blick auf Concurrency in Swing, um weitere Informationen und andere mögliche Optionen, wie SwingWorker (die PropertyChange Unterstützung hat)

0

ich mit der vorherige Antwort einig, dass dies nicht die eleganteste Lösung, aber ... es sieht aus wie wäre es möglich, dies zu tun mit SwingUtilities.invokeLater:

// from inside your current run method 
public void run() { 
    for (int i = 0; i < 5; i++) { 
     ... 
    // access button here 
    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      btnShutdownServer.setBackground(Color.blue); 
     } 
    }); 

ich bin kein Swing-Experte, fand hier, um diese Lösung: http://www.javamex.com/tutorials/threads/invokelater.shtml

Verwandte Themen