# Dynamische Swing Elemente



## flashdog (26. Aug 2008)

Hallo,
das folgende Programm liest aus einer Datei (beinhaltet nur ein Integerwert) die Anzahl von JCheckBoxes. Diese JCheckBoxes  werden nur dargestellt wenn ich die größe des Fenster mit der Maus verändere. Wie kann man das Fenster aktualiesieren und zur jeder JCheckBox ein actionPerformed definieren?

```
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;

public class checkboxDynamic extends JFrame implements ActionListener {
	private JButton openHeaderFile, openMessungenFile, calculate;
	private JPanel NorthPanel, CenterPanel, SouthPanel;
	private File HeaderFile, MessungenFile;
	
	public checkboxDynamic() {
		NorthPanel = new JPanel();
		CenterPanel = new JPanel();
		
		openHeaderFile = new JButton("Oeffne Header");
		openHeaderFile.addActionListener(this);
		NorthPanel.add(openHeaderFile);
		

		getContentPane().add(NorthPanel, BorderLayout.NORTH);
		getContentPane().add(CenterPanel, BorderLayout.CENTER);

		setTitle("Box");
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setSize(300,300);
		setVisible(true);
	}

	public void actionPerformed(ActionEvent e){ 
		if (e.getSource() == openHeaderFile){
			SelectFile loadedFile = new SelectFile();
			HeaderFile = loadedFile.getFile();
			System.out.print(HeaderFile.getAbsolutePath());
			try {
				int MengecheckBoxes;
				Scanner myScanner = new Scanner(new File(HeaderFile.getAbsolutePath()));
				MengecheckBoxes = myScanner.nextInt();
				for (int i = 1; i <= MengecheckBoxes; i++)
					CenterPanel.add(new JCheckBox());
			} catch (FileNotFoundException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		}
	}
}
```


```
import java.io.File;
import javax.swing.JFileChooser;

public class SelectFile {

	public File getFile(){
		File file = null;
		JFileChooser fc = new JFileChooser();
		//fc.addChoosableFileFilter(new JavaFilter());
		int result = fc.showOpenDialog(null);
		if (result == JFileChooser.APPROVE_OPTION)
			file = fc.getSelectedFile();
		System.out.print("File: " + file.getAbsolutePath());
		return file;
	}
}
```

Viele Grüße


----------



## Gast2 (26. Aug 2008)

```
for (int i = 1; i <= MengecheckBoxes; i++)
{
   JCheckbox box = new JCheckbox();
   box.addActionListener(new ActionListener(){

   //tu was
   });
    CenterPanel.add(box); 
}
```


----------



## flashdog (26. Aug 2008)

Wie kann ich dem ActionListener sagen was er tun soll und wie aktualiesiert man das Fenster damit die neuen Elemente erscheinen?


----------



## SlaterB (26. Aug 2008)

da passt ja der Link aus dem anderen Topic

zu anonymen inneren Klassen: 
http://www.dpunkt.de/java/Die_Sprache_Java/Objektorientierte_Programmierung_mit_Java/64.html

ActionListener recht weit unten


----------



## ARadauer (26. Aug 2008)

klassen schreibt man groß, variablen und methoden klein! und ja das ist wichtig!

schau dir das mal an


```
public void actionPerformed(ActionEvent e){ 
      if (e.getSource() == openHeaderFile){ 
         SelectFile loadedFile = new SelectFile(); 
         HeaderFile = loadedFile.getFile(); 
         System.out.print(HeaderFile.getAbsolutePath()); 
         try { 
            int MengecheckBoxes; 
            Scanner myScanner = new Scanner(new File(headerFile.getAbsolutePath())); 
            MengecheckBoxes = myScanner.nextInt(); 
            for (int i = 1; i <= MengecheckBoxes; i++) {
            	JCheckBox box = new JCheckBox("name "+i);
            	box.addActionListener(this);
            	centerPanel.add(box);            	
            }
            System.out.println("boxen erstellt");
            this.validate();
            this.repaint();
         } catch (FileNotFoundException e1) { 
            // TODO Auto-generated catch block 
           e1.printStackTrace(); 
         } 
      }else if(e.getSource() instanceof JCheckBox){
    	  System.out.println(((JCheckBox)e.getSource()).getText()+" gedrückt");
      }
   }
```


----------



## flashdog (27. Aug 2008)

Danke, dass ist genau wonach ich gesucht habe.


----------



## flashdog (27. Aug 2008)

Wenn man viele Elemente dynamisch in das Fenster einfügt dann wird es größer. Wie kann man die html Seite anpassen wenn sich die größe von einem Applet ändert?


----------



## Guest (30. Aug 2008)

Wie kann man zwei Knöpfe (Alle aktivieren und alle deaktivieren) zu ARadauer Lösung hin. 

D.h. wenn man den Knopf "alle deaktivieren" klickt dann sollen alle JCheckBoxen deaktiviert werden und wenn man auf "alle aktivieren" klickt dann sollen alle JCheckBoxen aktiviert werden.

Wie bekommt man dies hin da JCheckBoxen keine Namen besitzen?


----------



## SlaterB (30. Aug 2008)

sie haben keinen Namen nicht (in nostalgischen Falsch-Deutsch),
sondern keine Variable, über der sie zugegriffen werden können,

Abhilfe: eine solche Variable erschaffen, darauf kann man ja nicht selber kommen 

bei mehreren Komponenten muss es ein Array oder eine Liste sein


----------



## ARadauer (30. Aug 2008)

sprich nach dem instanzieren...
 JCheckBox box = new JCheckBox("name "+i); 
wirfst du sie in eine arraylist

Alle aktivieren und alle deaktivieren Buttons machst du einen Action Listener, in der actionPerformed interierst du mit einer for schleife über die boxen und setzt sie selected oder nicht...


----------



## flashdog (8. Sep 2008)

Danke fuer den Tip. Jetzt habe ich unter NetBeans GUI Builder zwei JPanels erzeugt. In dem einem JPanel habe ich ein Knopf erzeugt, aber leider habe ich keine Ahnung wie ich dem GUI Builder sagen soll dass er die dynamischen JCheckBoxen (  http://www.java-forum.org/de/viewtopic.php?p=441555#441555 ) in den anderen JPanel packen soll und saetzlich GridLayout(0,7) fuer die JCheckBoxen verwenden soll.


----------

