# Button Layout anpassen



## Java und so~ (5. Mai 2011)

Ich habe in einem Frame mit einem GridLayout 5 individuelle Spalten und einen Button. Der Button wurde ganz normal mit


```
button = new JButton ("OK");
c.add(button);
```

erzeugt, allerdings ist der Button über das ganze Fenster gestreckt, wenn ich das Programm ausführe. Wie krieg ich es hin, dass die Größe des Buttons quasie an seinen Namen angepasst wird?
Danke~


----------



## Camino (5. Mai 2011)

Das liegt wohl am GridLayout, bei dem alle Zellen gleich gross werden. Musst du dir vielleicht einen anderen LayoutManager auswählen, oder den Button ausserhalb des GridLayouts anbringen. Normalerweise nimmt er dann auch die Grösse des Textes an.  Dem Button kannst du dann aber auch mit setPreferredSize eine Grösse zuweisen.


----------



## Java und so~ (5. Mai 2011)

wie kann ich den Button auserhald des Gridlayouts anbringen?


----------



## Camino (5. Mai 2011)

Evtl. musst du mit mehreren oder verschachtelten oder anderen LayoutManagern arbeiten. Ich weiss ja nicht genau, wie dein gesamtes Layout aussieht, aber du hast ja normalerweise ein JPanel, dem du den LayoutManager zuweist und dann deine Komponenten dort reinsteckst. Dann musst du einfach den Button nicht dort rein, sondern auf ein anderes Panel. Zum Beispiel könntest du insgesamt ein BorderLayout nehmen, das Panel mit dem GridLayout in den dortigen CENTER-Bereich und den Button z.B. in den SOUTH-Bereich hinzufügen. Oder du nimmst gleich ein BoxLayout oder GridBagLayout für alles.


----------



## Michael... (5. Mai 2011)

Java und so~ hat gesagt.:


> wie kann ich den Button auserhald des Gridlayouts anbringen?


?? in eine andere Komponente packen ;-)

Steckt denn nur der Button in der fünfspaltigen Komponente? Dann ist das wohl der falsche LayoutManager.


----------



## Java und so~ (5. Mai 2011)

Das mit dem zweiten Panel hat funktioniert. Ich hatte bis dahin nur ein Pannel für Radiocheckboxen, Textfelder und Listen und dann das erste Panel einfach mit den Button ins Gridlayout rein ;D


----------



## Java und so~ (5. Mai 2011)

Sooo... nächstes Problem...
ich habe in den Zeieln des Gridlayouts jeweils ein RadioButton, eine Liste, zwei Textfelder, einen Strich und wieder eine Liste.
Jetzt will ich es hinkriegen, dass wenn der Radiobutton aktiv ist, die anderen Elemente aus der reihe ebenfalls aktiv sind und wenn der radiobutton nicht aktiv ist, sollen auch die anderen elemente deaktiviert sein.
Danke schonmal für jegliche denkanstöße ;D


----------



## Camino (5. Mai 2011)

Am besten arbeitest du dann mit ActionListenern, den du an dem RadioButton anmeldest. Dann kannst du in der actionPerformed-Methode schauen, ob der RadioButton selected ist oder nicht und dementsprechend die Komponenten enablen oder disablen, wie du willst.


----------



## Java und so~ (5. Mai 2011)

Also ich habe einmal

```
RadioListener rL = new RadioListener();
rb1.addActionListener(rL);
```
wobei rb1 dann dementsprechend der Radiobutton ist - und ich habe

```
class RadioListener implements ActionListener {

		Test rb1;
		public void setTest (Test rb1) {
			this.rb1=rb1;
		}
		public void actionPerformed (ActionEvent g) {
			if (g.getSource() == rb1) {
				element1.setEnabled(false);
				ta1.setEnabled(false);
				ta6.setEnabled(false);
				element6.setEnabled(false);
				
			}
			
		}
	}
```
wo ich versuche die Listen(element1/6) und die textfelder (ta1/6) zu deaktivieren, funktioniert aber nicht... Wieso nicht?


----------



## Java und so~ (5. Mai 2011)

haaa ich bin so blöd 
man nehme einfach die vollkommen überflüssige if anweisung weg und schon funktionierts~ fail!


----------



## Camino (5. Mai 2011)

Java und so~ hat gesagt.:


> man nehme einfach die vollkommen überflüssige if anweisung weg und schon funktionierts


Ja, solange du nur den 1 RadioButton mit diesem ActionListener hast. Wenn es nun aber mehrere RadioButtons sind und du nur den einen ActionListener nimmst, kannst du mit dem if unterscheiden, von welchem RadioButton der ActionListener ausgelöst wurde.


----------



## Java und so~ (5. Mai 2011)

Camino hat gesagt.:


> Ja, solange du nur den 1 RadioButton mit diesem ActionListener hast. Wenn es nun aber mehrere RadioButtons sind und du nur den einen ActionListener nimmst, kannst du mit dem if unterscheiden, von welchem RadioButton der ActionListener ausgelöst wurde.



Da ich ja sowieso der größte Fail im Programmieren bin, hab ich nicht einen ActionListener mit if-Unterscheidung genommen, sonder einfach mal 5 ActionListener, aber naja, funktioniert auch sehr gut 
Jetzt krieg ich auch alles ausgeschaltet, aber nichts mehr wieder angeschaltet, mies


----------



## Camino (5. Mai 2011)

Java und so~ hat gesagt.:


> Jetzt krieg ich auch alles ausgeschaltet, aber nichts mehr wieder angeschaltet, mies


Na ja, weil du ja mit deinem ActionListener nur ausschaltest. Du musst natürlich dementsprechend in der actionPerformed-Methode die Sachen dann auch wieder anschalten, wenn ein anderer RadioButton aktiviert ist.


----------



## Camino (5. Mai 2011)

Ich hab das z.B. so gemacht:

```
public void actionPerformed( ActionEvent e ) {
		
		if ( e.getSource().equals( rbAnlegen ) ) {
			lbAnzeigen.setEnabled( false );
			lbAnlegen.setEnabled( true );
			comboSemester.setEnabled( true );			
		}
		
		if ( e.getSource().equals( rbAnzeigen ) ) {
			lbAnzeigen.setEnabled( true );
			lbAnlegen.setEnabled( false );
			comboSemester.setEnabled( false );
		}
       }
```


----------



## Java und so~ (5. Mai 2011)

Das wäre natürlich die elegantere Lösung, hab aber ehrlich gesagt grade keine Lust das schon wieder umzuschrtieben, weil ich grade eine "Ehekriese" mit meinem ach so geliebten ChangeListener habe


----------



## Java und so~ (5. Mai 2011)

Mein text sieht jetzt so aus


```
class RadioListener implements ActionListener {
		Test rb1;
		Test rb2;
		Test rb3;
		Test rb4;
		Test rb5;

		public void setTest (Test rb1) {
			this.rb1=rb1;
			this.rb1=rb2;
			this.rb1=rb3;
			this.rb1=rb4;
			this.rb1=rb5;

		}
		public void actionPerformed(ActionEvent e) {
			if(e.getSource().equals(rb1)){
				element1.setEnabled(false);
				ta1.setEnabled(false);
				ta2.setEnabled(false);
				element6.setEnabled(false);
				}
			if(e.getSource().equals(rb2)){
				element2.setEnabled(false);
				ta3.setEnabled(false);
				ta4.setEnabled(false);
				element7.setEnabled(false);
				}
			if(e.getSource().equals(rb3)){
				element3.setEnabled(false);
				ta5.setEnabled(false);
				ta6.setEnabled(false);
				element8.setEnabled(false);
				}
			if(e.getSource().equals(rb4)){
				element4.setEnabled(false);
				ta7.setEnabled(false);
				ta8.setEnabled(false);
				element9.setEnabled(false);
				}
			if(e.getSource().equals(rb5)){
				element5.setEnabled(false);
				ta9.setEnabled(false);
				ta10.setEnabled(false);
				element10.setEnabled(false);
				}
			
		}
		
	}
```

ich hab 'ne Referenz auf jeden RadioButton gelegt und so wie du mit der if-Anweisung versucht zu unterscheiden welche rb ausgewählt wurde und dann den Rest auszuschalten, funktioniert aber nicht...
rb's sind auch alle beim Actionlistener registriert...


----------



## Java und so~ (5. Mai 2011)

Uups Copy and Paste hat versagt

```
public void setTest (Test rb1) {
            this.rb1=rb1;
            this.rb2=rb2;
            this.rb3=rb3;
            this.rb4=rb4;
            this.rb5=rb5;
 
        }
```

da wurde schon der erste Fehler verbessert


----------



## Camino (5. Mai 2011)

Jetzt mal so auf die Schnelle:

```
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;


public class TestPanel
extends JPanel {
	
	private JRadioButton rb1, rb2, rb3, rb4;
	
	private JLabel lb1, lb2, lb3, lb4;
	
	
	public TestPanel() {
		
		rb1 = new JRadioButton("Test 1");
		rb2 = new JRadioButton("Test 2");
		rb3 = new JRadioButton("Test 3");
		rb4 = new JRadioButton("Test 4");
		
		RadioListener rl = new RadioListener();
		
		rb1.addActionListener( rl );
		rb2.addActionListener( rl );
		rb3.addActionListener( rl );
		rb4.addActionListener( rl );
		
		lb1 = new JLabel("Label 1");
		lb2 = new JLabel("Label 21");
		lb3 = new JLabel("Label 3");
		lb4 = new JLabel("Label 4");
		
		add(rb1);
		add(rb2);
		add(rb3);
		add(rb4);
		
		add(lb1);
		add(lb2);
		add(lb3);
		add(lb4);
	
	}
	
	
	
	class RadioListener implements ActionListener {

        public void actionPerformed(ActionEvent e) {
        	
            if(e.getSource().equals(rb1)){
            	lb1.setEnabled(true);
                lb2.setEnabled(false);
                lb3.setEnabled(false);
                lb4.setEnabled(false);
                }
            
            if(e.getSource().equals(rb2)){
                lb1.setEnabled(false);
                lb2.setEnabled(true);
                lb3.setEnabled(false);
                lb4.setEnabled(false);
                }
            
            if(e.getSource().equals(rb3)){
            	lb1.setEnabled(false);
                lb2.setEnabled(false);
                lb3.setEnabled(true);
                lb4.setEnabled(false);
                }
            
            if(e.getSource().equals(rb4)){
            	lb1.setEnabled(false);
                lb2.setEnabled(false);
                lb3.setEnabled(false);
                lb4.setEnabled(true);
                }
                        
        }
        
    }

}
```
Ist halt nur grob und schnell zusammengeschrieben und bestimmt noch verbesserungwürdig und ausbaufähig, zeigt aber so ungefähr, wie du mit den RadioButtons deine Komponenten anzeigen und ausblenden kannst.


----------



## Camino (5. Mai 2011)

Wahlweise würde es auch so funktionieren:

```
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;


public class TestPanel
extends JPanel
implements ActionListener {
	
	private JRadioButton rb1, rb2, rb3, rb4;
	
	private JLabel lb1, lb2, lb3, lb4;
	
	
	public TestPanel() {
		
		rb1 = new JRadioButton("Test 1");
		rb2 = new JRadioButton("Test 2");
		rb3 = new JRadioButton("Test 3");
		rb4 = new JRadioButton("Test 4");
		
		rb1.addActionListener( this );
		rb2.addActionListener( this );
		rb3.addActionListener( this );
		rb4.addActionListener( this );
		
		lb1 = new JLabel("Label 1");
		lb2 = new JLabel("Label 21");
		lb3 = new JLabel("Label 3");
		lb4 = new JLabel("Label 4");
		
		add(rb1);
		add(rb2);
		add(rb3);
		add(rb4);
		
		add(lb1);
		add(lb2);
		add(lb3);
		add(lb4);
	
	}




	public void actionPerformed(ActionEvent e) {
		
        if(e.getSource().equals(rb1)){
        	lb1.setEnabled(true);
            lb2.setEnabled(false);
            lb3.setEnabled(false);
            lb4.setEnabled(false);
            }
        
        if(e.getSource().equals(rb2)){
            lb1.setEnabled(false);
            lb2.setEnabled(true);
            lb3.setEnabled(false);
            lb4.setEnabled(false);
            }
        
        if(e.getSource().equals(rb3)){
        	lb1.setEnabled(false);
            lb2.setEnabled(false);
            lb3.setEnabled(true);
            lb4.setEnabled(false);
            }
        
        if(e.getSource().equals(rb4)){
        	lb1.setEnabled(false);
            lb2.setEnabled(false);
            lb3.setEnabled(false);
            lb4.setEnabled(true);
            }
		
	}

}
```
Was noch fehlt ist die ButtonGroup, der du deine RadioButtons zufügst, damit immer nur eiern der RadioButtons ausgewählt ist.


----------



## Java und so~ (5. Mai 2011)

Okay, vielen Dank, hat jetzt funktioneirt ;D
in 5 min kommt dann das nächste Problme, neh? x'D


----------



## Java und so~ (5. Mai 2011)

Okay, aus 5 min wurden dann doch 20 

```
public class test extends JFrame {
...
         public Test () {
          ...
          }

	public void printResults(){
		//System.out.println("Results "+ta1.getText());
		if(rb1.isSelected()) {
			System.out.println(textfield1.get(0).getText());
			System.out.println(textfield1.get(1).getText());
			System.out.println(combobox1.get(0).getSelectedItem());
			System.out.println(combobox1.get(1).getSelectedItem());
		}
		if(rb2.isSelected()) {
			System.out.println(textfield1.get(2).getText());
			System.out.println(textfield1.get(3).getText());
			System.out.println(combobox1.get(2).getSelectedItem());
			System.out.println(combobox1.get(3).getSelectedItem());
		}
		if(rb3.isSelected()) {
			System.out.println(textfield1.get(4).getText());
			System.out.println(textfield1.get(5).getText());
			System.out.println(combobox1.get(4).getSelectedItem());
			System.out.println(combobox1.get(5).getSelectedItem());
		}
		if(rb4.isSelected()) {
			System.out.println(textfield1.get(6).getText());
			System.out.println(textfield1.get(7).getText());
			System.out.println(combobox1.get(6).getSelectedItem());
			System.out.println(combobox1.get(7).getSelectedItem());
		}
		if(rb5.isSelected()) {
			System.out.println(textfield1.get(8).getText());
			System.out.println(textfield1.get(9).getText());
			System.out.println(combobox1.get(8).getSelectedItem());
			System.out.println(combobox1.get(9).getSelectedItem());
		}
	}
...
}
```

so die Methode printResults soll alles aus den Feldern und Listen ausgeben. Ohne die if-Anweisungen funktioniert das auch wunderbar, aber bei den if-Anweisungen mekert Eclipse bei mir immer bei rb1, rb2, rb3,... rum, d.h. er erkennt nicht, dass das die Radiobuttons aus dem Konstrucktor sind... was nun?


----------



## Camino (5. Mai 2011)

Hast du die RadioButtons auch als Instanzvariablen angelegt, oder innerhalb des Konstruktors? Ist aus deinem Code leider nicht ersichtlich. Und du solltest darauf achten, den Klassennamen mit grossem Anfangsbuchstaben zu schreiben. Du hast einmal test (Klasse) und einmal Test (Konstruktor) geschrieben. Das sind zwei verschiedene Dinge.


----------



## Java und so~ (6. Mai 2011)

Ich habe jetzt die ganze Ausgabe der Listen und Textfelder formatiert und mit

```
try {
			FileWriter first = new FileWriter(new File("Abstraktionsregeln.txt"));
			first.write(a);
			first.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
```

in der Datei Abstraktionsregeln.txt gespeichert. Wie kann jetzt aber angeben, wo er die Datei speichern soll? Momentan wurde sie bei "C:\Dokumente und Einstellungen\witte\workspace\Test" gespeichert. ("witte" ist der Administrator und "Test" die Klasse des Programms)


----------

