# Arrayinhalt nach Klicken des Buttons im Fenster ausgeben



## Sweetsister (7. Dez 2009)

Guten Morgen,

ich bin blutiger Java-Anfänger, neu hier, studiere Info und sitze an einer Hausaufgabe, an der ich mir an einer Stelle die Zähne ausbeiße.

[Java]import javax.swing.*;
import java.awt.event.*;
import javax.swing.JTextField;

public class Button1 extends JFrame implements ActionListener{

	JButton meinButton;
	JTextField ausgabe;
	enum Wochentag{MONTAG,DIENSTAG};


	public static void main(String[] args){
		Button1 test = new Button1();
		test.los();
	}

	public void los(){
		JFrame fenster1 = new JFrame();
		meinButton = new JButton("Klicken");

		meinButton.addActionListener(this);

		fenster1.getContentPane().add(meinButton);
		fenster1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		fenster1.setSize(200,200);
		fenster1.setVisible(true);

	}

	@Override
	public void actionPerformed(ActionEvent event) {
		for(Wochentag tag: Wochentag.values()){
		  //hier fehlt mir was	
		}


	}	
}
[/Java]

Und zwar möchte ich gerne den Inhalt des enum Wochentag in dem Fenster ausgeben lassen, das sich mit dem Button öffnet. Bisher klappt die Ausgabe gut auf der Konsole, aber eben nicht im Fenster. Nun habe ich lange gegoogelt, das eine oder andere Buch wegen GUI gewälzt und vieles ausprobiert, aber das klappt und klappt nicht.

Könnt ihr mir helfen?

Liebe Grüße 
Sandra


----------



## KrokoDiehl (7. Dez 2009)

Naja, wenn du eine GUI hast, dann brauchst du dort auch etwas, wo die Ausgabe hinsoll. Sprich soll sie in ein Textfeld, soll sie auf ein Label, auf den Fenstertitel, in einen extra Dialogfenster... 
Sprich du musst dir überlegen, wohin die Ausgabe soll.
Als erster Ansatz kannst du dies mal probieren:

```
@Override
    public void actionPerformed(ActionEvent event) {
        String tage = "";
        for(Wochentag tag: Wochentag.values()){
          //hier fehlt mir was  
            tage += tag.toString() + ", ";
        }
        
        //Anzeigen eines Nachrichtenfensters
        JOptionPane.showMessageDialog(this, tage);
    }
```


----------



## Sweetsister (7. Dez 2009)

Das habe ich jetzt lange mit dem Textfeld probiert, aber anders Und wenn ich mir deinen Vorschlag anschaue, dann weiß ich auch, warum das nicht getan hat

Ich probier das mal gleich aus


----------



## Sweetsister (7. Dez 2009)

Wie ist das denn, wenn ich ein Textfeld im ursprünglichen Fenster mit dem Inhalt des enum-Typs anzeigen lassen will? Ich hab genau das vorher probiert und probiert, aber das wollte einfach nicht. Erst hab ich das mit dem Textfeld in der actionPerfomed.Methode versucht, aber eclipse mochte das gar nicht. Dann hab ich das als extra Methode versucht, aber das wollte auch nicht. Und ich finde auch in google nicht viel dazu. Ich hab mit GUIs erstellen keine Erfahrung.


----------



## eRaaaa (7. Dez 2009)

naja, zunächst einmal musst du das textfeld auch auf das panel bzw frame adden:


```
fenster1.add(ausgabe, BorderLayout.CENTER);
	fenster1.add(meinButton, BorderLayout.NORTH);
```

und dann kannst du in deiner actionPerformed doch genauso wie eben durch die enums iterieren:
(irgendiwe so  )


```
@Override
    public void actionPerformed(ActionEvent event) {
	for (Wochentag tag : Wochentag.values()) {
	    ausgabe.setText(ausgabe.getText() + tag + ", ");
	}
```


----------



## KrokoDiehl (7. Dez 2009)

*EDIT: boaaaah... *

Ah ok. Ich sehe jetzt erst, dass du in deinem Frame schon ein Textfeld hast wo die Ausgabe reinsoll  ...naja, ist ja noch früh.

Also ein wichtiger wie komplexer Punkt bei GUIs ist das Layouting, spricht die Anordnung aller Komponenten auf der Oberfläche. In deinem Fall hast du einen Button und ein Textfeld. Hier geben sich schon mehrere Möglichkeiten, wie man diese anordnen kann (übereinander, nebeneinander, ...).
In Java (Swing) wird dies über _LayoutManager _geregelt. Wenn man einen _JFrame _(bzw. _JDialog_) hat, haben diese von "Natur aus" ein _BorderLayout_. Damit kann man für den Anfang schonmal viel mit machen.
Hier ist ein Link zu einigen Sun-Tutorials bzgl. der vielen _LayoutManager_.

In deinem konkreten Fall wird das Textfeld aber nicht erstellt und nicht gelayoutet. Daher schlage ich folgende Veränderung an der Methode 
	
	
	
	





```
los()
```
 vor:
[JAVA=17]
    public void los(){
        JFrame fenster1 = new JFrame();
        meinButton = new JButton("Klicken");
        meinButton.addActionListener(this);

        // Textfeld auch erstellen: hier erstmal mit leerem Text
        ausgabe = new JTextField();

        // aufs BorderLayout zugreifen: Der Button nach unten
        // das Textfeld darüber
        fenster1.getContentPane().add(ausgabe,    BorderLayout.NORTH);
        fenster1.getContentPane().add(meinButton, BorderLayout.SOUTH);
        fenster1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        fenster1.setSize(200,200); //hier könnte auch ein fenster1.pack() genügen
        fenster1.setVisible(true);

    }
[/code]
Wenn du das hast, müsstest du das Textfeld in der GUI sehen. 
In der Methode 
	
	
	
	





```
actionPerformed()
```
 kannst du dann meine Zeile 
	
	
	
	





```
JOptionPane.showMessageDialog(this, tage)
```
;
mit 
	
	
	
	





```
ausgabe.setText( tage );
```
 ersetzen.


----------



## Sweetsister (8. Dez 2009)

Guten Morgen,

danke für die Antworten
Ich war leider gestern nicht mehr online(->Vorlesungen, Auto in Werkstatt, etc). Ich setze mich da nachher nochmal dran.

Grüße
Sandra


----------



## Sweetsister (9. Dez 2009)

Guten Morgen

ich hab das probiert und das sieht gut aus. Nun muss ich zu meiner Schande gestehen, dass ich in der Aufgabe etwas überlesen habe und noch eine Frage habe. In der Aufgabe heißt es, man soll nach dem Button-Klick nacheinander die Wochentage ausgeben.

Meine Frage ist: Macht man das über einen Thread? Nacheinander ausgeben bedeutet doch zeitverzögert? So hätte ich den Thread aber nicht verstanden, müsste aber doch gehen wegen der Sleep-zeit?

Grüße
Sandra


----------



## KrokoDiehl (9. Dez 2009)

"Nacheinander ausgaben" bedeutet meines Erachtens eher sowas wie

```
System.out.println("ausgabe 1");
System.out.println("ausgabe 2");
System.out.println("ausgabe 3");
...
System.out.println("ausgabe n");
```
Wobei das, was du in deinem Textfeld schon schreibst, auch zu dieser Aufgabe passt. Weil im Textfeld werden die Tage ja nacheinander ausgegeben...


----------



## Sweetsister (9. Dez 2009)

Es ist etwas missverständlich formuliert

Wir hatten davor 1 Jahr lang Ada und im Moment versuche ich, Java zu lernen OHNE Ada-Syntax mit reinzumischen Und in Ada wäre das eine Schleife gewesen mit Ausgabe nach Index. Aber da wir nun Threads hatten und da die Ausgabe nacheinander gegangen wäre, war ich mir sehr unsicher, was nun genau gewollt ist.

Danke


----------



## Sweetsister (9. Dez 2009)

Ich hab doch mal nachgefragt: Nacheinander heißt in dieser Aufgabenstellung, dass mit jedem Klick des Buttons ein Wochentag angezeigt wird. Also 1.Klick: Montag, 2.Klickienstag, usw.


mh, jetzt überleg ich grad, wie das umgesetzt wird:noe: das sind ja sieben Klicks(bzw. beliebig) und bei jedem Klick wird ein ActionPerformed benötigt? Da würde ich spontan NEIN sagen, ansonsten fällt mir noch eine Schleife ein. Aber da die Methode reinpacken?

Also grad etwas ratlos....


----------



## KrokoDiehl (9. Dez 2009)

Naja, da es immer der gleiche Button ist, ist es auch sinnvoll immer die gleiche 
	
	
	
	





```
actionPerformed()
```
 aufzurufen.
Du kannst die Anzahl der Klicks ja mitzählen... *in den Raum werf*


----------



## Sweetsister (9. Dez 2009)

Ein Klick auf den Button= 1 Mal die actionPerformed aufgerufen, oder? Dann muss ich doch nach dem Klick zählen.

Das enum ist doch ein Array aus Strings? Jetzt habe ich nochmal im Internet geschaut und experiementier gerade mit nextElement() und HasMoreElements(), aber ich krieg das nicht hin;(


----------



## KrokoDiehl (9. Dez 2009)

Nein ich meine das mit dem Zählen anders 
Aufbauend auf dein initial gepostetes Beispiel:

```
...
    protected int klicks = 0;
    ...

    public void actionPerformed(ActionEvent event)
    {
        klicks++;
        // jetzt Ausgabe abhängig von den Klicks machen...
        // Nächste Aufgabe:    >:-)
        //  Was passiert wenn man nun mehr als 7x klickt?
    }
    ...
```


----------



## Sweetsister (9. Dez 2009)

*aargh* Warum hab ich den Zähler am Ende der actionPerformed gesetzt bei mir?? 

Ginge das mit einer while-Schleife, also so:


```
...
while (klicks<=7){
    for(Wochentag tag: Wochentag.values()){
        ausgabe.setText(ausgabe.getText() + tag + ", ");
    }
}
```

Vor allem: Wie gibt er dann bei jedem Klick den entsprechenden Tag aus? Indizes vergleichen von while-schleife und enum-Typ? (Ich hab so viel jetzt darüber gelesen, ich hab Chaos im Kopf)

Wenn es nun größer wäre wie 7, wird nichts mehr ausgegeben. Und nun frage ich mich, ob das so okay wäre? Weil bei größer 7 geht er ja nicht in die Schleife. Andernfalls wäre ja eine Endlosschleife denkbar, wenn ich also nicht will, dass die Ausgabe stoppt und ich müsste einen weiteren Button einfügen, um stoppen zu können, bzw. wenn halt das Fenster geschlossen wird?


----------



## eRaaaa (9. Dez 2009)

hi,
ich hab jetzt zwar nur so halb durchgelesen worum es geht, aber du kannst doch einfach eine zählvariable in deinem programm nutzen, welche bei jedem klick erhöht wird.

in deiner actionPerformed, holst du dir dann, den x. (also entsprechenden) wochentag z.b. montag
z.b. so:

```
int zaehler = 0// hier ist die aktuelle klickanzahl gespeichert die immer hochgezählt wird
....
//hier deine action:
zaehler++;
Wochentag.values()[x-1]; //arrays fangen ja bei 0 an
```

so kommst du dann halt an den x. wochentag (wenn du nun mehr als 7 klicks hast, könntest du das ja so machen, dass dann autmotatisch wieder bei 0, bzw montag oder wie auch immer begonnen wird, (modulo also?? ))


```
Wochentag.values()[(x%7)-1];
```


----------



## Sweetsister (9. Dez 2009)

*andiestirnpatsch* und wenn ich nun ein wenig über Arrays nachgedacht hätte, wäre ich dahinter gekommen, wie ich Wochentage durchlaufen kann.

Das hab ich heute morgen wie eine Blöde im Internet gesucht, wie man enum durchläuft *gna*

Danke, danke, danke

Ich setze mich nachher nochmal dran. Ich hab das grad probiert und soweit tut es bis 7 (also nur Zähler). Wenn ich das Ganze mit Modulo mache (ohne 1 abzuziehen), dann fängts bei Dienstag an(klar, Mo. sitzt auf 0). Wenn ich aber dann 1 abziehe, dann macht er bei Sonntag Zicken(klar, 7 mod 7 = 0 und dann noch -1, geht nicht). Ich weiß, wir hatten das mal in Ada. Ist halt lang her und ich muss da erstmal brainen
Da werde ich mich nachher nochmal ranmachen. Ich setz mich jetzt an NumStoch (mal das Gebiet wechseln).

Grüße 
Sandra


----------



## KrokoDiehl (9. Dez 2009)

> Ich setz mich jetzt an NumStoch (mal das Gebiet wechseln).


Hm, das übersteigt meine geografischen Kenntnisse


----------



## eRaaaa (9. Dez 2009)

Sweetsister hat gesagt.:


> Wenn ich das Ganze mit Modulo mache (ohne 1 abzuziehen), dann fängts bei Dienstag an(klar, Mo. sitzt auf 0). Wenn ich aber dann 1 abziehe, dann macht er bei Sonntag Zicken(klar, 7 mod 7 = 0 und dann noch -1, geht nicht)



jepp, war ein denkfehler von mir, sry. (lass das -1 weg und erhöhe den zähler einfach nach dem arrayzugriff,das sollte funktionieren ;D )

(du könntest natürlich auch ohne modulo zu benutzen mit einer if abfrage und dann den zähler zurücksetzen.oder wie auch immer..meins sollte ja eh nur als beispiel dienen *rausred* )


----------



## Sweetsister (9. Dez 2009)

@eRaaaa:

*lach*
Nein, wir haben das oft so gemacht. Ich hab eigentlich die ganze Zeit den Index vom Array gesucht, um das stilgerecht in eine Schleife packen zu können (oder eben in eine if). 

@KrokoDiehl:

Numerik-Stochastik (Mathe im 3. SEmester) macht im Grunde riesigen Spaß

@beide:

Ich bin euch für eure Hilfe einfach dankbar

Bis später*wäschewaschengeh*


----------



## Sweetsister (9. Dez 2009)

Ich ha-hab´s


```
public void actionPerformed(ActionEvent event) {  
		   
		 if (zaehler <= 7){
		    ausgabe.setText(ausgabe.getText() + Wochentag.values()[zaehler]+ ("  "));
		    zaehler++;
		 }
			 zaehler=zaehler%7;
	   }
```

Jetzt müsste ich nur mal wissen, wo ich schauen kann, wie ein Zeilenumbruch funktioniert. Geht das über den Layout-Manager? ICh dachte, ich hätte was mit FlowLayout gelesen?
Oder geht das anders?

Grüße
Sandra


----------



## KrokoDiehl (10. Dez 2009)

Da du ein _JTextField _benutzt, wird nichts mit Zeilenumbruch gehen (glaube ich zumindest nicht).
Generell wird ein Zeilenumbruch durch 
	
	
	
	





```
"\n"
```
 als String geschrieben. Damit er aber auch angezeigt wird, solltest du vom _JTextField _auf eine _JTextArea _wechseln. Denke das müsste genügen.
Ein _LayoutManager _hat damit erst einmal nichts zutun.


----------



## Ebenius (10. Dez 2009)

KrokoDiehl hat gesagt.:


> Da du ein _JTextField _benutzt, wird nichts mit Zeilenumbruch gehen (glaube ich zumindest nicht).


Du glaubst richtig. JTextArea it is.

Ebenius


----------



## Sweetsister (10. Dez 2009)

Ja und das tut sogar *freu*

Ich hab jetzt ein bisserl mit dem TextArea gespielt und die Fenstergröße etwas angepasst und nun passt das ganz gut. Er macht den Umbruch und er regelt die Wortzerteilung, sprich: wenn´s zerteilt werden sollte, setzt er es in die nächste Zeile

Nur eines war nicht wirklich erkennbar:

Was passiert denn, wenn ich bei TextArea die Tabulatorbreite bestimme? Was sollte da denn passieren? Verschiebt er den Zeilenanfang um die Größe, die ich ihm gebe?

Grüße
Sandra (mit dem Torling kämpf)


----------



## KrokoDiehl (10. Dez 2009)

Kennst du die Java SE API Dokumentation? Bei so Fragen hilft sie recht oft 
Hiermit ist gemeint, wie viele Leerzeichen ein Tabulator entspricht: Ein Wert von 2 sagt, dass ein Tabulator 2 Leerzeichen breit ist.


----------



## Sweetsister (10. Dez 2009)

Auf der API bin ich recht oft, aber manchmal versteh ich den Aufbau nicht ganz


Wann kommt das zum Greifen? Ist das Benutzereingabe?

Nachtrag: Ich war gerade mal auf der API, aber da wird das nicht wirklich erklärt (oder hab ich was überlesen?)


----------



## KrokoDiehl (10. Dez 2009)

Jaaa... gut, das konkrete Beispiel ist nicht so hilfreich 

Zum Greifen kommt das _TabSize_, wenn du in der TextArea die Tabulatortaste drückst (oder als Text ein 
	
	
	
	





```
\t
```
 setzt).
Ein kleines Beispiel:

```
JTextArea area = new JTextArea("links\trechts");
area.setTabSize(40);
```
Hier hast du eine 40-Leerzeichen-breite Lücke zwischen den Wörtern "links" und "rechts". Das Gleiche erhältst du, wenn du in dem Feld Tabulator eingibst.


----------



## Sweetsister (10. Dez 2009)

Aah, okay Ich wusste nicht, das man ins Textfeld klicken kann 

Ich hab´s - natürlich - gleich mal probiert und etwas gespielt.....dann bin ich ja mal gespannt, wann ich das brauche

Grüße 
Sandra ("Torling" gleich umbring)

Torling = Java.InfoIII.Projekt


----------

