# Labelinhalt ändern



## Sqwan (21. Feb 2008)

Schönen guten Abend...

Also ich habe ein Problem.
Und zwar habe ich eine "Class plan" für einen Haushaltsplaner.

In dieser Klasse habe ich eine Methode die eine Passworteingabe realiesieren sollte :?
Das macht sie aber nur halb. In meiner MainMethode habe ich mir eine Reiterkarte erstellt.
In dieser Reiterkarte habe ich 4 Tabs für die jeweiligen Hauptaufgaben.
Um in diesen Reitern was machen zu können habe ich mir ein Label erzeugt und dieses dann hinzugefügt.

In dieses Label habe ich jetzt (meiner Meinung nach sehr Ungünstig) eine Passworteingabe eingebaut.
Diese wird angezeigt. Wenn ich nun auf login Klicke habe ich versucht den inhalt des Grundlabels zu ändern.
Und zwar das design der Passworteingabe weg zu machen und dafür dann was komplett neues rein zu zeichnen.
Das funktioniert aber nicht. Das alte Formular vom Passwort wird leider nur übermalt. Und darunter liegt es aber noch und wenn man rein klickt kann man sich praktisch 2 mal einloggen.   

Weiß jemand wie ich das grundlabel wieder auf den Ursprungszustand zurück setzen kann???
Über einen anderen (besseren) lösungsansatz wäre ich auch froh...
Danke schon mal und schöne Grüße
Marian

So und hier nun meine "Methode" :?

```
public static JPanel pwd(final int i)
  {
    final JPanel l = new JPanel();
    l.setLayout(new GridLayout(5,3));
    
    
    
    JPanel ersetzen1 = new JPanel();
    ersetzen1.setBackground(Color.white);
    JPanel ersetzen2 = new JPanel();
    ersetzen2.setBackground(Color.white);
    JPanel ersetzen3 = new JPanel();
    ersetzen3.setBackground(Color.white);
    JPanel ersetzen4 = new JPanel();
    ersetzen4.setBackground(Color.white);
    JPanel ersetzen5 = new JPanel();
    ersetzen5.setBackground(Color.white);
    JPanel ersetzen6 = new JPanel();
    ersetzen6.setBackground(Color.white);
    JPanel ersetzen7 = new JPanel();
    ersetzen7.setBackground(Color.white);
    JPanel ersetzen8 = new JPanel();
    ersetzen8.setBackground(Color.white);
    JPanel ersetzen10 = new JPanel();
    ersetzen10.setBackground(Color.white);
    JPanel ersetzen11 = new JPanel();
    ersetzen11.setBackground(Color.white);
    JPanel ersetzen12 = new JPanel();
    ersetzen12.setBackground(Color.white);
    JPanel ersetzen13 = new JPanel();
    ersetzen13.setBackground(Color.white);
    JPanel ersetzen14 = new JPanel();
    ersetzen14.setBackground(Color.white);
    JPanel ersetzen15 = new JPanel();
    ersetzen15.setBackground(Color.white);
    
    JPanel ersetzen9 = new JPanel();
    ersetzen9.setBackground(Color.white);
    ersetzen9.setLayout(new GridLayout(3,2));
    
    JLabel Benutzername = new JLabel("Benutzername:");
    JLabel Password = new JLabel("Passwort:");
    JButton okay = new JButton("Login");
    
    
    final JTextField user = new JTextField(32);
    final JPasswordField pass = new JPasswordField(32);
    JButton back = new JButton("Zurück");
    
    ersetzen9.add(Benutzername);
    ersetzen9.add(user);
    ersetzen9.add(Password);
    ersetzen9.add(pass);
    ersetzen9.add(okay);
    ersetzen9.add(back);
    
    
    l.add(ersetzen1);
    l.add(ersetzen2);
    l.add(ersetzen3);
    l.add(ersetzen4);
    l.add(ersetzen5);
    l.add(ersetzen6);
    l.add(ersetzen7);
    l.add(ersetzen9);
    l.add(ersetzen8);
    l.add(ersetzen10);
    l.add(ersetzen11);
    l.add(ersetzen12);
    l.add(ersetzen13);
    l.add(ersetzen14);
    l.add(ersetzen15);
    
    ActionListener al2 = new ActionListener() 
    	{
    		 
    	     public void actionPerformed( ActionEvent e ) 
    	     {
    	     	 String input = new String(pass.getPassword());
    	     	 if(i==1)
    	     	 {
      	     	 	l.setLayout(new BorderLayout(1,0));
    	     	 	l.add(new JButton("Cool"));
    	     	 	l.repaint();
    	     	 }
    	     	 
    	    	 JOptionPane.showMessageDialog(new JFrame(), "password correct");
    	     }
    	};
    	okay.addActionListener( al2 );
    return l;
  }
```
Und natürlich die zugehörige Mainmethode, die meiner meinung nach aber okay sein sollte...

```
public static void main( String[] args ) 
  { 
    JFrame frame = new JFrame(); 
    frame.setTitle("Haushaltsplaner - Copyright© by Marian Ebert");
    frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); 

	frame.setJMenuBar( menuBar() );
 
    JTabbedPane tabbedPane = new JTabbedPane(); 
	tabbedPane.addTab( "Inventar", pwd(1)); 
	tabbedPane.addTab( "Freie Lehrmittel", new JTextArea());
	tabbedPane.addTab( "Verwaltungshaushalt", new JTextArea());
	tabbedPane.addTab( "Kontogegenblatt", new JTextArea());
	
	frame.add(tabbedPane);
 
    frame.pack(); 
    frame.setSize(800,600);
    frame.setVisible( true ); 
  }
```


----------



## mimo (21. Feb 2008)

Sorry ich möchte dir ja nicht zu nahe treten, aber als ich deine ersetzen von bis gesehen habe, ist der Faden gerissen. Also kannst du nochmal versuchen zu erklären was du genau machen möchtest. Und noch ne kurze Frage was deine ActionListener angeht was genau ist "i"????


----------



## Sqwan (21. Feb 2008)

Okay... also ich habe meine Reiter...

   tabbedPane.addTab( "Inventar", pwd(1));
   tabbedPane.addTab( "Freie Lehrmittel", new JTextArea()); 

Jeder dieser befehle fügt einen tab hinzu...
In tab "Inventar" füge ich den inhalt von methode pwd hinzu...
Die Methode pwd ist vom type JLabel... dem entsprechent wird ein Label zurück gegeben.

Der rest passiert in der methode pwd...
In dieser Methode erstelle ich ein JLabel l
Das ist das grundlabel was am ende zurück gegeben wird.

auf das label wende ich ein GridLayout(5,3) an.
In der Mittleren feld Positioniere ich dann das design für meine Passwort abfrage.
Den rest fülle ich mit leeren labels auf, damit es auch zentriert ist, und sich nicht trotzdem über die gesammte seite ausbreitet.

Wenn ich dieses Loginformular nun benutzt habe, und login drücke, dann soll in dem label l nicht mehr gridlayout mit passwortformular sein, sondern wieder ein normales label in dem ein normaler text stehen kann oder einB Button

Nun zum actionListener...
Beim Buttondruck soll der grade beschriebene erfekt passieren: 


> Wenn ich dieses Loginformular nun benutzt habe, und login drücke, dann soll in dem label l nicht mehr gridlayout mit passwortformular sein, sondern wieder ein normales label in dem ein normaler text stehen kann oder einB Button



Und i gibt nur an in welchem tab ich grade bin... So kann ich leicht unterscheiden ob ich bei inventar oder bei Freie Lehrmittel eine passworteingabe getätigt habe


----------



## 0x7F800000 (22. Feb 2008)

Sqwan hat gesagt.:
			
		

> auf das label wende ich ein GridLayout(5,3) an.
> In der Mittleren feld Positioniere ich dann das design für meine Passwort abfrage.
> Den rest fülle ich mit leeren labels auf, damit es auch zentriert ist, und sich nicht trotzdem über die gesammte seite ausbreitet.



 :shock:  :shock:  :shock:   :cry: [schild=1] *heul* [/schild]


----------



## Sqwan (22. Feb 2008)

@Andrey
äußerst konstruktiv...
Das hat mit sicherheit mein Können in Java verbessert und meine programme werden jetzt wohl nurnoch top werden... :x 


Naja..
Wenn es so grottig ist, und jemand mal den nerv hat es mir zu erklären, wäre ich sehr dankbar...


----------



## sliwalker (22. Feb 2008)

Hi,

also....
Beim programmieren ist Dir bestimmt aufgefallen, dass Du eine Menge schreiben musstest. Das ist schonmal ein Indiz dafür, das irgendwas nicht gut ist 

Es gibt gleich mehrere Wege, etwas zentriert zu platzieren.
Zum einen bieten da LayoutManager wie GridBagLayout einige Möglichkeiten oder auch BorderLayout, um mal nur zwei zu neen, die Du Dir vielleicht mal anschaust.

Leerlabels ist wirklich ziemlich schlecht um das zu erreichen, aber mach Dir keinen Kopf  Ich habe es ganz genauso gemacht früher. an muss ja irgendwie weiterkommen 

Für den Anfang empfehle ich Dir das BorderLayout. Der Manager ist einfach zu verstehen, weil Du auf Deinem Container (ContentPane oder auch JPanel) nur 5 bereiche hast, wo Du etwas drin platzieren kannst. Er hat die eigenart, alle Komponenten auf die maximalgröße des Bereichs auszudehnen, was Du damit unterdrücken kannst, wenn Du die Komponenten erstz( einzeln oder alle) auf ein JPanel mit FlowLayout packst....

...soweit erstmal 

@Andrey: Dritter Post von Dir den ich jetzt sehe und bei allen schreibst Du nur nen überhaupt nicht hilfreichen Kommentar. Manchmal sogar herablassend. Ist nicht OK!
Die alte Kuh so oft vergisst, dass sie selbst mal ein Kalb gewesen ist^^


----------



## Saxony (22. Feb 2008)

Hiho,

so wie ich das verstanden habe, willst du, dass nach einem Login die Komponenten zum einloggen verschwinden. Damit du erst einmal weiterkommst, kannste mit einem JPanel#removeAll() alle Komponenten wegschmeißen. Das packste am besten in deinen al2 rein.

Aber weitere Gedanken zum allgemeinen Layoutaufbau nimmt dir das natürlich nicht ab. 

bye Saxony


----------



## 0x7F800000 (22. Feb 2008)

Sqwan hat gesagt.:
			
		

> äußerst konstruktiv...


naja, ich hab jetzt nicht gedacht dass da wirklich meine kreativität gefragt ist, ich glaube nach wie vor fest daran, dass der kollege Sqwan weiss wie eine for-schleife aussieht  :roll: aber gut, mein vorschlag:

wenn man jetzt absolut gar nichts von irgendwelchen layout managern wüsste, da müsste doch trotzdem sofort auffallen, dass hier 15 mal :!:  :!:  :!:  absolut derselbe codeblock vorkommt...

```
final JPanel l = new JPanel(); 
l.setLayout(new GridLayout(5,3)); 

JPanel[] ersetzen=new JPanel[15];
for(int i=0; i<ersetzen.length; i++){
    ersetzen[i]=new JPanel();
    ersetzen[i].setBackground(Color.WHITE);
    l.add(ersetzen[i]);
}

ersetzen9.setLayout(new GridLayout(3,2)); 

JLabel Benutzername = new JLabel("Benutzername:"); 
JLabel Password = new JLabel("Passwort:"); 
JButton okay = new JButton("Login"); 
      
final JTextField user = new JTextField(32); 
final JPasswordField pass = new JPasswordField(32); 
JButton back = new JButton("Zurück"); 
    
ersetzen[9].add(Benutzername); 
ersetzen[9].add(user); 
ersetzen[9].add(Password); 
ersetzen[9].add(pass); 
ersetzen[9].add(okay); 
ersetzen[9].add(back);
```



			
				sliwalker hat gesagt.:
			
		

> Manchmal sogar herablassend. Ist nicht OK!
> Die alte Kuh so oft vergisst, dass sie selbst mal ein Kalb gewesen ist^^


*herablassend*   könntet ihr mir einen gefallen tun, und gedanklich hinter jeden meinen post zwanzig *rofl*-smilies setzen? anscheinend gibts hier gewaltige unterschiede, wie man dieselben posts interpretieren kann, irgendwie scheinen manche leute den ganzen quatsch ernst zu nehmen, oder nehmen es gar als "herablassnd" wahr...   oder glaubt hier jemand dass ich beim letzten post hier wirklich in tränen ausgebrochen bin?^^  :bae:
Außerdem würd ich mich selbst eher zu den noob-kälbern als zu den alten kühen zählen, lol...


----------



## Sqwan (22. Feb 2008)

Also danke schon mal für eure antworten.
Und sicher weiß ich wie eine for-schleife funktioniert, da ich schon seit langer zeit mit php arbeite.
GUI unter Java ist für mich jedoch neuland...

Also mit removeAll() konnte das problem gelöst werden.
Und die vorschleife von Andrey finde ich auch eine sehr gute Idee. 
Ich denke, dass ich mich bald in die art der struktur von Java-GUI eingearbeitet habe.

Die sache mit dem Borderlayout habe ich schon mal versucht. Jedoch wurde da wie gesagt, dass das layout der Passwort abfrage auf die fenstergröße angepasst, obwohl ich die lehren felder gefüllt habe.
Auch habe ich versucht die Label mit setSize() auf eine gewisse größe gesetzt. Doch die wurden trotzem auf die höchstgröße gesetzt.

Jedenfalls läuft meine Version jetzt. Jedoch würde mich interessieren, wie beziehungsweise welche wege ich nutzen kann.

versucht habe ich schon:
FlowLayout();
BoxLayout();
GridLayout();
BorderLayout();
CardLayout();        <-- Das schien mir vollkommen hoffnungslos
StringLayout();      <-- habe ich nie versucht da die beschreibung schon nicht das gewünschte ansprach
GroupLayout();      <-- habe ich nicht zum laufen bekommen... Da steige ich nicht durch...
Und ich habe veruscht an den Container ein neues fenster zu hängen... 
Da kam jedoch die Meldung, das man keine fenster an Container anhäängen darf...

Danke nochmal... Bin schon mal was weiter...
Auch wenn mein Code wohl immernoch nicht er Beste ist...
Vllt kann mir ja eine eine vorschlag machen, nach dem ich mal googlen kann.
Auch Andrey's veriante habe ich eingebaut...

MFG Marian


----------



## mimo (22. Feb 2008)

Naja also ich bin auch der Meinung, dass bevor du deine Zeit verschwendest irgendwelche Konstruktionen mit leeren Labels zu erfinden, dir erst mal ne Stunde Zeit für das GridBagLayout nehmen solltest. Damit kannst du dann alle deine Wünsche erfüllen. Des Weiteren würde ich ein Login auch nicht auf einem TabbedPane unterbringen. Ich denke dafür eignet sich doch ein Dialog viel besser, was vielleicht auch Geschmackssache ist.

Gruß

MIMO


----------



## 0x7F800000 (22. Feb 2008)

hab hier noch ein wenig dran rumgebastelt, in etwa so könnte man dieses panel zentrieren, ohne überhaupt irgendwelche überflüssigen unsichtbaren componente hinzuzufügen.


```
import javax.swing.*;
import java.awt.*;

public class PasswordPanel extends JPanel{
	
	public PasswordPanel(){
		setBackground(Color.WHITE);
		
		//Layout
		GridBagLayout layout=new GridBagLayout();
		
		//components
		JPanel centerPanel=new JPanel();
		centerPanel.setBackground(Color.LIGHT_GRAY);
		centerPanel.setPreferredSize(new Dimension(200,60));
		centerPanel.setLayout(new GridLayout(3,2));
		
		JLabel Benutzername = new JLabel(" Benutzername:"); 
		JLabel Password = new JLabel(" Passwort:"); 
		JButton okay = new JButton("Login"); 
		      
		final JTextField user = new JTextField(32); 
		final JPasswordField pass = new JPasswordField(32); 
		JButton back = new JButton("Zurück"); 
		
		centerPanel.add(Benutzername); 
		centerPanel.add(user); 
		centerPanel.add(Password); 
		centerPanel.add(pass); 
		centerPanel.add(okay); 
		centerPanel.add(back);
		
		//centerPanel immer zentriert darstellen
		GridBagConstraints centerPanelGBC=new GridBagConstraints();
		centerPanelGBC.anchor=GridBagConstraints.CENTER;
                                centerPanelGBC.fill=GridBagConstraints.NONE;   
		layout.setConstraints(centerPanel, centerPanelGBC);
		
		setLayout(layout);
		add(centerPanel);
	}
	
	
public static void main(String[] args){
	JFrame f=new JFrame("GridBagLayoutTest");
	f.setSize(200,200);
	f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	f.getContentPane().add(new PasswordPanel());
	f.setVisible(true);
}
}
```

ich weiss nicht, vielleicht geht das genausogut mit nem border layout, wenn man preferred size festlegt? kP^^  :autsch:


----------



## Sqwan (22. Feb 2008)

:-D Danke schön...
So auf den ersten blick, raffe ich das nicht...
Ich werde jetzt erstmal versuchen da durch zu steigen...

Was mich noch interessieren würde, ist, ob ich wenn ich irgendwie die fenstergröße herausfinden kann, es einfach ohne layout machen kann. Mit setBounds() könnte ich dann vieleicht auch arbeiten? Oder doch besser mit GridBagLayout();
Irgendwie sieht GridBagLayout sehr schwer aus.


----------



## 0x7F800000 (22. Feb 2008)

also allgemein bei komponenten kannst du ja immer mit getWidth() getHeight() die abmessungen rausfinden, dann müsstest du halt die setSize() methode deines PasswortPanels überschreiben, sodass die automatisch das innenliegende Panel mit den ganzen labels und Textfeldern irgendwie zentriert usw... theoretisch zwar möglich, wäre aber imho viel zu aufwendig und unflexibel...

also, alles was ich mir zu diesem GridBagLayout-Manager angeschaut hab, war:
http://www.galileocomputing.de/openbook/javainsel7/  (Kapitel 15.10.6) aber da sind nur ansätze, und dann noch in der Dukumentation nachgegugt was es bei GridBagConstraints für eigenschaften gibt, das hat irgendwie gereicht... Ich hab das ding selbst noch nie benutzt, ich schreibe bevorzugt programme, die eh eine minimale anzahl von knöpfen aufweisen, dafür eine große bildfläche haben, wo man alles mögliche mit der maus zoomen schieben einstellen kann usw...  :bae: Kenn mich da, wie gesagt nicht wirklich aus, vielleicht bringt ein wenig herumgoogeln irgendwas?...  :bahnhof:


----------



## Sqwan (22. Feb 2008)

:-D Java ist auch eine Insel benutze ich auch...
Aber da ist das angegebene kapitel eine druckersteuerung...
Ich werde jedenfalls mal googlen...


----------



## 0x7F800000 (22. Feb 2008)

öhm... "druckersteuerung"??? :bahnhof: ich hab mich jetzt auf diese alleraktuelse Auflage bezogen, da ist in verschiedenen versionen immer alles ein wenig verschoben... Ich hab hier jetzt die 30 Tonnen schwere 4. Auflage vor mir auf dem Tisch liegen, und da ist es unter 15.10.4, ist also seit dem nicht allzuweit gewandert, dieses kapitel... Was hast du denn für eine Auflage?  :shock:


----------



## mimo (22. Feb 2008)

So ich hab mal ein kleines Beispiel gebastelt das sollte dir weiterhelfen:


```
public class Fenster extends JFrame{
    
    JTextField benutzer;
    JPasswordField passwort;
    JButton ok;

    /**create a new Instance of Fenster*/
    public Fenster(){
        setSize(800,500);
        GridBagLayout gbl = new GridBagLayout();
        getContentPane().setLayout(gbl);
        
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.weightx = 0; //gibt an ob das Object die größe im Verhältnis zur Fenstergröße ändert
        gbc.weighty = 0; //gibt an ob das Object die größe im Verhältnis zur Fenstergröße ändert
        
        gbc.gridy = 0;   //gibt die Zelle an in der das Object eingefügt werden soll
        
        benutzer = new JTextField();
        benutzer.setPreferredSize(new Dimension(200,25));
        gbl.setConstraints(benutzer, gbc);
        getContentPane().add(benutzer);
        
        passwort = new JPasswordField();
        passwort.setPreferredSize(new Dimension(200,25));
        gbc.gridy = 1;
        gbl.setConstraints(passwort, gbc);
        getContentPane().add(passwort);
        
        ok = new JButton("OK");
        ok.setPreferredSize(new Dimension(100,30));
        gbc.gridy = 2;
        gbl.setConstraints(ok, gbc);
        getContentPane().add(ok);
        
        this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
        this.setVisible(true);
    }
    
}
```

Gruß

MIMO


----------

