# Client Server Anwendung - Mehrere Clients in einer Server GUI



## jabbaDUH (4. Mai 2010)

Hallo Forum,

dies mein erster Thread in Sachen Java und ich würde mich freuen, wenn Ihr mir helfen könntet 

Zu beginn erst einmal eine kleine Übersicht:
Ich möchte eine Client/Server Applikation in Eclipse realisieren. Der Client soll sich zum Server verbinden und ihm in regelmäßigen Abständen Informationen senden.

Auf Konsolenebene funktioniert das ganze auch schon ganz gut. Der Client verbindet sich, der Server empfängt und gibt die Informationen auf der Konsole aus. Auch mehrere Clients können sich verbinden, alles kein Problem.

Nun möchte ich für den Server eine GUI schreiben. Es sollten in einem Fenster die Werte der Clients als JProgressbar dargestellt werden (JProgressbar als dynamisches Diagramm missbraucht  )

Soweit so gut. Verbindet sich nun ein Client, wird auch eine GUI erzeugt. Verbindet sich jedoch ein weiterer, wird erneut eine GUI erzeugt. Warum das so ist verstehe ich auch. Nur möchte ich nun diese beiden Jframes zusammenpacken. Das gelingt mir nun seit 3 Tagen nicht...

Hier erstmal der Quelltext des Servers:


```
package Client_Server;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.StringTokenizer;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import java.awt.BorderLayout;
import java.awt.Container;

public class Server extends JFrame implements Runnable {
	
	private static final long serialVersionUID = 1L;
	
	Socket socket;
	BufferedReader server_in;
	String s;
	int link, maxlink;
	JProgressBar statusBar;
	JTextArea textArea;
	
	
	public Server(Socket s) {
		socket = s;
	
	}
	
	public void run() {
		
		System.out.println("Server - connection started to "
				+ socket.getInetAddress());
		
		String str;
		
		try {
			
			server_in = new BufferedReader(new InputStreamReader(socket
					.getInputStream()));
			
			while ((s = server_in.readLine()) != null) {
				
//SCHNIPP
//Client Nachrichten bearbeiten
//SCHNAPP
				System.out.println("max link: " + maxlink);
				System.out.println("link: " + link);
				
				textArea.append("maxlink:" + maxlink + "\n");
				statusBar.setMaximum(maxlink);
				statusBar.setValue(link);
				
			
				
			}
			
			server_in.close();
			
		} catch (Exception e) {
			System.out.println("Server " + e);
		}
		
		try {
			socket.close();
			System.out.println("socket closed");
		} catch (Exception e) {
		}
		System.out.println("Server - connection closed.");
	}
	
	public void create_gui() {
		//TestGUI
		JLabel nachrichtenLabel;
		
		
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setSize(150, 200);
		setTitle("Monitor");
		
		Container cp = getContentPane();
		cp.setLayout(new BorderLayout());
		
		statusBar = new JProgressBar(0, 100);
		statusBar.setValue(0);
		statusBar.setStringPainted(true);
		
		nachrichtenLabel = new JLabel("empfangene Nachrichten:");
		cp.add(nachrichtenLabel, BorderLayout.NORTH);
		cp.add(statusBar, BorderLayout.SOUTH);
		textArea = new JTextArea("", 1, 1);
		textArea.setLineWrap(true); 
		textArea.setEditable(false);
		cp.add(textArea, BorderLayout.CENTER);
		cp.add(new JScrollPane(textArea), BorderLayout.CENTER);
		
		setVisible(true);
		
	}
	

	
	private void update_gui() {
		
		//Hier eventuell die GUI neu zeichnen?
		
	}
	public static void main(String[] args) {
		
		ServerSocket server = null;
		Socket s = null;
		Server myServer = null;
		Thread t;
		
		try {
			server = new ServerSocket(1234);
			
			while (true) {
				s = server.accept();
				myServer = new Server(s);
				myServer.create_gui();
				//myServer.update_gui();
				t = new Thread(myServer);
				t.start();
				
			}
			
		} catch (Exception e) {
			System.out.println("ServerMain " + e);
		}
		try {
			server.close();
			
		} catch (Exception ex) {
		}
	}


	
}
```


----------



## Michael... (4. Mai 2010)

Mal abgesehen von Sinn und Unsinn einer Serversoftware eine GUI zu verpassen, erzeugst Du ja mit jeder Anmeldung eines Clients ein neues Objekt vom Typ Server und somit eine neue GUI


jabbaDUH hat gesagt.:


> [JAVA==121]while (true) {
> s = server.accept();
> myServer = new Server(s);[/code]


Wenn dann wäre es doch besser die Clients bzw. die darzustellenden Infos in einer Liste zu halten und z.B. in einer JList anzuzeigen.


----------



## jabbaDUH (4. Mai 2010)

Hallo Michael...

Genau das ist mein Problem. Ich weiß schon, warum ich immer eine neue GUI bekomme. Ich hab schon versucht nicht immer ein neues Objekt vom Server zu erstellen, nur dann funktioniert meine Verbindung nicht mehr. 
Ich hatte eigentlich gedacht, dass es auch reichen würde nur den Socket in einen Thread zu packen. Aber das kriege ich nicht hin.

Wie genau meinst du das mit einer liste?


----------



## Michael... (4. Mai 2010)

jabbaDUH hat gesagt.:


> Wie genau meinst du das mit einer liste?


z.B. die relevanten Information/Objekte in einer ArrayList speichern.

Oder wie in folgendem BspCode in einem Model (hier konkret DefaultListModel). 
Der ganze Code ist ein bisschen komprimiert, ich hoffe es wird trotzdem deutlich. Entscheidend ist die Klasse Server (ab Zeile 25) und deren innere Klasse GUI (Zeile 58 bis 83), der Rest drumrum ist nur zu Demozwecken, die Clients senden in zufälligen Abständen Ihren Status (0 bis 100)

```
import java.awt.*;
import java.io.*;
import java.net.*;

import javax.swing.*;

public class ServerClientDemo {
	
	public ServerClientDemo() {
		new Thread(new Runnable() {
			public void run() {
				new Server().start();
			}
		}).start();
		System.out.println("Server started");
		for (int i=0; i<10; i++) {
			try {
				Thread.sleep((long)(Math.random()*2000));
				new Client().start();
				System.out.println("Client started");
			} catch (Exception e) {e.printStackTrace();}
		}
	}
	
	class Server {
		private GUI gui;
		private int clientIndex;
		private Socket socket;
		
		public void start() {
			gui = new GUI();
			clientIndex = 0;
			try {
				ServerSocket serverSocket = new ServerSocket(5555);
				while (true) {
					socket = serverSocket.accept();
					gui.addClient();
					new Thread(new Runnable() { //Thread zum Empfangen der Statusmeldungen
						private int index = clientIndex++;
						private int status = 0;
						public void run() {
							try {
								BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
								String in;
								while ((in = reader.readLine()) != null)
									Server.this.setStatus(index, Integer.parseInt(in));
							} catch (Exception exc) {exc.printStackTrace();}
						}
					}).start();
				}
			} catch (Exception exc) {exc.printStackTrace();}
		}
		
		public void setStatus(int i, int status) {
			gui.setStatus(i, status);
		}
		
		class GUI extends JFrame {
			private DefaultListModel model;
			
			public GUI() {
				JList list = new JList(model = new DefaultListModel());
				list.setCellRenderer(new DefaultListCellRenderer() {
					private JProgressBar bar = new JProgressBar();
					public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
						bar.setValue(Integer.parseInt(value.toString()));
						return bar;
					}
				});
				this.getContentPane().add(new JScrollPane(list));
				this.setBounds(0, 0, 200, 200);
				this.setLocationRelativeTo(null);
				this.setVisible(true);
			}
			
			public void addClient() {
				model.addElement(0);
			}
			
			public void setStatus(int index, int status) {
				model.setElementAt(status, index);
			}
		}
	}
	
	class Client {
		public void start() throws Exception, IOException {
			final Socket socket = new Socket("127.0.0.1", 5555);
			final PrintWriter writer = new PrintWriter(socket.getOutputStream());
			new Thread(new Runnable(){
				int status = 0;
				public void run() {
					while(status <= 100) {
						try {
							Thread.sleep((long)(Math.random()*5000));
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
						writer.println(status);
						writer.flush();
						status +=10;
					}
				}
			}).start();
		}
	}

	public static void main(String[] args) {
		new ServerClientDemo();
	}
}
```


----------



## jabbaDUH (4. Mai 2010)

Michael..., du bist der Größte :toll:

danke schon mal soweit, da wäre ich im Leben nicht drauf gekommen. :noe: 

Ich habe das von dir Gegebene nun soweit verfeinert, dass ich den vom Client gelieferten Wert "link" als Wert (value) der ProgressBar setzen kann. Nun möchte ich aber bei der Progressbar auch den maxWert ändern (da sich der von Client zu Client unterscheiden kann). 




```
class Server {
	private GUI gui;
	private int clientIndex;
	private Socket socket;
	
	public void start() {
		gui = new GUI();
		clientIndex = 0;
		try {
			ServerSocket serverSocket = new ServerSocket(5555);
			while (true) {
				socket = serverSocket.accept();
				gui.addClient();
				new Thread(new Runnable() { // Thread zum Empfangen der
											// Statusmeldungen
							private int index = clientIndex++;
							
							
							public void run() {
								try {
									StringTokenizer t = null;
									String str;
									int link, maxlink;
									BufferedReader reader = new BufferedReader(
											new InputStreamReader(socket
													.getInputStream()));
									String in;
									while ((in = reader.readLine()) != null){
									System.err.println("SERVER GETS: before" + in);
									t = new StringTokenizer(in);
									str = t.nextToken("|");
									link = Integer.parseInt(str);
									System.err.println("SERVER GETS: link after" + link);
									str = t.nextToken().substring(1);
									maxlink = Integer.parseInt(str);
									
									System.err.println("SERVER GETS: maxlink after" + maxlink);
										//Server.this.setStatus(index, Integer.parseInt(in));
										Server.this.setStatus(index, link);
									}
								} catch (Exception exc) {
									exc.printStackTrace();
								}
							}


							
								
								
							
						}).start();
			}
		} catch (Exception exc) {
			exc.printStackTrace();
		}
	}
	
	public void setStatus(int i, int status) {
		gui.setStatus(i, status);
	}
}



class Client {
    public void start() throws Exception, IOException {
        final Socket socket = new Socket("127.0.0.1", 5555);
        //final PrintWriter writer = new PrintWriter(socket.getOutputStream());
        
        new Thread(new Runnable(){
            int status = 0;
            public void run() {
            	Monitor m = new Monitor();
    			String maxlink = null;
				try {
					maxlink = m.max_link();
					
				} catch (FileNotFoundException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
                while(true) {
                    try {
                    	PrintWriter client_out = null;
                    	
                        Thread.sleep((long)(Math.random()*5000));
                        
                        System.out.println("Server " + socket.getInetAddress()
        						+ " reads hardware information.");
        				
        				client_out = new PrintWriter(socket.getOutputStream(), true);
        				client_out.println(m.signal() + "|" + maxlink);
        				//System.out.println(m.signal() + "|" + maxlink);
                    
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
                    //client_out.println(status);
                    //client_out.flush();
                    status +=10;
                }
            }
        }).start();
    }
}


class GUI extends JFrame {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private DefaultListModel model;
	
	public GUI() {
		JList list = new JList(model = new DefaultListModel());
		list.setCellRenderer(new DefaultListCellRenderer() {
			
			private static final long serialVersionUID = 1L;
			
			private JProgressBar bar = new JProgressBar();
			
			public Component getListCellRendererComponent(JList list,
					Object value, int index, boolean isSelected,
					boolean cellHasFocus) {
				System.err.println("GUI GETS:" + value);
				bar.setValue(Integer.parseInt(value.toString()
				//bar.setMaximum(maxlink);	<-------- genau hier komme ich nicht an den MaxLink	
				
				));
				return bar;
			}
		});
		this.getContentPane().add(new JScrollPane(list));
		this.setBounds(0, 0, 200, 200);
		this.setLocationRelativeTo(null);
		this.setVisible(true);
	}
	
	public void addClient() {
		model.addElement(0);
	}
	
	public void setStatus(int index, int status) {
		model.setElementAt(status, index);
	}
}
```

Kannst du mir hier noch auf die Sprünge helfen?

Thomas


----------



## jabbaDUH (5. Mai 2010)

Ich bins nochmal.. die Geschichte mit der ProgressBar hat sich erledigt  

Nur blick ich durch den QT von dir nicht 100%ig durch... wie krieg ichs nu zb hin, vor jeder ProgressBar n Label zu platzieren? Außerdem würde ich gerne einen ActionListener implementieren, der beim Klick auf die Progressbar ein neues Fenster öffnet, um zusätzliche Informationen zum Client anzuzeigen?

Danke schon mal =)

MFG Thomas


----------



## Meru (5. Mai 2010)

Also wenn du noch ein JLabel voranschreiben willst, dann würde ich ggf eine Tabelle statt eine JList nehmen.
Du kannst natürlich dem Renderer sagen, dass du nicht die Bar angezeigt haben willst, sondern ein JPanel, auf dem links ein Label ist und rechts die Bar, aber ist vielleicht etwas unschön. Hast dann aber den Nachteil, dass je nach länge des vorangestellten Labels die Bar verschiebt, sprich, sie sind nicht mehr alle exakt untereinander. Man kann da zwar wieder mit LayoutManager arbeiten, aber das ist in meinen Augen zu sehr wirwa.

Einen ActionListener kann man nicht an eine JList ranhängen, jedoch einen MouseListener oder aber einen ListSelectionListener.
Bei einem MouseListener kannst du den Clickcount abfragen (also Doppelklick oder so) und dann von der Liste den aktuell selektierten Index auslesen.
Bei einem ListSelectionLister wird jedesmal ein Event ausgelöst, sobald sich die Selektion ändert, also auch bei einem einfach Klick. Da hast du also nicht die Möglichkeit, erst dann das Popup zu öffnen, wenn du einen Doppelklick gemacht hast.

Aber hier mal die Variante, die das Problem zeigt (Mit Label und Bar in einer JList):
[Java]
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

import javax.swing.DefaultListCellRenderer;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;

public class ServerClientDemo {

	public ServerClientDemo() {
		new Thread(new Runnable() {
			public void run() {
				new Server().start();
			}
		}).start();
		System.out.println("Server started");
		for (int i = 0; i < 10; i++) {
			try {
				Thread.sleep((long) (Math.random() * 2000));
				new Client().start();
				System.out.println("Client started");
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	class Server {
		private GUI		gui;
		private int		clientIndex;
		private Socket	socket;

		public void start() {
			gui = new GUI();
			clientIndex = 0;
			try {
				ServerSocket serverSocket = new ServerSocket(5555);
				while (true) {
					socket = serverSocket.accept();
					gui.addClient();
					new Thread(new Runnable() { // Thread zum Empfangen der
												// Statusmeldungen
								private int	index	= clientIndex++;
								private int	status	= 0;

								public void run() {
									try {
										BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
										String in;
										while ((in = reader.readLine()) != null)
											Server.this.setStatus(index, Integer.parseInt(in));
									} catch (Exception exc) {
										exc.printStackTrace();
									}
								}
							}).start();
				}
			} catch (Exception exc) {
				exc.printStackTrace();
			}
		}

		public void setStatus(int i, int status) {
			gui.setStatus(i, status);
		}

		class GUI extends JFrame {
			private DefaultListModel	model;

			public GUI() {
				this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

				final JList list = new JList(model = new DefaultListModel());

				list.addMouseListener(new MouseAdapter() {
					@Override
					public void mouseClicked(MouseEvent e) {
						if (e.getClickCount() == 2){
							JOptionPane.showMessageDialog(GUI.this, "selektierter Index: " + list.getSelectedIndex());
						}
					}
				});

				list.setCellRenderer(new DefaultListCellRenderer() {
					private JPanel 			panel;
					private JProgressBar	bar	= new JProgressBar();
					private JLabel 			label = new JLabel();

					private Color defaultForground = bar.getForeground();
					private Color defaultBackground = bar.getBackground();

					public Component getListCellRendererComponent(JList list, final Object value, int index, boolean isSelected, boolean cellHasFocus) {
						if (panel == null){
							panel = new JPanel(new BorderLayout());

							panel.add(label, 	BorderLayout.WEST);
							panel.add(bar, 		BorderLayout.CENTER);
						}

						bar.setValue(Integer.parseInt(value.toString()));
						bar.setStringPainted(true);

						label.setText(value.toString() + "%");

						if (isSelected){
							bar.setForeground(Color.RED);
							bar.setBackground(new Color(255,200,200));
						}else{
							bar.setForeground(defaultForground);
							bar.setBackground(defaultBackground);
						}

						return panel;
					}
				});
				this.getContentPane().add(new JScrollPane(list));
				this.setBounds(0, 0, 200, 200);
				this.setLocationRelativeTo(null);
				this.setVisible(true);
			}

			public void addClient() {
				model.addElement(0);
			}

			public void setStatus(int index, int status) {
				model.setElementAt(status, index);
			}
		}
	}

	class Client {
		public void start() throws Exception, IOException {
			final Socket socket = new Socket("127.0.0.1", 5555);
			final PrintWriter writer = new PrintWriter(socket.getOutputStream());
			new Thread(new Runnable() {
				int	status	= 0;

				public void run() {
					while (status <= 100) {
						try {
							Thread.sleep((long) (Math.random() * 5000));
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
						writer.println(status);
						writer.flush();
						status += 10;
					}
				}
			}).start();
		}
	}

	public static void main(String[] args) {
		new ServerClientDemo();
	}
}
[/Java]


----------



## jabbaDUH (5. Mai 2010)

Hey, danke Meru :toll:

Damit bin ich nun wieder etwas weiter gekommen... Danke 
Doch meine Ahnungslosigkeit reißt nicht ab: Ich wollt nu auf dem Label die Client IP ausgeben.. 
hab versucht mit ner gebastelten get/set methode.. aber ich kriegs mal wieder nicht hin 


Gruß Thomas


----------



## Meru (6. Mai 2010)

jabbaDUH hat gesagt.:


> Doch meine Ahnungslosigkeit reißt nicht ab: Ich wollt nu auf dem Label die Client IP ausgeben..
> hab versucht mit ner gebastelten get/set methode.. aber ich kriegs mal wieder nicht hin




```
socket = serverSocket.accept();
socket.getRemoteSocketAddress(); // liefert die IP und den Port des Clients, der sich mit dem Server verbunden hat
```

Jetzt wird das mit der JList alles ein klein wenig komplizierter, denn jetzt musst der JList nicht einfach nur einen Wert geben, sondern ein Objekt, welches mehrere Werte beinhaltet (IP und Progress). Ein Objekt deswegen, weil ja IP und Progress in Relation stehen.


Aber möglich ist das alles, irgendwie 


```
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

import javax.swing.DefaultListCellRenderer;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;

public class ServerClientDemo {

	public ServerClientDemo() {
		new Thread(new Runnable() {
			public void run() {
				new Server().start();
			}
		}).start();
		System.out.println("Server started");
		for (int i = 0; i < 10; i++) {
			try {
				Thread.sleep((long) (Math.random() * 2000));
				new Client().start();
				System.out.println("Client started");
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	class Server {
		private GUI		gui;
		private int		clientIndex;
		private Socket	socket;

		public void start() {
			gui = new GUI();
			clientIndex = 0;
			try {
				ServerSocket serverSocket = new ServerSocket(5555);
				while (true) {
					socket = serverSocket.accept();
					
					gui.addClient(new ServerClientObject(0, socket.getRemoteSocketAddress().toString()));
					
					new Thread(new Runnable() { // Thread zum Empfangen der
												// Statusmeldungen
								private int	index	= clientIndex++;
								private int	status	= 0;

								public void run() {
									try {
										BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
										String in;
										while ((in = reader.readLine()) != null)
											Server.this.setStatus(index, Integer.parseInt(in));
									} catch (Exception exc) {
										exc.printStackTrace();
									}
								}
							}).start();
				}
			} catch (Exception exc) {
				exc.printStackTrace();
			}
		}

		public void setStatus(int i, int status) {
			gui.setStatus(i, status);
		}

		class GUI extends JFrame {
			private DefaultListModel	model;
			private JList list;
			
			public GUI() {
				this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				
				list = new JList(model = new DefaultListModel());
				
				list.addMouseListener(new MouseAdapter() {
					@Override
					public void mouseClicked(MouseEvent e) {
						if (e.getClickCount() == 2){
							JOptionPane.showMessageDialog(GUI.this, "selektierter Index: " + list.getSelectedIndex());
						}
					}
				});
				
				list.setCellRenderer(new DefaultListCellRenderer() {
					
					private JProgressBar	bar	= new JProgressBar();
					private JLabel 			label = new JLabel();
					private JPanel 			panel = initPanel();
					
					private Color defaultForground = bar.getForeground();
					private Color defaultBackground = bar.getBackground();					
					
					private JPanel initPanel() {
						JPanel panel = new JPanel(new BorderLayout());
						
						panel.add(label, 	BorderLayout.WEST);
						panel.add(bar, 		BorderLayout.CENTER);
						
						return panel;
					}

					public Component getListCellRendererComponent(JList list, final Object value, int index, boolean isSelected, boolean cellHasFocus) {
						/*
						 * Da wir dem Model nun nicht mehr einfache Werte übergeben (0-100) sondern ein
						 * Objekt, müssen wir die Variable "value" casten.
						 */
						ServerClientObject sco = (ServerClientObject) value;
						
						bar.setValue(sco.getProgress());
						bar.setStringPainted(true);
						
						label.setText(sco.getAddress());
						
						if (isSelected){
							bar.setForeground(Color.RED);
							bar.setBackground(new Color(255,200,200));
						}else{
							bar.setForeground(defaultForground);
							bar.setBackground(defaultBackground);
						}
						
						return panel;
					}
				});
				this.getContentPane().add(new JScrollPane(list));
				this.setBounds(0, 0, 200, 200);
				this.setLocationRelativeTo(null);
				this.setVisible(true);
			}

			public void addClient(ServerClientObject serverClientObject) {
				model.addElement(serverClientObject);
			}

			public void setStatus(int index, int status) {
				((ServerClientObject)model.getElementAt(index)).setProgress(status);
				list.validate();
				list.repaint();
			}
		}
		
		class ServerClientObject{
			private int progress;
			private String address;
			
			public ServerClientObject(int progress, String address) {
				this.progress = progress;
				this.address = address;
			}
			public void setProgress(int progress) {
				this.progress = progress;
			}
			public int getProgress() {
				return this.progress;
			}
			public void setAddress(String address) {
				this.address = address;
			}
			public String getAddress() {
				return this.address;
			}
		}
	}

	class Client {
		public void start() throws Exception, IOException {
			final Socket socket = new Socket("127.0.0.1", 5555);
			final PrintWriter writer = new PrintWriter(socket.getOutputStream());
			
			new Thread(new Runnable() {
				int	status	= 0;

				public void run() {
					while (status <= 100) {
						try {
							Thread.sleep((long) (Math.random() * 5000));
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
						writer.println(status);
						writer.flush();
						status += 10;
					}
				}
			}).start();
		}
	}

	public static void main(String[] args) {
		new ServerClientDemo();
	}
}
```


----------



## jabbaDUH (6. Mai 2010)

Meru, danke 

ich will euch hier ja nicht nerven oder euch von wichtigeren Sachen abhalten, aber jetzt bin ich fast am Ende mit dem Teil. 
Das einzige was ich noch hinkriegen möchte ist, dass statt dem Dialog beim Doppelklick auf die JProgressbar sich ein neues Fenster öffnet und je nach dem was ich noch an Informationen vom Client bekomme diese Informationen angezeigt werden.

Als Beispiel nehme ich mal die MAC Adresse, die der Client ebenfalls liefert. Beim Doppelklick sollte sich nun ein eigenes Fenster öffnen, in dem einfach auf nem Label die MAC ausgegeben wird.  
Der Wert (Mac) wir vom Server über 

```
while ((in = reader.readLine()) != null){..}
```
 eingelesen.
Danach nehm ich diesen String auseinander und habe zb status (für die Progressbar) und die Mac adresse in einzelnen variablen vorliegen.

Um nun weiter zu kommen muss ich bestimmt auch wieder eine eigene Klasse erzeugen, die die Werte in Objekte zusammenfasst? Irgendwie ist dieses Objekt geschaufel noch recht undurchsichtig für mich. Ich könnte zusätzliche Werte (in einem Objekt) durch die GUI Klasse "durchreichen", um diese dann in einer 2. GUI zu benutzen. Sehe ich das richtig?

verwirrte Grüße


----------



## jabbaDUH (9. Mai 2010)

Hallo Forum,

ich will nich pushen, aber nur mal zur Verständlichkeit:
ich komm im Mouselistenener


```
list.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				if (e.getClickCount() == 2) {
					
					JOptionPane.showMessageDialog(GUI.this.list,
							"selektierter Index: " + list.getSelectedIndex());
					
					
					
				}
			}
		});
```

nicht an die Objekte / das Objekt des 


```
public Component getListCellRendererComponent(JList list,
					final Object value, int index, boolean isSelected,
					boolean cellHasFocus) {...}
```

weil ich da ja erst das Objekt übergebe... der listener sitzt allerdings ausserhalb.. 

versteht einer was ich meine?  bin nicht so gut in Probleme beschreiben =)


Danke schon mal


----------



## jabbaDUH (9. Mai 2010)

habs hinbekommen 

Vielen, vielen Dank an Meru und an Michael... und alle die sich evtl Gedanken drum gemacht haben 

Ich hab in diesem Thread viel gelernt und gemerkt, dass mit einfach Grundlagen fehlen, um "mal eben einfach" etwas in Java (vor allem in der GUI-Programmierung) zu erstellen. 

Grüße jabbaDUH


----------

