NeedHelp -Java Programmierung

08/25/2012 17:35 Ap0kalyps3#1
Heyho Leute.. ich bräuchte mal eure Hilfe..

Ich habe zwei Klassen.. eine Hauptklasse, in der ein GUI erzeugt wird und eine Klasse, die in der Hauptklasse als Objekt benutzt wird.

Dieses Obejekt ist Runnable und wird als Thread gestartet.


Nun soll aber der Thread aus der run() Methode heraus im GUI etwas verändern..



ich komm überhaupt nichmehr weiter..
Invoke & so bekomm ich nur hin, wenn der Thread direkt in der Klasse definiert wird (also die run() Methode in der Klasse ist -), wo auch der die das GUI ist...


Wär echt cool, wenn mir wer helfen könnte ... :/

Liebe Grüße.
08/25/2012 19:07 Obilee#2
GUI Änderungen in nem Thread müssen über den EDT laufen:
[Only registered and activated users can see links. Click Here To Register...]

[Only registered and activated users can see links. Click Here To Register...]

Code wär auch gut
08/25/2012 19:16 Ap0kalyps3#3
Hab mal eben das für den Sachverhalt unwichtige rausgeworfen..

PHP Code:
    private JTextPane chatPaneinputPane;
    private 
JScrollPane chatScrollPane;
....
    private 
MessageReceiver receiver;

public 
ChatWindow(String username) {
        ...
        
chatPane = new JTextPane();
        
chatScrollPane = new JScrollPane(chatPane);
        
inputPane = new JTextPane();
        
        
receiver = new MessageReceiver(NETWORK_GROUPNETWORK_GROUP_PORTCLIENT_MULTICAST_PORT);

        .....
                
// Das ganze Design gedöns.. / GUI erstellung

        
.....
        
        
Thread t = new Thread(receiver);
        
t.run();
    } 


PHP Code:
public class MessageReceiver implements Runnable {

    private 
String NETWORK_GROUP;
    private 
int NETWORK_GROUP_PORTCLIENT_MULTICAST_PORT;
    
    private 
MulticastSocket socket;
    private 
InetAddress group;
    
    public 
MessageReceiver(String NETWORK_GROUPint NETWORK_GROUP_PORTint CLIENT_MULTICAST_PORT) {
     ....
    }
    
    @
Override
    
public void run() {
          
        .....
        
        while(
true) {
            
            
            try {
                
                .....
                                
Hier werden Nachrichten über den NetworkStream empfangen verarbeitet.. Textnachrichten sollen dann in der Klasse oben im GUI angezeigt werden...
                
                
            } catch (
IOException e) {
                
e.printStackTrace();
            }
        }
    }
    

08/25/2012 19:49 Obilee#4
Du weißt also nicht wie du auf die GUI Elemete zugreifst ja ? Dann mach das GUI element was du ansprechen willst public static bzw. extra static methoden wodurch du aus anderen klassen auf die gui elemente zugreifen kannst.

PHP Code:
private static JTextPane chatPaneinputPane;

//bla code

public static void setInputPaneText(String txt) {
inputPane.setText(txt);


PHP Code:
 @Override 
    
public void run() { 
           
        ..... 
         
        while(
true) { 
             
             
            try { 
                 
            
GUIKlasse.setInputPaneText("der text der dahin soll");
                 
            } catch (
IOException e) { 
                
e.printStackTrace(); 
            } 
        } 
    } 
So ist es aber nicht ganz Threadsicher, dafür gibts den Swingworker.
08/25/2012 19:52 Ap0kalyps3#5
Quote:
Originally Posted by Obilee View Post
Du weißt also nicht wie du auf die GUI Elemete zugreifst ja ? Dann mach das GUI element was du ansprechen willst public static bzw. extra static methoden wodurch du aus anderen klassen auf die gui elemente zugreifen kannst.

PHP Code:
private static JTextPane chatPaneinputPane;

//bla code

public static void setInputPaneText(String txt) {
inputPane.setText(txt);


PHP Code:
 @Override 
    
public void run() { 
           
        ..... 
         
        while(
true) { 
             
             
            try { 
                 
            
GUIKlasse.setInputPaneText("der text der dahin soll");
                 
            } catch (
IOException e) { 
                
e.printStackTrace(); 
            } 
        } 
    } 
So ist es aber nicht ganz Threadsicher, dafür gibts den Swingworker.

Okayy.. danke.. aber mal rein interessenhalber..
Könnte man auch einfach das Objekt des ChatWindows als Parameter an den Thread mit übergeben & darüber dann den Text setzen? Ohne stataic voids, sondern mit normalen publics?

Wenn ja, wo liegen da vor & Nachteile bzw. warum macht man das (nicht) so? ^^


Bin noch ziemlicher Java Newbii.. aber ich sag mal, learning by doing & so..
08/26/2012 09:34 Obilee#6
Es würd eher Sinn machen deine nicht GUI Klasse als private Klasse in der GUI Klasse zu deklarieren.

Dein Vorschlag würde auch gehen aber praktisch macht es niemand so. Vor- und Nach-teile kann ich dir jetzt auch nicht aufzählen bin nicht der Threading-experte.
08/26/2012 12:19 dowhile#7
Quote:
Dein Vorschlag würde auch gehen aber praktisch macht es niemand so.
Wieso? Bei vielen Implementierungen des MVC-Patterns wird das View auch via DI dem Controller übergeben, und er macht im Grunde nichts anderes.

Wenn er seine Thread-Klasse in seine GUI-Klasse packt, ist beides fest miteinander verbunden. Wenn er der Thread-Klasse eine Instanz seiner GUI-Klasse übergibt, ist die GUI komplett austauschbar (sofern er noch ein entsprechendes Interface einführt).
Ich finde das toll, wobei ich, was Java / Threads / OOP angeht, auch kein Experte bin.