# Neues Panel in JFrame anzeigen durch Button klick



## sockeqwe (15. Apr 2007)

Hi, ich habe ein ärgerliches Problem bei einer Darstellung.
Und zwar möchte ich so ein Serverprogramm machen.
Ich benutze dabei ein JFrame auf dem das Panel config geladen wird mit TextFields um eben werte 
für den Server einzugeben. Dann klickt man auf den OK Button, 
dann wird eine Funktion aufgerufen die die Einstellungen auf die Gültigkeit überprüft "checkconfig()". 
Ist alles ok wird die funktion "startserver()" aufgerufen, und da ist jetzt das problem. 
In dieser Funktion "startserver()" wird ein neues Panel "console" gemacht, das eine Textarea, 
ein Textfield und einen Button drauf hat. 
(die letzteren zwei sind auf einen eigenen Panel mit dem namen "unten" zum "console" pannel hinzugefügt).

Es soll also so eine kleines Consolenprogramm für einen Server sein, in dem man 
Befehle für den Server eingeben kann ...

* PROBLEM: *
Das alte Panel "config" wird vom JFrame mit remove() gelöscht, und das neue "console" 
mit add() auf dem JFrame gegeben. 
Nur das Problem ist, dass wenn ich auf den Configbestätigen Button drücke das "config" 
panel vom JFrame gelöscht wird. So weit ok. Nur das man dann nur mehr 
ein leeres JFrame sieht und erst wenn ich die Größe des JFrame-fensters ändere 
das neue Panel "console" sichtbar wird. 

Und da komm ich einfach nicht weiter, keine Ahnung was da fehlt, 
dass es das "config" Panel gleich darstellt ....

Ich hoffe mir kann jemand weiter helfen

Hier mal der Code: 


```
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;


public class server extends JFrame{

	public static server manager;
	public static JPanel config,console, unten;
	public JTextField t_chips, t_smallblind,t_bigblind, t_command,t_port; 
	public JTextArea history;
	public int chips;
	public int small;
	public int big,port;
	public int width, height;
	public ServerSocket serversocket;
	
	
	public server(String titel, int w, int h)
	{
		super(titel);
	
		Dimension d= java.awt.Toolkit.getDefaultToolkit().getScreenSize(); 
		this.setLocation((d.width-w)/2,(d.height-h)/2);
		//this.setResizable(false);
		this.setSize(w, h);
	
		
		
		config=new JPanel();
		config.setLayout(new GridLayout(5,2));
		
		JLabel l_chips, l_smallblind, l_bigblind, l_port; 
		l_chips=new JLabel("                      Chipswert: ");
		l_smallblind=new JLabel("                      Small Blind: ");
		l_bigblind=new JLabel("                      Big Blind: ");
		l_port=new JLabel("                      Port: ");
		
		
		t_chips=new JTextField();
		t_smallblind=new JTextField();
		t_bigblind=new JTextField();
		t_port=new JTextField();
		
		
		JButton los = new JButton(new AbstractAction("Server starten") { 
			 /**
			 * 
			 */
			private static final long serialVersionUID = 1L;

			public void actionPerformed(ActionEvent e) {
				checkconfig();
				   } 
		    });
		
		config.add(l_chips);
		config.add(t_chips);
		config.add(l_smallblind);
		config.add(t_smallblind);
		config.add(l_bigblind);
		config.add(t_bigblind);
		config.add(l_port);
		config.add(t_port);
		config.add(los);
		
		
		config.setVisible(true);
		
	
		
		
		
		
		
		this.add(config);
		
		Image ico=this.getToolkit().getImage("5.jpg");
		this.setIconImage(ico);
		
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		this.setVisible(true);
		
	}
	
	public void sendcommand(String befehl)
	{
		history.setText(history.getText()+befehl+"\n");
	}
	
	public void realrepaint()
	{
		this.setSize(this.width-1,this.height-1);
		this.setSize(this.width, this.height);
		
	}
	
	public void startserver()
	{
		try {
			serversocket = new ServerSocket( port );
			serversocket.accept();
			
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		
		
		console=new JPanel();
		console.setLayout(new BorderLayout());
		history=new JTextArea();
		//history.setAutoscrolls(true);
		history.setEditable(false);
		JScrollPane sp=new JScrollPane(history);
		history.setCaretPosition(0);
		
		
		
		console.add(sp,BorderLayout.CENTER);
		unten=new JPanel();
		t_command=new JTextField();
		t_command.setSize(350,20);
		
		JButton go = new JButton(new AbstractAction("Go") { 
			 /**
			 * 
			 */
			private static final long serialVersionUID = 1L;

			public void actionPerformed(ActionEvent e) {
				sendcommand(t_command.getText());
				   } 
		    });
		unten.setLayout(new BorderLayout());
		unten.add(t_command,BorderLayout.CENTER);
		unten.add(go, BorderLayout.EAST);
		
		console.add(unten,BorderLayout.SOUTH);
		
	
		this.remove(config);
		this.add(console);
		
		console.repaint();
		
		console.setVisible(true);
		this.repaint();
		
		//this.realrepaint();
		
		
		
	}
	
	
	
	public void checkconfig(){
		boolean fehler=false;
		try {
		chips=Integer.parseInt(t_chips.getText());
		small=Integer.parseInt(t_smallblind.getText());
		big=Integer.parseInt(t_bigblind.getText());
		port=Integer.parseInt(t_port.getText());
		
		
		}
		catch (Exception e) {
			fehler=true; 			
		}
		
		if(big<small) fehler=true;
		if (chips<big) fehler=true; 
		if (port<1 || port>65535) fehler=true;
		
		
		if (fehler==true) 	
JOptionPane.showMessageDialog(null, "Fehler bei der Angabe: \n 
Vergewissern Sie sich das Sie alle Daten ausgefüllt haben \n 
und nur Ganzzahlen eingegeben haben \n 
und den Smallblind kleiner als den Bigblind gesetzt haben
 \n und die Chips auf mindesten einen Bigblind gesetzt haben.
\n\n Vergewissern Sie sich auch, dass Sie den Port \n auf eine Ganzzahl 
zwischen 1 und 65535 gesetzt haben.", "Eingabe Fehler", 0);
		
		else startserver(); 
		
	}
	
	public static void main(String[] args) {
		manager=new server("Net Poker Server",400,200);
		manager.repaint();

	}

}
```


----------



## Wildcard (15. Apr 2007)

Nach dem Entfernen/Hinzufügen von Komponenten muss validate auf dem Container aufgerufen werden.
Alternativ kannst du auch das CardLayout verwenden.


----------



## sockeqwe (15. Apr 2007)

a ja, jetztb klappts einwandfrei! vielen Dank!


----------

