# Menu mit Swing



## IchBruderSonne (16. Mrz 2011)

Hallo liebe Leute 

Ich hoffe ich mache das hier richtig mit der Themen-Erstellung
falls ich da irgendwie fehlerhaft gegen Forumsregeln was gemacht habe, 
sieht es mir bitte nach 

_____________________________________________________________



also, ich bin echt verzweifelt 	 ... und ich bin Java-mäßig ein Buch mit höchstens 2 Seiten  :autsch:

Ich muss für ein Java-Seminar ein Programm schreiben mit Swing usw 

so soll das ungefähr aussehen ... wie kann ich das bewerkstelligen ???:L könnt ihr mir da auf die Sprünge helfen 

ich hoffe meine Grafik ist für euch selbsterklärend 


Die Hobbys sollen in JavaCeckBoxMenuIthem sein

ist das GridBagConstraints am besten dafür geeignet ?

was muss ich alles Importieren ?? 


```
import java.awt.Component;
import java.awt.Container;
import java.awt.Insets;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JCheckBoxMenuItem;

// ...... noch was ??? java.awt.event ??
```


wie muss (grob) meine Struktur sein


```
public class Seminar extends JFrame implements ActionListener
     {
        public Seminar()
     {
             super("Seminar");


/* .....

    den ganzen Teil den ich selbst angefertigt habe möchte ich euch ersparen
    ich habe da echt die Nächte damit verbracht was sinnvolles zu gestalten
    aber alles haperte immer wieder an irgendwelchen Kleinigkeiten 

    ..... */


  }
}
```


----------



## Gast2 (16. Mrz 2011)

Willst (musst) du den Code komplett per Hand schreiben, wenn ja? dann informier dich zunächst über Swing und lies dir folgendes tutorial durch:
Using Layout Managers (The Java™ Tutorials > Creating a GUI With JFC/Swing > Laying Out Components Within a Container)
Das GridBagLayout sollte das richtige für deine zwecke sein.
Etwas einfacher gehts mit nem GUI-Builder, aber den sollteste nur nutzen wenn du die grundlagen beherrschst.


----------



## Dit_ (16. Mrz 2011)

EikeB hat gesagt.:


> Etwas einfacher gehts mit nem GUI-Builder, aber den sollteste nur nutzen wenn du die grundlagen beherrschst.


Ich dachte umgekehrt 

Auf dem Bild sieht man dass die Schaltflächen Speichern und Reset nicht zentriert platziert wurden... der Abstand von unten und seitlich zu den Schaltflaechen ist zu groß... :noe:

Versuche TableLayout, das wird mit Sicherheit dein Favorit  Ist zwar aufwändiger als alle anderen Layouts, aber mit TableLayout kannst du perkekt symmetrische Gui's bauen.

P.S. Ich mache immer so: Erstmal auf Papier zeichnen (mit Tabelle), dann implementieren.

gruß


----------



## IchBruderSonne (16. Mrz 2011)

Ja den Code muss ich komplett per Hand schreiben, dass ist ja meine Sorge ^^
danke für den Link, da muss ich mich jetzt mal durchlesen,
och auf englisch (naja dann muss halt ein Übersetzungsseite das grob übersetzen)

die 2 Buttons unten sollen halt nur irgendwie dort sein, nicht perfekt zentriert 
ich dachte mir da an so was ganz einfachem ... GridBagConstraints.WEST oder .CENTER... was meint ihr ?


```
save = new JButton("Speichern");
    addComponent(frame, save, 2, 9, 1, 1, GridBagConstraints.WEST, GridBagConstraints.NONE);
    save.setActionCommand("Save");
```


----------



## jgh (16. Mrz 2011)

auch wenn es nicht Sinn und Zweck ist...ich wollte mal schauen, wie lange ich für so eine GUI brauche...und hatte gehofft es unter 1 Std es zu schaffen  , das war leider nichts...
Beim Speichern musst du dir natürlich  noch irgendeine Methode schreiben, die die Textfelder ausliest und dann auch abspeichert, EDIT: ich habe hier einen JFileChooser genommen.

wie dem auch sei...so könnte man es machen (auch wenn es imho zuviel Code für eine Klasse ist)
Ansonsten hoffe ich auf Kritik -insbesondere derjenigen, die das viel besser können als(wie^^) ich.


```
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Seminar {
	private JLabel jLabelname, jLabelbezeichnung, jLabelWohnort, jLabelTelefon,
			jLabelHobbys;
	private JTextField jTfVorname, jTfNachname, jTfBezeichnung, jTfWohnort,
			jTfTelefon;
	private JButton jBSpeichern, jBReset;
	private JCheckBoxMenuItem jCBMITanzen, jCBMISport, jCBMIGarten;
	private JMenuBar jMenuBar;
	private JMenu jMdatei;
	private JMenuItem jMISpeichern, jMIReset, jMIExit;
	private JFrame jFrame;
	private JPanel jPanel;

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

	public Seminar() {
		initFrameAndPanel();
		initLabels();
		initButtons();
		initCheckBox();
		initTextFields();
	
		initAndAddMenuBar();

		addComponentsToPanel();
		jFrame.pack();
		jFrame.setVisible(true);

	}

	private void initAndAddMenuBar() {
		jMenuBar = new JMenuBar();
		jMdatei = new JMenu("Datei");
		jMISpeichern = new JMenuItem("Speichern");
		jMISpeichern.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				speichern();

			}
		});
		jMIExit = new JMenuItem("Exit");
		jMIExit.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				System.exit(0);
			}
		});
		jMIReset = new JMenuItem("Reset");
		jMIReset.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {

				reset();
			}
		});

		jMdatei.add(jMISpeichern);
		jMdatei.add(jMIReset);
		jMdatei.addSeparator();
		jMdatei.add(jMIExit);

		jMenuBar.add(jMdatei);

		jFrame.setJMenuBar(jMenuBar);
	}

	private void addComponentsToPanel() {
		GridBagConstraints a = new GridBagConstraints();
		a.gridx = 0;
		a.gridy = 0;
		a.insets = new Insets(20, 5, 5, 5);
		a.anchor = GridBagConstraints.WEST;
		jPanel.add(jLabelname, a);

		GridBagConstraints b = new GridBagConstraints();
		b.gridx = 1;
		b.gridy = 0;
		b.insets = new Insets(5, 5, 5, 15);
		jPanel.add(jTfVorname, b);

		GridBagConstraints c = new GridBagConstraints();
		c.gridx = 2;
		c.gridy = 0;
		c.insets = new Insets(5, 5, 5, 15);
		c.anchor = GridBagConstraints.EAST;
		jPanel.add(jTfNachname, c);

		GridBagConstraints d = new GridBagConstraints();
		d.gridx = 0;
		d.gridy = 1;
		d.insets = new Insets(5, 5, 5, 15);
		jPanel.add(jLabelbezeichnung, d);

		GridBagConstraints e = new GridBagConstraints();
		e.gridx = 0;
		e.gridy = 1;
		e.insets = new Insets(5, 5, 5, 15);
		jPanel.add(jLabelbezeichnung, e);

		GridBagConstraints f = new GridBagConstraints();
		f.gridx = 1;
		f.gridwidth = 2;
		f.gridy = 1;
		f.insets = new Insets(5, 5, 5, 15);
		jPanel.add(jTfBezeichnung, f);

		GridBagConstraints g = new GridBagConstraints();
		g.gridx = 0;
		g.gridy = 2;
		g.insets = new Insets(5, 5, 5, 15);
		g.anchor = GridBagConstraints.WEST;
		jPanel.add(jLabelWohnort, g);

		GridBagConstraints h = new GridBagConstraints();
		h.gridx = 1;
		h.gridwidth = 2;
		h.gridy = 2;
		h.insets = new Insets(5, 5, 5, 15);
		jPanel.add(jTfWohnort, h);

		GridBagConstraints i = new GridBagConstraints();
		i.gridx = 0;
		i.gridy = 3;
		i.insets = new Insets(5, 5, 5, 15);
		i.anchor = GridBagConstraints.WEST;
		jPanel.add(jLabelTelefon, i);

		GridBagConstraints j = new GridBagConstraints();
		j.gridx = 1;
		j.gridwidth = 2;
		j.gridy = 3;
		j.insets = new Insets(5, 5, 5, 15);
		jPanel.add(jTfTelefon, j);

		GridBagConstraints k = new GridBagConstraints();
		k.gridx = 0;
		k.gridy = 4;
		k.insets = new Insets(5, 5, 5, 15);
		k.anchor = GridBagConstraints.WEST;
		jPanel.add(jLabelHobbys, k);

		GridBagConstraints l = new GridBagConstraints();
		l.gridx = 2;
		l.gridy = 4;
		l.insets = new Insets(5, 15, 5, 15);
		l.anchor = GridBagConstraints.WEST;
		jPanel.add(jCBMIGarten, l);

		GridBagConstraints m = new GridBagConstraints();
		m.gridx = 2;
		m.gridy = 5;
		m.insets = new Insets(5, 15, 5, 15);
		m.anchor = GridBagConstraints.WEST;
		jPanel.add(jCBMISport, m);

		GridBagConstraints n = new GridBagConstraints();
		n.gridx = 2;
		n.gridy = 6;
		n.insets = new Insets(5, 15, 5, 15);
		n.anchor = GridBagConstraints.WEST;
		jPanel.add(jCBMITanzen, n);

		GridBagConstraints o = new GridBagConstraints();
		o.gridx = 1;
		o.gridy = 7;
		o.insets = new Insets(5, 5, 5, 15);
		o.anchor = GridBagConstraints.CENTER;
		jPanel.add(jBSpeichern, o);

		GridBagConstraints p = new GridBagConstraints();
		p.gridx = 2;
		p.gridy = 7;
		p.insets = new Insets(5, 15, 5, 50);
		p.anchor = GridBagConstraints.WEST;
		p.fill = GridBagConstraints.BOTH;
		jPanel.add(jBReset, p);

	}

	private void initCheckBox() {
		jCBMIGarten = new JCheckBoxMenuItem("Garten");
		jCBMISport = new JCheckBoxMenuItem("Sport");
		jCBMITanzen = new JCheckBoxMenuItem("Tanzen");

	}

	private void initTextFields() {
		jTfBezeichnung = new JTextField(25);
		jTfNachname = new JTextField(10);
		jTfVorname = new JTextField(10);
		jTfWohnort = new JTextField(25);
		jTfTelefon = new JTextField(25);
		reset();
	}

	private void initLabels() {
		jLabelname = new JLabel("Name");
		jLabelbezeichnung = new JLabel("Bezeichnung");
		jLabelWohnort = new JLabel("Wohnort");
		jLabelTelefon = new JLabel("Telefon");
		jLabelHobbys = new JLabel("Hobbys");

	}

	private void initFrameAndPanel() {
		jFrame = new JFrame("Seminar");
		jFrame.setSize(new Dimension(500, 500));
		jFrame.setLocationRelativeTo(null);
		jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		jPanel = new JPanel();
		jPanel.setLayout(new GridBagLayout());

		jFrame.getContentPane().add(jPanel);

	}

	private void initButtons() {
		jBSpeichern = new JButton("Speichern");
		jBReset = new JButton("Reset");
		jBSpeichern.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				speichern();

			}
		});
		jBReset.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				reset();

			}

		});
	}

	private void speichern() {
		JFileChooser j = new JFileChooser();
		j.setName("Speichern unter");
		j.showSaveDialog(null);
	}

	private void reset() {
		jTfVorname.setText("Vorname");
		jTfNachname.setText("Nachname");
		jTfBezeichnung.setText("Berufsbezeichnung");
		jTfWohnort.setText("PLZ, Ort, Straße, Hausnummer");
		jTfTelefon.setText("Telefonnummer");
		jCBMIGarten.setSelected(false);
		jCBMISport.setSelected(false);
		jCBMITanzen.setSelected(false);

	}

}
```


----------



## IchBruderSonne (16. Mrz 2011)

ouch mama mia sieht der Code hamma aus - alleine schon von der Optik & Übersichtlichkeit :applaus:



was ich sagen wollte, ich bin ja noch ein Neuling und benutze Joe
der Joe kennt das nicht 
	
	
	
	





```
@Override
```
 - kann das nicht compilieren 

und ich weiß auch noch nicht was das genau macht  - edit/ grad nachgelesen 
was passiert wenn man das weglässt / irgendwie verändert ?


```
/* Mit diesem Typ kann eine Methode gekennzeichnet werden, 
               die die Methode ihrer Oberklasse überschreibt. 
               Der Compiler stellt dann sicher, dass die Oberklasse diese Methode enthält 
               und gibt einen Fehler aus, wenn dies nicht der Fall ist. 

               Beispiel: */

public class A {
    public void eineMethode() {}
}
 
public class B extends A {
    @Override
    public void eineMethode() {}
}
```


den Code von jgh muss ich mir jetzt echt reinziehen (so was macht irgendwie echt spaß zu lesen^^)
wie funktioniert das mit dem JPanel und einem Menu?, dachte das geht nicht ???:L ok muss erst selber ausprobieren


----------



## jgh (16. Mrz 2011)

[c] @Override[/c] ist eine Annotation 

und es passiert nichts...außer das du nicht mehr gewarnt wirst, sofern in der Oberklasse [c]eineMethode()[/c] nicht mehr existiert.


----------



## IchBruderSonne (16. Mrz 2011)

ja ich probiere es grad aus  
man hammer wie es funktioniert^^ und ich habe die Nächte durchgemacht um ... und naja fuba
ich muss jetzt erst mal hier durchsteigen, macht echt laune sowas gut strukturiertes zu lesen / sprich zu begreifen^^


----------



## Dit_ (16. Mrz 2011)

mit TableLayout wäre der Code um min 100 Zeilen kürzer ueh: 

Hier als Bsp, RegexChecker:


```
public class Test extends AWindow implements ChangeListener {
	
	private static final long		serialVersionUID	= 1L;
	private static final double[][]	DIM					= { { 7, -1, 120, 7, 120, 7 }, 
			{ 7,// [0]abstand OBEN
			17, // [1] text
			25, // [2] Feld
			5, 	// [3] ABSTAND
			17, // [4] text
			25, // [5] Feld
			5, 	// [6] ABSTAND
			17, // [7] text
			-1, // [8] RESULTAT
			15, // [9] ABSTAND 
			25, // [10] BUTTONS
			7	// [11] ABSTAND UNTEN
			} };
	
	private JTextField				_regexInput, _stringInput;
	private JTextArea				_output;
	private JButton					_close;
	
	
	public Test() {
		super("Test");
		createComponents();
	}
	
	@Override
	void createComponents() {
		setPreferredSize(new Dimension(500, 400));
		setLayout(new TableLayout(DIM));
		_regexInput 	= createField();
		_stringInput 	= createField();
		_output 		= createTextArea();
		_close 			= createButton("Fertig");
		
		add(createTextPane("Regex:"), 		"1,1, 4,1");
		add(_regexInput, 					"1,2, 4,2");
		
		add(createTextPane("Teststring:"), 	"1,4, 4,4");
		add(_stringInput, 					"1,5, 4,5");
		
		add(createTextPane("Ergebnis:"), 	"1,7, 4,7");
		add(new JScrollPane(_output), 		"1,8, 4,8");

		add(_close, 						"4, 10");
		
		pack();
		setLocationRelativeTo(null);
		setVisible(true);
	}
	
	/**
	 * @return
	 */
	private JTextArea createTextArea() {
		JTextArea tArea = new JTextArea();
		tArea.setFont(new Font("Tahoma", 0, 12));
		tArea.setEditable(false);
		return tArea;
	}

	private JButton createButton(String text) {
		JButton button = new JButton(text);
		button.addActionListener(this);
		return button;
	}
	private JTextPane createTextPane(String text) {
		JTextPane hint = new JTextPane();
		hint.setText(text);
		hint.setFont(new Font("Tahoma", 0, 10));
		hint.setEnabled(false);
		hint.setDisabledTextColor(Color.gray.darker());
		hint.setOpaque(false);
		return hint;
	}
	private JTextField createField() {
		JTextField field = new JTextField();
		field.addActionListener(this);
		field.addKeyListener(this);
		field.setFont(new Font("Tahoma", 0, 12));
		field.addMouseListener(this);
		field.getCaret().addChangeListener(this);
		return field;
	}
	
	@Override
	public void stateChanged(ChangeEvent e) {
		check();
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		Object obj = e.getSource();
		if (obj.equals(_close)) {
			closeWindow();
		}
	}
	
	/**
	 * Prueft die Eingabe.
	 */
	private void check() {
		String regex 	= _regexInput.getText();
		String tocheck 	= _stringInput.getText();
		
		if (regex.length() > 1 && tocheck.length() > 1) {
			try {
				Pattern p = Pattern.compile(regex);
				Matcher m = p.matcher(tocheck);
				StringBuilder sb = new StringBuilder();
				
				while(m.find()){
					sb.append("Gefunden:");
					sb.append("\t'"+m.group());
					sb.append("'\n");
				}
				
				setOutput(sb.toString());
				
			} catch (Exception e) {
				setOutput("Error: "+ e.getMessage());
			}
		} else {
			setOutput("");
		}
	}
	
	
	private void setOutput(final String result) {
		SwingUtilities.invokeLater(new Runnable() {
			
			@Override
			public void run() {
				_output.setText(result);
			}
		});
		
	}
	
	
	
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			
			@Override
			public void run() {
				new Test();
			}
		});
		
	}
}
```

AWindow ist eine Abstrakte Klasse die von JFrame erbt und alle notwendigen Listener "implementiert (leer)"...
Man Braucht TableLayout.jar zusätzlich.


----------



## Gast2 (16. Mrz 2011)

Dit_ hat gesagt.:


> mit TableLayout wäre der Code um min 100 Zeilen kürzer ueh:



FormLayout ist noch viel mächtiger und der Code wird durch den programtischen FormBuilder auch übersichtlicher.


----------



## Gast2 (16. Mrz 2011)

jgh hat gesagt.:


> auch wenn es nicht Sinn und Zweck ist...ich wollte mal schauen, wie lange ich für so eine GUI brauche...und hatte gehofft es unter 1 Std es zu schaffen  , das war leider nichts...
> Beim Speichern musst du dir natürlich  noch irgendeine Methode schreiben, die die Textfelder ausliest und dann auch abspeichert, EDIT: ich habe hier einen JFileChooser genommen.
> 
> wie dem auch sei...so könnte man es machen (auch wenn es imho zuviel Code für eine Klasse ist)
> ...




```
getContentPane()
```
ist seit Java 1.5 unnötig

```
setVisible(true)
```
ganz am schluß aufrufen (am besten in der main) und ein invokeLater drum herum.
Von GridBagLayout halte ich sowieso nix^^...
Du rufst 
	
	
	
	





```
pack()
```
 UND 
	
	
	
	





```
setSize()
```
auf eins davon ist unnötig...


----------



## jgh (16. Mrz 2011)

_


		Code:In die Zwischenablage kopieren


getContentPane()

ist seit Java 1.5 unnötig _ 
gut zu wissen 

_


		Code:In die Zwischenablage kopieren


setVisible(true)

ganz am schluß aufrufen (am besten in der main) und ein invokeLater drum herum._
mache ich doch, ist mein letzter Aufruf im Konstruktor...wenn ich das in der main machen sollte, wären noch getter-Methoden zusätzlich nötig, aber ok...das invokeLater von SwingUtilities habe ich mal rausgelassen, solange eh nichts anderes passiert.

_Von GridBagLayout halte ich sowieso nix^^..._
ansichtssache 

_
Du rufst 
	
	
	
	






		Code:In die Zwischenablage kopieren


pack()

 UND 
	
	
	
	






		Code:In die Zwischenablage kopieren


setSize()

auf eins davon ist unnötig.._
ich dachte 
	
	
	
	





```
pack()
```
 packt nur, also verkleinert einen Frame...aber -wie ich gerade ausprobiert habe^^- geht es tatsächlich ohne  thx

_FormLayout ist noch viel mächtiger und der Code wird durch den programtischen FormBuilder auch übersichtlicher. _
mal abgesehen von der Länge der Klasse, finde ich den Code übersichtlich...werde ich mir aber mal bei Gelegenheit anschauen

@dit
dein Bsp kann ich auch mit der TableLayout.jar nicht kompilieren...

_mit TableLayout wäre der Code um min 100 Zeilen kürzer_
anschauen werde ich mir das auch mal.


----------



## Michael... (16. Mrz 2011)

SirWayne hat gesagt.:


> ```
> getContentPane()
> ```
> ist seit Java 1.5 unnötig


Das gilt vielleicht für das Hinzufügen von Komponenten nicht aber generell ;-)

```
frame.setBackground(Color.ORANGE);
```
vs.

```
frame.getContentPane().setBackground(Color.ORANGE);
```


----------



## jgh (16. Mrz 2011)

^^ exakt wegen so einem Bsp habe ich mir angewöhnt die ContentPane zu nutzen...jetzt wo du das sagst  , fällt es mir wieder ein


----------



## Gast2 (16. Mrz 2011)

Michael... hat gesagt.:


> Das gilt vielleicht für das Hinzufügen von Komponenten nicht aber generell ;-)
> 
> ```
> frame.setBackground(Color.ORANGE);
> ...



Noch nie versucht, noch nie gebraucht, da eh immer min. ein JPanel auf dem JFrame liegt


----------



## Tomate_Salat (16. Mrz 2011)

```
SwingUtilities.invokeLater(new Runnable() 
{
	@Override
	public void run() 
	{
		jFrame.setVisible(true);
	}
});
```

Das fehlt trotzdem. Dann würde ich meine GUI auch nicht über den Konstruktor starten. Wenn du noch iwelche Methoden vor dem setVisible aufrufen willst ist das nicht möglich, oder du musst mehr Parameter in dern Konstruktor stecken. Ich habe meist eine eigene Methode, welche mir die GUI im EDT startet.



SirWayne hat gesagt.:


> Noch nie versucht, noch nie gebraucht, da eh immer min. ein JPanel auf dem JFrame liegt


dem schließe ich mich an.


----------



## Dit_ (16. Mrz 2011)

jgh hat gesagt.:


> @dit
> dein Bsp kann ich auch mit der TableLayout.jar nicht kompilieren...



weil dir nun mal die Abstrakte Klasse AWindow fehlt. ersetze 
	
	
	
	





```
extends AWindow
```
 durch 
	
	
	
	





```
extends JFrame implements ActionListener
```


----------



## IchBruderSonne (16. Mrz 2011)

@jgh

erst mal hamma tolles Programm :toll: ich arbeite mich schon den *ganzen* Tag da hinein  macht aber heiden Spaß  

_______________________

ich hätte da noch paar fragen 

irgendwie erzeugt es mir keine Datei  
und das "Speichern unter" finde ich nirgendwo beim ausführen  


```
private void speichern() 
    {
        JFileChooser j = new JFileChooser();
        j.setName("Speichern unter");
        j.showSaveDialog(null);
    }
```

habe im Netz so was gefunden, kann man das irgendwie da einbauen um eine Datei zu erzeugen?

```
fileChooser.setSelectedFile(new File("lin_cfg.c"));
```
als ich es einbauen wollte (verschiedene Varianten), hat der Compiler mich nur ausgelacht ... 


_____________________________



dann wegen 
	
	
	
	





```
pack()
```
UND 
	
	
	
	





```
setSize()
```
ich habe das mal ausgetestet 
wenn ich 
	
	
	
	





```
pack()
```
 weglasse, dann habe ich ein großes Fenster 
wenn ich  
	
	
	
	





```
setSize()
```
 weglasse, dann rutscht mein Fenster nach rechts-unten 
wenn ich beide drinne behalte, dann habe ich eigentlich das Fenster was ich haben will 
ist es in der Programmierung ok beide drinne zu behalten, oder was wäre besser?


______________________________


@Dit_ 

danke Dit für den Code 	 
jgh hat mir aber den (Schritt für Schritt sehr klaren) Code geschrieben, den selbst ich gut begreife 
dein Code ist sehr viel (viel viel) kleiner  
aber... ich las da erst mal nur spanisch Bahnhof mit Chinesischem Untertitel :autsch: 
ich werde mich später in den garantiert durcharbeiten bis ich ihn verstanden habe :rtfm: :toll: 
wenn ich erst mal da meine eigenen Namen/Worte verwende, dann steige ich da bestimmt gut ein^^


----------



## jgh (16. Mrz 2011)

mal so auf die schnelle als Ansatz...ABER in der Datei steht immer noch nichts drinnen^^
der JFileChooser ist auch nicht dafür gedacht, eine Datei zu speichern...sondern nur -wie der Name auch sagt- ein File/ oder Verzeichnis auszusuchen, wo gespeichert wird.
Der Code sollte soweit klappen, bis auf das du dir noch überlegen musst...was du in die Datei schreiben willst:

und dein Codeschnipsel passt natürlich nur, wenn man den entsprechenden Variablennamen nimmt...in diesem Fall [c]j[/c]


```
private void speichern() {
		JFileChooser j = new JFileChooser();
		j.setName("Speichern unter");
//Dein Codeschnippsel
		j.setSelectedFile(new File("lin_cfg.c")); 
		int antwort = j.showSaveDialog(null);

		if (antwort == JFileChooser.APPROVE_OPTION) {
			File f = j.getSelectedFile();
			try {
				FileWriter fw = new FileWriter(f);
				JOptionPane.showMessageDialog(jFrame, "Die Datei "
						+ f.getCanonicalPath()
						+ "wurde erfolgreich gespeichert.",
						"Speichern erfolgreich",
						JOptionPane.INFORMATION_MESSAGE, null);
			} catch (IOException e) {
				e.printStackTrace();
				JOptionPane.showMessageDialog(jFrame, "Die Datei "
						+ "konnte nicht gespeichert werden.",
						"Fehler beim Speicherh", JOptionPane.WARNING_MESSAGE,
						null);
			}
		}
	}
```

nur um bspw deine Eingaben zu speichern, bietet sich meiner Meinung eher an:
Daten aus den Textfeldern lesen, in eine feste Datei speichern und nicht jedesmal zu fragen unter welchen Namen und im welchen Verzeichnis gespeichert werden soll.


----------



## IchBruderSonne (17. Mrz 2011)

jgh hat gesagt.:


> ......
> 
> nur um bspw deine Eingaben zu speichern, bietet sich meiner Meinung eher an:
> *Daten aus den Textfeldern lesen, in eine feste Datei speichern* und nicht jedesmal zu fragen unter welchen Namen und im welchen Verzeichnis gespeichert werden soll.



ja das wäre natürlich am besten 

wie kann man da den RandomAccessFile verwenden 
_Die Klasse RandomAccessFile bietet die Möglichkeit, Dateien mit wahlfreiem Zugriff anzusprechen. Die Datei kann entweder mit Lese- oder mit Lese- und Schreibzugriff geöffnet werden. Mit der Methode seek() kann man sich in der Datei bewegen._
sozusagen dass alle Eingaben als eine Sitzung gespeichert werden


----------



## jgh (17. Mrz 2011)

```
private RandomAccessFile raf;


private void speichern() {
		String[] daten = new String[8];
		daten = copyDaten(daten);
		try {
			raf = new RandomAccessFile("daten.txt", "rw");
			raf.seek(raf.length());
			for (int i = 0; i < daten.length; i++) {
				raf.writeUTF(daten[i]);
			}
			JOptionPane.showMessageDialog(jFrame, "Der Teilnehmer " + daten[0]
					+ " " + daten[1] + " wurde erfolgreich gespeichert",
					"Speichern erfolgreich", JOptionPane.INFORMATION_MESSAGE);
			reset();
			raf.close();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	private String[] copyDaten(String[] daten) {
		daten[0] = jTfVorname.getText();
		daten[1] = jTfNachname.getText();
		daten[2] = jTfBezeichnung.getText();
		daten[3] = jTfWohnort.getText();
		daten[4] = jTfTelefon.getText();
		daten[5] = "garten=" + jCBMIGarten.isSelected();
		daten[6] = "sport=" + jCBMISport.isSelected();
		daten[7] = "tanzen=" + jCBMITanzen.isSelected() + "\r\n";
		return daten;
	}
```


----------



## IchBruderSonne (17. Mrz 2011)

hmm habe den ganzen tag um diesen RandomAccessFile drum gefeilt
habe das auch imoprtiert 
	
	
	
	





```
import java.io.*;
```
 und 
	
	
	
	





```
import javax.swing.JOptionPane;
```
leider will das bei mir nicht funktionieren, erzeugt auch keine Datei ...
vielleicht muss ich noch "daten" implementieren, aber ist doch schon ...
... ich weiß echt nicht ... ???:L


----------



## jgh (17. Mrz 2011)

wo erwartest du die datei 
	
	
	
	





```
daten.txt
```
denn?

normalerweise sollte sie denn auch bspw dort liegen:

D:\deinWorkspaces\deinProjektName\

du hast die beiden Methoden speichern() und copyData() in die Klasse Seminar hinzugefügt und die andere speichern()-Methode entfernt?


----------



## IchBruderSonne (17. Mrz 2011)

ja genau die 2 neuen hinzugefügt 
alte weggemacht (nur als Test dagelassen)

```
speichern() .....
copyData() .....

/*
speichern() ....
*/
```

wenn ich auf speichern drücke - dann tut sich nichts ...

ansonsten ist der Code perfekt (man versteht wirklich alles super) :rtfm:





hmm frage mich grad ob es ein große Sache diesen Code in eine externe Datei umzuändern ???:L 
und in Seminar es aufzurufen 


```
private void speichern() 
    
    {
		try{
		File file=new File("RandomAccessFile.java");
		Process p=Runtime.getRuntime().exec(file.getCanonicalPath( ));
			} 
                catch (Exception e){ System.out.println(e); }

 	}
```


----------



## jgh (17. Mrz 2011)

du bekommst keine erfolgsmeldung, "Kunde erfolgreich gespeichert.." ?
dann muss er dir eine Exception irgendwo fliegen...gib mal deine konsolenausgabe bitte.


----------



## jgh (17. Mrz 2011)

```
private void speichern() {
		String[] daten = new String[8];
		daten = copyDaten(daten);
		try {
			raf = new RandomAccessFile("C://Users//Cheffe//Desktop//daten.txt",
					"rw");
			raf.seek(raf.length());
			for (int i = 0; i < daten.length; i++) {
				raf.writeUTF(daten[i]);
			}
			JOptionPane.showMessageDialog(jFrame, "Der Teilnehmer " + daten[0]
					+ " " + daten[1] + " wurde erfolgreich gespeichert",
					"Speichern erfolgreich", JOptionPane.INFORMATION_MESSAGE);
			reset();
			raf.close();
		} catch (FileNotFoundException e) {
			JOptionPane.showMessageDialog(jFrame, e.getMessage());
			e.printStackTrace();
		} catch (IOException e) {
			JOptionPane.showMessageDialog(jFrame, e.getMessage());
			e.printStackTrace();
		}

	}
```

versuch mal zu speichern und sag mir bitte was passiert^^


----------



## IchBruderSonne (17. Mrz 2011)

hmm bei dieser Variante streikt der Compiler wegen copyDaten


----------



## jgh (17. Mrz 2011)

dir fehlt die Methode "copyDaten()" aus  diesem  Post


----------



## IchBruderSonne (17. Mrz 2011)

ach ja, habe ich noch in Kommentar gesetzt 

jetzt ist es wie vorher, 
das Fenster öffnet sich, 
wenn man auf speichern tippt, dann wird im hinteren Eingabefenster viel abgespielt
aber keine Datei abgespeichert, auch kein neues Fenster geöffnet wohin man es abspeichern soll

___________________

könnte es vielleicht dran liegen, dass ich Joe benutze ???:L  mit 
	
	
	
	





```
@Override
```
 wollte Joe ja auch nichts anfangen
___________________



 anklicken, dieses ungewöhnliche wird mir angezeigt ???:L

___________________


könnte es dran liegen, dass das JCheckBoxMenuItem (gibt ja nur 2 Werte false und true ) 
nicht so einfach abgespeichert werden kann ???:L

```
daten[6] = "garten=" + jCBMIGarten.isSelected();
```
daten ist ja vom typ String


hmmm ich würde notfalls die Daten einzeln abspeichern (schritt für schritt)
ohne die for Anweisung - sind ja nur 8 Daten abszuspeichern 
und die Datei kann nächstes mal einfach überschrieben werden (nur 1 Sitzung notwendig)


----------



## jgh (18. Mrz 2011)

> könnte es dran liegen, dass das JCheckBoxMenuItem (gibt ja nur 2 Werte false und true )
> nicht so einfach abgespeichert werden kann
> daten[6] = "garten=" + jCBMIGarten.isSelected();
> daten ist ja vom typ String


nein, erstens klappt es bei mir...und zweitens gibt die Methode jCBMIGarten.isSelected() ein boolean zurück und der wird mit einem String ("garten=") zusammengefrickelt...dann steht (bzw. sollte) da stehen: garten=true oder halt false.



> könnte es vielleicht dran liegen, dass ich Joe benutze mit @Override wollte Joe ja auch nichts anfangen


eher unwahrscheinlich...aber ich kenne JOE nicht^^


Dir fliegt irgendwo ne ArrrayIndexOutBoundsException...mmmh, bei mir nicht!
Hier nochmal mein gesamter Code...

in Zeile 269 wird der Ort des Speicherns festgelegt...hier jetzt bei dir auf dem Desktop.



```
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

import javax.swing.JButton;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Seminar {
	private JLabel jLabelname, jLabelbezeichnung, jLabelWohnort, jLabelTelefon,
			jLabelHobbys;
	private JTextField jTfVorname, jTfNachname, jTfBezeichnung, jTfWohnort,
			jTfTelefon;
	private JButton jBSpeichern, jBReset;
	private JCheckBoxMenuItem jCBMITanzen, jCBMISport, jCBMIGarten;
	private JMenuBar jMenuBar;
	private JMenu jMdatei;
	private JMenuItem jMISpeichern, jMIReset, jMIExit;
	private JFrame jFrame;
	private JPanel jPanel;
	private RandomAccessFile raf;

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

	public Seminar() {
		initFrameAndPanel();
		initLabels();
		initButtons();
		initCheckBox();
		initTextFields();

		initAndAddMenuBar();

		addComponentsToPanel();

		jFrame.pack();
		jFrame.setVisible(true);

	}

	private void initAndAddMenuBar() {
		jMenuBar = new JMenuBar();
		jMdatei = new JMenu("Datei");
		jMISpeichern = new JMenuItem("Speichern");
		jMISpeichern.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {
				speichern();

			}
		});
		jMIExit = new JMenuItem("Exit");
		jMIExit.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {
				System.exit(0);
			}
		});
		jMIReset = new JMenuItem("Reset");
		jMIReset.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {

				reset();
			}
		});

		jMdatei.add(jMISpeichern);
		jMdatei.add(jMIReset);
		jMdatei.addSeparator();
		jMdatei.add(jMIExit);

		jMenuBar.add(jMdatei);

		jFrame.setJMenuBar(jMenuBar);
	}

	private void addComponentsToPanel() {
		GridBagConstraints a = new GridBagConstraints();
		a.gridx = 0;
		a.gridy = 0;
		a.insets = new Insets(20, 5, 5, 5);
		a.anchor = GridBagConstraints.WEST;
		jPanel.add(jLabelname, a);

		GridBagConstraints b = new GridBagConstraints();
		b.gridx = 1;
		b.gridy = 0;
		b.insets = new Insets(5, 5, 5, 15);
		jPanel.add(jTfVorname, b);

		GridBagConstraints c = new GridBagConstraints();
		c.gridx = 2;
		c.gridy = 0;
		c.insets = new Insets(5, 5, 5, 15);
		c.anchor = GridBagConstraints.EAST;
		jPanel.add(jTfNachname, c);

		GridBagConstraints d = new GridBagConstraints();
		d.gridx = 0;
		d.gridy = 1;
		d.insets = new Insets(5, 5, 5, 15);
		jPanel.add(jLabelbezeichnung, d);

		GridBagConstraints e = new GridBagConstraints();
		e.gridx = 0;
		e.gridy = 1;
		e.insets = new Insets(5, 5, 5, 15);
		jPanel.add(jLabelbezeichnung, e);

		GridBagConstraints f = new GridBagConstraints();
		f.gridx = 1;
		f.gridwidth = 2;
		f.gridy = 1;
		f.insets = new Insets(5, 5, 5, 15);
		jPanel.add(jTfBezeichnung, f);

		GridBagConstraints g = new GridBagConstraints();
		g.gridx = 0;
		g.gridy = 2;
		g.insets = new Insets(5, 5, 5, 15);
		g.anchor = GridBagConstraints.WEST;
		jPanel.add(jLabelWohnort, g);

		GridBagConstraints h = new GridBagConstraints();
		h.gridx = 1;
		h.gridwidth = 2;
		h.gridy = 2;
		h.insets = new Insets(5, 5, 5, 15);
		jPanel.add(jTfWohnort, h);

		GridBagConstraints i = new GridBagConstraints();
		i.gridx = 0;
		i.gridy = 3;
		i.insets = new Insets(5, 5, 5, 15);
		i.anchor = GridBagConstraints.WEST;
		jPanel.add(jLabelTelefon, i);

		GridBagConstraints j = new GridBagConstraints();
		j.gridx = 1;
		j.gridwidth = 2;
		j.gridy = 3;
		j.insets = new Insets(5, 5, 5, 15);
		jPanel.add(jTfTelefon, j);

		GridBagConstraints k = new GridBagConstraints();
		k.gridx = 0;
		k.gridy = 4;
		k.insets = new Insets(5, 5, 5, 15);
		k.anchor = GridBagConstraints.WEST;
		jPanel.add(jLabelHobbys, k);

		GridBagConstraints l = new GridBagConstraints();
		l.gridx = 2;
		l.gridy = 4;
		l.insets = new Insets(5, 15, 5, 15);
		l.anchor = GridBagConstraints.WEST;
		jPanel.add(jCBMIGarten, l);

		GridBagConstraints m = new GridBagConstraints();
		m.gridx = 2;
		m.gridy = 5;
		m.insets = new Insets(5, 15, 5, 15);
		m.anchor = GridBagConstraints.WEST;
		jPanel.add(jCBMISport, m);

		GridBagConstraints n = new GridBagConstraints();
		n.gridx = 2;
		n.gridy = 6;
		n.insets = new Insets(5, 15, 5, 15);
		n.anchor = GridBagConstraints.WEST;
		jPanel.add(jCBMITanzen, n);

		GridBagConstraints o = new GridBagConstraints();
		o.gridx = 1;
		o.gridy = 7;
		o.insets = new Insets(5, 5, 5, 15);
		o.anchor = GridBagConstraints.CENTER;
		jPanel.add(jBSpeichern, o);

		GridBagConstraints p = new GridBagConstraints();
		p.gridx = 2;
		p.gridy = 7;
		p.insets = new Insets(5, 15, 5, 50);
		p.anchor = GridBagConstraints.WEST;
		p.fill = GridBagConstraints.BOTH;
		jPanel.add(jBReset, p);

	}

	private void initCheckBox() {
		jCBMIGarten = new JCheckBoxMenuItem("Garten");
		jCBMISport = new JCheckBoxMenuItem("Sport");
		jCBMITanzen = new JCheckBoxMenuItem("Tanzen");

	}

	private void initTextFields() {
		jTfBezeichnung = new JTextField(25);
		jTfNachname = new JTextField(10);
		jTfVorname = new JTextField(10);
		jTfWohnort = new JTextField(25);
		jTfTelefon = new JTextField(25);
		reset();
	}

	private void initLabels() {
		jLabelname = new JLabel("Name");
		jLabelbezeichnung = new JLabel("Bezeichnung");
		jLabelWohnort = new JLabel("Wohnort");
		jLabelTelefon = new JLabel("Telefon");
		jLabelHobbys = new JLabel("Hobbys");

	}

	private void initFrameAndPanel() {
		jFrame = new JFrame("Seminar");
		jFrame.setSize(new Dimension(500, 500));
		jFrame.setLocationRelativeTo(null);
		jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		jPanel = new JPanel();
		jPanel.setLayout(new GridBagLayout());

		jFrame.getContentPane().add(jPanel);

	}

	private void initButtons() {
		jBSpeichern = new JButton("Speichern");
		jBReset = new JButton("Reset");
		jBSpeichern.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {
				speichern();

			}
		});
		jBReset.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {
				reset();

			}

		});
	}

	private void speichern() {
		String[] daten = new String[8];
		daten = copyDaten(daten);
		try {
			raf = new RandomAccessFile(
					"C://Dokumente und Einstellungen//Janes//Desktop//daten.txt",
					"rw");
			raf.seek(raf.length());
			for (int i = 0; i < daten.length; i++) {
				raf.writeUTF(daten[i]);
			}
			JOptionPane.showMessageDialog(jFrame, "Der Teilnehmer " + daten[0]
					+ " " + daten[1] + " wurde erfolgreich gespeichert",
					"Speichern erfolgreich", JOptionPane.INFORMATION_MESSAGE);
			reset();
			raf.close();
		} catch (FileNotFoundException e) {
			JOptionPane.showMessageDialog(jFrame, e.getMessage());
			e.printStackTrace();
		} catch (IOException e) {
			JOptionPane.showMessageDialog(jFrame, e.getMessage());
			e.printStackTrace();
		}

	}

	private String[] copyDaten(String[] daten) {
		daten[0] = jTfVorname.getText();
		daten[1] = jTfNachname.getText();
		daten[2] = jTfBezeichnung.getText();
		daten[3] = jTfWohnort.getText();
		daten[4] = jTfTelefon.getText() + ",";
		daten[5] = "garten=" + jCBMIGarten.isSelected();
		daten[6] = "sport=" + jCBMISport.isSelected();
		daten[7] = "tanzen=" + jCBMITanzen.isSelected() + "\r\n";
		return daten;
	}

	private void reset() {
		jTfVorname.setText("Vorname");
		jTfNachname.setText("Nachname");
		jTfBezeichnung.setText("Berufsbezeichnung");
		jTfWohnort.setText("PLZ, Ort, Straße, Hausnummer");
		jTfTelefon.setText("Telefonnummer");
		jCBMIGarten.setSelected(false);
		jCBMISport.setSelected(false);
		jCBMITanzen.setSelected(false);

	}

}
```


----------



## IchBruderSonne (18. Mrz 2011)

och Mensch sage nicht so was  
ich habe bei der Methode copyDaten das letzte 
	
	
	
	





```
daten[7]
```
 rausgenommen um was auszutesten 
und später als ich es wieder eingefügt habe, 
habe ich vergessen es in der Meth. speichern wieder raufzusetzen 
	
	
	
	





```
String[8]
```
 (die 0 zählt ja mit)

genau deswegen stehe ich bei Java immer zwischen Verzweiflung und Faszination :shock: 
99,9 % alles super verstanden, 
aber an einer einzigen Zahl bei ca 10.000 Buchstaben im Programm gescheitert
ich werde es jetzt mal austesten *teu teu teu*




edit,:/ och man ich bin am ..... - genau das war der einzige (winzige) Fehler 
und ich grübelte gestern den ganzen Tag bis in die Nacht und sah es nicht :autsch: 
ich könnte mir selbst am ... naja ok gut^^

DANKE^10 :toll: Programm arbeitet jetzt perfekt


----------

