# Zeilenumbruch in JLabel



## Markus09 (10. Sep 2012)

Hallo Java-Junkies,

habe schon x-mal gelesen das man mittels html mehrzeilige Label verwenden kann.

aber i-wie funktionieren die Beispiele bei mir nicht. 

1. Code normal: 
	
	
	
	





```
...new JLabel ("1. 2. 3.");
```

2. Code mit HTML: 
	
	
	
	





```
...new JLabel ("<html>1. <b>2.</b><b>3.</b></html>");
```

in der 2. Variante erschein bei mir kein Text.

Weiss jemand warum?

Danke!!!


----------



## Camino (10. Sep 2012)

Hmm, was ist denn zu sehen? Garnichts? Wenn ja, woher weisst du dann, ob das Label überhaupt angezeigt wird? Oder vielleicht ist das Label zu klein. Hast du dem Label eine Grösse gegeben oder ist es in einem LayoutManager drin? Oder irgendwas mit der Farbe. Zeig doch mal mehr Code, wie du das JLabel benutzt. Zeilenumbruch in HTML machst du übrigens mit <br>.


----------



## Markus09 (10. Sep 2012)

Hi Camino,

danke für die superschnelle antwort. Das <br> war nen schreibfehler meinerseits.


```
text1 = new JLabel ("<html>1. <br>2.</br><br>3.</br></html>");
text1.setBounds(100, 100, 300, 300);
add(text1);
```

Sobald ich das <html></html> eingebe bei auch nur einem Wort z.B.:

```
text1 = new JLabel ("<html>1. </html>");
```

ist zumindest der Textvom Label oder das Label weg.

Das Fenster ist übrigens 800, 500 groß.


----------



## Pentalon (10. Sep 2012)

So klappt das:

```
JLabel lab2 = new JLabel ("<html>1.<br>2.<br>3.</html>");
```

Pentalon


----------



## Markus09 (10. Sep 2012)

Hi Pentalon,

so klappts leider auch nicht. Schau mal meinen 2. Post an, da habe ich grad erklärt was passiert.


----------



## Camino (10. Sep 2012)

Markus09 hat gesagt.:


> Hi Camino,
> 
> danke für die superschnelle antwort. Das <br> war nen schreibfehler meinerseits.
> 
> ...



Mach doch mal das JLabel grösser (bei den setBounds), oder nimm einen LayoutManager...


----------



## Pentalon (10. Sep 2012)

Markus09 hat gesagt.:


> Hi Pentalon,
> 
> so klappts leider auch nicht. Schau mal meinen 2. Post an, da habe ich grad erklärt was passiert.



Ja, wir haben wohl gleichzeitig geschrieben  Dein Posting war vorher noch nicht da.
Ich muss das Fenster zwar mit der Maus aufziehen, aber das mehrzeilige Label sehe ich dann.

Pentalon


----------



## Markus09 (10. Sep 2012)

Größer machen bringt nichts.
und bei 'nem Layout-manager bin ich noch unerfahren.
Ich stehe grade am Anfang meiner Programmierkentnisse mit Java.


----------



## Camino (10. Sep 2012)

Hmm, hast du in deinem Fenster noch andere Elemente, die das JLabel evtl. überdecken? Wo und wie fügst du das JLabel hinzu? Du musst wohl doch noch den ganzen Code (zumindest den Fensteraufbau) zeigen. Übrigens: manche Komponenten in Swing haben einen Standard-LayoutManager, so z.B. der JFrame das BorderLayout und das JPanel das FlowLayout. Wenn du dann nicht setLayout(null) explizit aufrufst, dann nützt dir dein setBounds auch nix.


----------



## Markus09 (10. Sep 2012)

Ha, es ist doch da, 

Dank Pentalon!

ich hatte die Größeneinstellung meines fensters auf false. Dann war da nie das "umbrochene" Label zu sehen, aber die Aussage von Pentalon


> Ich muss das Fenster zwar mit der Maus aufziehen, aber das mehrzeilige Label sehe ich dann.



hat dann die Lösung gebracht. Ich habs genau wie ER gemacht (natürlich vorher vergrößern/verkleinern erlaubt), und es geht.

Was mich dann aber zu der Frage führt: Warum das so ist? und: Wie kann ich das beheben?
Ach ja, Andere Elemente habe ich (noch) nicht.


----------



## Pentalon (10. Sep 2012)

Markus09 hat gesagt.:


> Größer machen bringt nichts.
> und bei 'nem Layout-manager bin ich noch unerfahren.
> Ich stehe grade am Anfang meiner Programmierkentnisse mit Java.




```
JLabel lab2 = new JLabel ("<html>1. Labelzeile<br>2. Labelzeile<br>3. Labelzeile</html>");
```

Pentalon


----------



## AccVergessen (12. Sep 2012)

versuchs mal mit der escape-sequence "\n";

z.b. 


```
JLabel lblText = new JLabel("This is a\ntext with more than\none line :)");
```


----------



## bERt0r (12. Sep 2012)

> Was mich dann aber zu der Frage führt: Warum das so ist? und: Wie kann ich das beheben?
> Ach ja, Andere Elemente habe ich (noch) nicht.


Indem du einen Layoutmanager verwendest. Gewohn dir den null Layout murks gar nicht erst an, es ist viel mehr Arbeit als einen Layoutmanager zu verwenden denn das ganze setBounds etc. macht alles der Layoutmanager für dich.


----------



## Markus09 (12. Sep 2012)

So,

nun hab ich einen Layout-Manager verwendet. Aber ich habe ein Problem: Es erscheint kein Text.
Hier mal der/die Codes:

1. Hauptprogramm:

```
package packageOne;

import javax.swing.JFrame;

public class Hauptprogramm {
	
	public static void main(String[] args){
		JFrame Fenster = new Fenster();
		
	}
}
```

2. Das Fenster (hab eine eigene Klasse erstellt damit ich öfters aus meinem Hauptprogramm darauf zugreifen kann:

```
package packageOne;

import java.awt.FlowLayout;
import javax.swing.JFrame;

public class Fenster extends JFrame{
		
	FlowLayout Layout1;
	
		public Fenster() {
		
		setLayout(Layout1);
		setVisible(true);
		setSize(650, 500);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLocationRelativeTo(null);
		setResizable(true);
		
	}
}
```

3. Ein Panel mit dem Layoutmanager:

```
package packageOne;

import java.awt.FlowLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Layout1 extends JFrame{
		
	JLabel text1;	
		
	Layout1(){
		
		super("Matheprogramm");
		setLayout (new FlowLayout());
		
		text1 = new JLabel ("Hallo Welt!");
			
		add(text1);
	}
	
}
```

Der Code ist nach Büchern, Tut's gund eigeninitiative geschrieben, da ich noch Anfänger bin. Vielleicht kann mir ja jemand sagen Wo ich nen Fehler gemacht habe, da Eclipse keine Fehler meldet.


----------



## Thorakas (12. Sep 2012)

Du erzeugst von deiner Klasse 'Layout1' doch kein Objekt - dann werden deine Komponenten natürlich auch nicht erzeugt und angezeigt.


----------



## Markus09 (12. Sep 2012)

Wenn ich das Objekt "new Layout1" erzeuge,

```
FlowLayout Inhalt = new Layout1();
```

dann erhalte ich folgenden Fehler: *Type mismatch: cannot convert from Layout1 to FlowLayout*


----------



## Pentalon (12. Sep 2012)

Hi Markus

Probiere das:


```
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
 
public class JLabelTest {
 
    public static void main(String[] args) {

        JFrame frame = new JFrame();
        frame.setLayout(new GridLayout(2,2));

        JLabel lab1 = new JLabel ("1. 2. 3.");
        JLabel lab2 = new JLabel ("<html>1. Labelzeile<br>2. Labelzeile<br>3. Labelzeile</html>");
        JLabel lab3 = new JLabel ("<html>Zeile1<br>Zeile2<br>Zeile3<br>Zeile4<br>Zeile5<html>");
        
        frame.add(lab1);
        frame.add(lab2);
        frame.add(lab3);
        
        frame.setSize(650, 500);
        frame.setVisible(true);
    }
}
```

Pentalon


----------



## Markus09 (12. Sep 2012)

Danke Pentalon,

Pinzipiell funktioniert das, allerdings möchte ich das Label gerne in der Layoutklasse definieren, nicht in der Hauptklasse und da hab ich wieder das problem, das es dann iwie nicht funktioniert.


----------



## Thorakas (12. Sep 2012)

Dann zeig doch bitte, was genau du probiert hast.


----------



## Camino (12. Sep 2012)

Markus09 hat gesagt.:


> Wenn ich das Objekt "new Layout1" erzeuge,
> 
> ```
> FlowLayout Inhalt = new Layout1();
> ...



Das geht so natürlich auch nicht. Die Klasse Layout1 ist ja nicht vom Typ FlowLayout. Wenn, dann so:

```
Layout1 inhalt = new Layout1();
```

Und auch das stimmt nicht:


> 3. Ein Panel mit dem Layoutmanager:
> 
> ```
> public class Layout1 extends JFrame{
> ...


Das ist kein Panel, sondern eine Klasse abgeleitet von JFrame, also eigentlich ein Frame. Änder das doch mal in 
	
	
	
	





```
extends JPanel
```
 um und füge es dem JFrame mit add hinzu, und nicht mit setLayout...

Und du hast immer noch bei deinem JFrame das setVisible(true) mittendrin, anstatt erst am Ende. Du musst erst die Komponenten erstellen und dem Frame hinzufügen und dann zum Schluss das setVisible(true) aufrufen.

Du bringst da einige Sachen durcheinander...


----------



## Markus09 (12. Sep 2012)

Habe den Code von Pentalonin mein Hauptfenster kopiert und entsprechend angepasst.


```
package packageOne;

import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Hauptprogramm {
	
	public static void main(String[] args) {
		
		JFrame Fenster = new Fenster();
		Fenster.setLayout(new GridLayout(2,2));
		 
		JLabel lab1 = new JLabel ("<html>Hallo Welt! Hallo Welt! Hallo Welt! Hallo Welt! Hallo Welt! Hallo Welt!</html>");
		Fenster.add(lab1);
		
        Fenster.setSize(650, 500);
		Fenster.setVisible(true);
		
	}
}
```

... wie gesagt so funktionierts zwar, aber ich möchte das es im Layoutfenster steht.


----------



## Pentalon (12. Sep 2012)

```
public class Hauptprogramm {
    
    public static void main(String[] args){
        new Fenster();
    }
}
```


```
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
 
public class Fenster extends JFrame {

	public Fenster() {

		add(new JLabel("Hallo Welt!"));

		setLayout(new GridLayout(2,2));
		setSize(650, 500);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLocationRelativeTo(null);
		setResizable(true);
		setVisible(true);
	}
}
```

Pentalon


----------



## Camino (12. Sep 2012)

Ich änder jetzt mal deinen geposteten Code ab.

1. Hauptprogramm:

```
package packageOne;

import javax.swing.JFrame;

public class Hauptprogramm {
	
	public static void main(String[] args){
		new Fenster();
		
	}
}
```

2. Das Fenster (= der JFrame)

```
package packageOne;

import javax.swing.JFrame;

public class Fenster extends JFrame{
		
	private Layout1 myPanel;
	
		public Fenster() {

		setSize(650, 500);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLocationRelativeTo(null);
		setResizable(true);

		myPanel = new Layout1();

		add(myPanel);

		setVisible(true);
		
	}
}
```

3. Ein Panel (!!!) mit dem Layoutmanager:

```
package packageOne;

import java.awt.FlowLayout;
import javax.swing.JPanel;
import javax.swing.JLabel;

public class Layout1 extends JPanel{
		
	JLabel text1;	
		
	Layout1(){
		
		setLayout (new FlowLayout());
		
		text1 = new JLabel ("Hallo Welt!");
			
		add(text1);
	}
	
}
```


Ich hoffe, dass ich jetzt nichts übersehen habe...

EDIT: Das JPanel hat als Standard das FlowLayout, braucht man also eigentlich nicht mehr explizit zuweisen und kann dort weg.


----------



## Markus09 (12. Sep 2012)

Hallo Camino, Ich hab mal deinen Code genommen und angepasst.

Meine Frage ist nun, wenn ich ein neues Fenster erzeugen will (ohne das Panel), kann ich dann wieder auf meine Fenster-Klasse zu greifen, oder muß ich mir nen ein neus "Fenster" erstellen?


----------



## Camino (12. Sep 2012)

Nein, normalerweise erstellst du dir nur einmal zu Beginn ein Fenster (JFrame) und das ganze Programm läuft dann dort drin ab. Wenn du innerhalb dem Frame dann etwas anderes anzeigen möchtest, kannst du dort den Inhalt austauschen oder ändern.


----------



## Andy17 (12. Sep 2012)

Servus,

ich hab zwar die letzten Kommentare alle nicht gelesen (War mir dann doch zuviel Arbeit  ), außer dem Vorletzten, würde dir aber empfehlen der einfach heit halber für alle deine Klassen, die du mehrmals verwenden willst eine sog. Main/Oberklasse zu entwerfen und dir die einzelnen Komponenten aus einer XML zu laden. Sozusagen deine Config.
Falls benötigt, kann ich gerne beispielcode posten, ansonsten sollten dir die auf dieser Seite gelisteten Links weiterhelfen:

Java XML Tutorial

LG Andy


----------



## Markus09 (12. Sep 2012)

@Camino: hm, hast ja eigentlich recht,

würde aber mit meinen Vorstellungen nicht übereinstimmen.

Gut; ich erklär das kurz:
Im "Start"-(oder auch Haupt-)fenster befindet sich 
1. der Text (das Panel), 
2. ein Eingabefeld, 
3. ein Weiter-Button. 

Beim Klicken auf den Button soll ein "neues" Fenster oder cas bestehende neu sortiert werden (kein Panel mehr, kein Eingabefeld, nur noch 4 Buttons) erscheinen.

@Andy17:Ja soetwas wäre nicht schlecht, da ich aber grade am Anfang bei Java bin, ist vieles immer noch neuland für mich, bei deinem link werde ich mich bei zeiten durchlesen. Danke Dir.

Gruß Markus


----------



## Camino (12. Sep 2012)

Markus09 hat gesagt.:


> Beim Klicken auf den Button soll ein "neues" Fenster oder cas bestehende neu sortiert werden (kein Panel mehr, kein Eingabefeld, nur noch 4 Buttons) erscheinen.



Dafür gibt es z.B. die Möglichkeit des CardLayouts, d.h. du erstellst mehrere Panels, fügst sie dem CardLayout hinzu und steuerst dann, welches dieser Panel angezeigt wird. Kann man sich in etwa wie ein Kartenstapel vorstellen, bei dem das oberste Panel zu sehen ist. In deinem Fall wäre das erste Panel mit dem Eingabefeld und das zweite Panel mit den 4 Buttons. Es gibt halt mehrere Möglichkeiten, den Programmablauf zu steuern und das anzuzeigen, was du möchtest. Hängt halt immer davon ab, was du tun willst.

Und bevor du mit dem erstellen deiner Komponenten über XML anfängst, solltest du auf jeden Fall erst mal mit den Swing-Grundlagen (Komponenten, LayoutManager) einigermassen vertraut sein.


----------



## Markus09 (12. Sep 2012)

Mir scheint, das Java mir da sehr viel Spielraum gewährt. Ich habe ähnliches mal mit VB angefangen und bin schnell an Grenzen gestoßen, was meine Vorstellung angeht. Schließlich habe ich dann aufgegeben. Ich habe so den Verdacht, das dieses mit Jave nicht (oder zumindest nicht so schnell) passieren wird. Naja ich werd erstmal schlafen gehen, unb dann morgen weitermachen. Gute N8!!


----------



## Camino (12. Sep 2012)

An deine Grenzen wirst du so schnell nicht stossen. Du musst dir einfach nur überlegen, was du haben möchtest, und dann lässt sich das mit Java meist irgendwie hinkriegen. Entweder es gibt dafür schon fertige Komponenten oder Lösungen, oder man muss sich das eben so "hinbiegen" wie man es haben will.


----------



## Andy17 (12. Sep 2012)

1. GN8

2. Warum machst du es nicht einfach so:

```
Frame.add(Button1);
```
und nach dem Buttondruck

```
Frame.remove(Button1);
Frame.add(Button1ERSATZ);
```
oder, wie oben schon angemerkt mit dem Cardlayout?

Hoffe ich hole hier nicht alte Lösungen wieder hoch, wie gesagt, war zu faul mir alles weiter als den letzen Post und einige der ersten durchzulesen.


----------



## Markus09 (13. Sep 2012)

So, ich habe es doch etwas anders gemacht. da ich das Panel/Label so wie es grad ist ja nur 1x verwenden möchte, habe ich es auch ins Hauptfenster gepackt. Nun kann ich immer an jeder beliebegen Stelle im Programm ein neues LEERES Fenster erzeugen.

Hauptprogramm:


```
package packageOne;

import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Hauptprogramm {
	
	public static void main(String[] args) {
		
		JFrame Fenster = new Fenster();
		
		Fenster.setLayout(new GridLayout(2,2));
			
			JLabel text1 = new JLabel ("<html>Hallo Welt! Hallo Welt! Hallo Welt! Hallo Welt! Hallo Welt! Hallo Welt!</html>");
		            
			Fenster.add(text1);
		
			Fenster.setSize(650, 500);
			Fenster.setVisible(true);
	}
}
```

Fenster:


```
package packageOne;

import javax.swing.JFrame;

public class Fenster extends JFrame {
		
		public Fenster() {
		
		setSize(650, 500);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLocationRelativeTo(null);
		setResizable(true);
		setTitle("Matheprogramm");
	}
}
```

Allerdings habe ich nun ein Problem; ich kann das label jetzt nun nicht mehr in Größe oder Position ändern, was ich gerne möchte um es meine Vorstellungen im Fenster anzupassen.


----------



## Camino (13. Sep 2012)

Markus09 hat gesagt.:


> Nun kann ich immer an jeder beliebegen Stelle im Programm ein neues LEERES Fenster erzeugen.



:bahnhof: Ich geb's auf...


----------



## Andy17 (13. Sep 2012)

Hey, ich würde dir generell mal einen etwas anderen Programmierstil empfehlen:

Zuerst dein Package-Name (Wie immer)
Dann deine Importe
Dann deine Deklarationen, welche du static halten möchtest
Dann deine Methoden (public static oder protected, je nachdem, was du damit machen möchtest, wo die Methode sichtbar sein soll)
-> In die Methoden die nicht statischen Deklarationen (nur Methodenabhängig)
Dann deine MainMethode
Und dann das Klassenende.

Hier dein "Hauptprogrammcode" umgestellt:

```
package packageOne;
 
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
 
public class Hauptprogramm {

public static JFrame Fenster = new JFrame();
public static JLabel text1 = new JLabel();

public static void Fenster() {
Fenster.setLayout(new GridLayout(2,2));
text1 = new JLabel ("<html>Hallo Welt! Hallo Welt! Hallo Welt! Hallo Welt! Hallo Welt! Hallo Welt!</html>");

Fenster.add(text1);        

Fenster.setSize(650, 500);
Fenster.setVisible(true);
Fenster.setDefaultCloseOperation(Fenster.EXIT_ON_CLOSE);
Fenster.setLocationRelativeTo(null);
Fenster.setResizable(true);
Fenster.setTitle("Matheprogramm");
}
}

public static void main(String[] args) {
Fenster();
}
}
```
Das wäre dein Programm in Kurzfassung, ohne umständliches Drumherum, in der "richtigen" Reihenfolge.
Wobei man dazu sagen muss, dass es keine "richtige" sondern eher eine übersichtliche Reihenfolge gibt.

Dein Punkt mit dem leeren Fenster erzeugen ( :shock: WTF? ???:L ) ist sinnlos. Ein leeres Fenster kannst du überall erzeugen, du kannst z.B. eines deklarieren und wenn du ein leeres fenster (warum auch immer) willst, immer wieder dasselbe aufrufen. Allerdings ist das total Sinnfrei, wie schon gesagt. Ich würde dir eher empfehlen alles, was der User machen / erleben soll in ZWEI verschiedene Klassen (evtl. auch versch. Packages) zu packen, dort zu deklarieren und initialisieren, sodass alles passt und dann nur TEILE der anderen Klassen / Packages importieren, dann ist dein Programm sozusagen "sicherer". Weiter wäre dann noch eine Klasse / ein Package für deine Konfiguration sinnvoll, jedoch nur, wenn du ein größeres Programm machst. Bei deiner "kleinen" Klasse lohnt sich das nicht wirklich. Empfehlen würde ich dir das im Sinne des Übens trotzdem.

AUßERDEM: WICHTIG: Bevor du dich an den Rechner setzt und loscodest, wäre es ganz gut, dir einmal enige Beispiele anzuschauen und dich nicht sofort in ein Problem zu verrennen. Gerade aufgrund der vielen Möglichkeiten, die Java einem bietet, sollte man sich zuerst LANGSAM rantasten. Sonst führt das zu solchen vermeintlich unnötigen Problemen, wie dem über meinem Post, dass andere User, die dir nur helfen wollen, aufgeben und sich eventuell fragen, warum du nicht vorher einfach mal z.B. Onkel Google fragst o.ä.

Ich hoffe ich bin dir damit nicht zu Nahe getreten, sind nur Tipps, die mir damals leider nicht gegeben wurden, weshalb ich mich anfangs auch etwas doof angestellt habe.
Für ein gutes UI, befolge einfach die o.g. Tipps und da dieses Forum nicht dazu da ist, euch die Arbeit abzunehmen, sondern nur an eurer Seite / zu eurer Hilfe dazusein, bitte Google vorher / frag Freunde oder schau dir via Hotkeys (F3 , F2 u.ä.) die versch. Möglichkeiten an und erst, nachdem du selber überhaupt nichtmehr weiter weißt, Poste etwas.

MfG,
Andy 17


----------



## Camino (13. Sep 2012)

Andy17 hat gesagt.:


> Wobei man dazu sagen muss, dass es keine "richtige" sondern eher eine übersichtliche Reihenfolge gibt.



Ich würde aber trotzdem das setVisible(true) für den Frame am Ende aufrufen, wenn alle Komponenten erstellt sind. Und warum du jetzt das static für die Methode und die Objekte eingebracht hast, weiss ich auch nicht. Auch die Namensgebung ist nicht so toll bzw.verwirrend, z.B. wenn die Methode Fenster heisst, und der Frame auch genauso.


----------



## Andy17 (13. Sep 2012)

Jep, damit hast du zweifellos mit allem recht, was du schreibst, Ich wollte nur einfach möglichst nah an seinen Vorgaben bleiben.


----------



## Markus09 (13. Sep 2012)

So, ich "Mische" dann auch wieder mit. Habe Mein Programm mal anders gestalltet (nicht unbedingt nach Andy's Style), aber es läuft (fast).

ähm, achso, *@Andy:* ich google mir schon die Finger wund, und die beste Lösung finde ich besteht aus 1. Videos ( YouTube), 2. Bücher (Gallileo openbooks) und 'last but not least' (3.) Euch im Forum. das ist so in etwa meine Vorgehensweise beim Programmieren, wobei ich viele(!) allgemeine Beispiele bekomme. Doch irgendwann stehe ich halt mal an einer Stelle an der ich selber (auch mit Video und Google) nicht mehr weiterkomme, dann bin ich Dankbar das ich auf erfahrene User Wie Euch zurückkommen kann; und genau jetzt ist es wieder soweit.

Hier mal der Code:

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

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
	 
public class Fenster1 extends JFrame {
	
	public Fenster1() {	
	    
		JLabel begrüßung;
		JLabel nameAusgabe;
		JButton weiter;
		JButton abbrechen;
		JTextField nameEingabe;
						
	    setSize(600, 400);
	    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	    setTitle("Rechenprogramm");
	    setLocationRelativeTo(null);
	    setLayout(null);
	    setResizable(false);
	    
	    
	    begrüßung = new JLabel("<html>Hallo,<p><p>Dies ist ein kleines Programm, welches dir hilft " +
	    		"rechnen zu lernen, oder wenn du schon rechnen kannst, es zu verbessern.<p>" +
	    		"wenn du möchtest, schreibe in den Kasten unten am Fensterrand deinen " +
	    		"Namen und klicke mit der linken Maustaste auf den 'Weiter'-knopf. Du" +
	    		"kannst aber auch auf den 'Abbrechen'-knopf klicken, wenn du das Programm beenden möchtest.");
	    Font Schrift = new Font("Serif", Font.BOLD, 20);
	    begrüßung.setBounds(20,-89,580,400);
	    begrüßung.setFont(Schrift);
	    add(begrüßung);
	    
	    nameAusgabe = new JLabel("ich");
	    nameAusgabe.setBounds(20,90,300,400);
	    nameAusgabe.setFont(Schrift);
	    add(nameAusgabe);
	    
	    nameEingabe = new JTextField();
	    nameEingabe.setBounds(20,312,300,30);
	    nameEingabe.setFont(Schrift);
	    add(nameEingabe);
	    
	    weiter = new JButton("Weiter");
	    weiter.setBounds(350,300,100,50);
	    weiter.addActionListener(new WeiterListener());
	    add(weiter);
	    
	    abbrechen = new JButton ("Abbrechen");
	    abbrechen.setBounds(460,300,100,50);
	    add(abbrechen);
	    
	    setVisible(true);
    }
	
	private class WeiterListener implements ActionListener{
		
		
		@Override
		public void actionPerformed(ActionEvent e) {
			
			nameAusgabe.setText("Hallo Du!");			
		}
	}
}
```

*inZeile 66 steckt ein Fehler: nameAusgabe cannot be resolved.*

mein programm basiert Hauptsächlich auf Video Tuts, und da taucht kein fehler auf Onkel Google hat leider nicht die erwarteten Lösungen gebracht. Vielleicht könnt ihr mir helfen?


----------



## Thorakas (13. Sep 2012)

Deine Variable 
	
	
	
	





```
nameAusgabe
```
 hast du im Konstruktor deklariert. Sie ist außerhalb des Konstruktors nicht nutzbar.


----------



## Andy17 (13. Sep 2012)

Das war der Punkt, den ich mit außerhalb deklarieren / static / public etc. gemeint hab.


----------



## Markus09 (14. Sep 2012)

ok, hab die Objekte außerhalb der Methde Deklariert


```
public class Fenster1 extends JFrame {
	
	JLabel begrüßung;
	JLabel nameAusgabe;
	JButton weiter;
	JButton abbrechen;
	JTextField nameEingabe;
	
	public Fenster1() {
...
```

und esklappt!!! 

Dank Euch!!!

Auf zur nächsten Hürde......


----------



## Markus09 (14. Sep 2012)

Hallo,

zur Hürde: Mein "Fenster1" schliest nicht, stattdessen kommt 'ne Liste mit zig Fehlern!

hier mal der 
	
	
	
	





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

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
	 
public class Fenster1 extends JFrame {
	
	JLabel begrüßung;
	JLabel nameAusgabe;
	JButton weiter;
	JButton abbrechen;
	JTextField nameEingabe;
	JFrame Fenster2;
	JFrame Fenster1;
	
	public Fenster1() {	
	    						
	    setSize(600, 400);
	    setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
	    setTitle("Rechenprogramm");
	    setLocationRelativeTo(null);
	    setLayout(null);
	    setResizable(false);
	    
	    
	    begrüßung = new JLabel("<html>Hallo,<p><p>Dies ist ein kleines Programm, welches dir hilft " +
	    		"rechnen zu lernen, oder wenn du schon rechnen kannst, es zu verbessern.<p>" +
	    		"wenn du möchtest, schreibe in den Kasten unten am Fensterrand deinen " +
	    		"Namen und klicke mit der linken Maustaste auf den 'Weiter'-knopf. Du" +
	    		"kannst aber auch auf den 'Abbrechen'-knopf klicken, wenn du das Programm beenden möchtest.");
	    Font Schrift = new Font("Serif", Font.BOLD, 20);
	    begrüßung.setBounds(20,-89,580,400);
	    begrüßung.setFont(Schrift);
	    add(begrüßung);
	    
	    nameAusgabe = new JLabel("ich");
	    nameAusgabe.setBounds(20,90,300,400);
	    nameAusgabe.setFont(Schrift);
	    add(nameAusgabe);
	    
	    nameEingabe = new JTextField();
	    nameEingabe.setBounds(20,312,300,30);
	    nameEingabe.setFont(Schrift);
	    add(nameEingabe);
	    
	    weiter = new JButton("Weiter");
	    weiter.setBounds(350,300,100,50);
	    weiter.addActionListener(new WeiterListener());
	    add(weiter);
	    
	    abbrechen = new JButton ("Abbrechen");
	    abbrechen.setBounds(460,300,100,50);
	    add(abbrechen);
	    
	    setVisible(true);
    }
	
	private class WeiterListener implements ActionListener{
		
		
		@Override
		public void actionPerformed(ActionEvent e) {
			
			nameAusgabe.setText(nameEingabe.getText());
			nameEingabe.setText("");
			
			Fenster2 = new Fenster2();
			Fenster2.setVisible(true);
			Fenster1.dispose();
		}
	}
}
```

und hier mal die Fehlerliste: 
	
	
	
	





```
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at Fenster1$WeiterListener.actionPerformed(Fenster1.java:74)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$000(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue$4.run(Unknown Source)
	at java.awt.EventQueue$4.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
```

Wenn jemand ne Lösung oder nen Tip hätte wär ich dankbar


----------



## Andy17 (14. Sep 2012)

Daran bist du selber Schuld.
Was macht wohl:

```
setDefaultCloseOperation(Frame.DO_NOTHING_ON_CLOSE);
```
???:L
Richtig: Es sagt, du kannst dein Fenster nicht über das ROTE X schließen.
Mit terminate und TaskMgr geht es garantiert dennoch.
Tipp:
Ersetze das o.g. hierduch:

```
setDefaultCloseOperation(Frame.EXIT_ON_CLOSE);
```
Nun solltest du keine Probleme mehr bekommen. :toll:
MFG Andy


----------



## Markus09 (14. Sep 2012)

öhm, da hast du falsch verstanden, ich meinte das Schließen aus dem Programm heraus: der Klick auf den Button soll bewirken das

1. das Label unten die Zeichen aus dem Textfeld annimmt (klappt),
2. das 1. fenster geschlossen wird (Klappt nicht),
3. ein 2. Fenster aufgeht, (klappte bisher, nun aber auch nicht obwohl ich nichts am Code verändert hab).


----------



## Thorakas (14. Sep 2012)

Wenn mich nicht alles täuscht, hast du von Fenster1 kein Objekt erzeugt. Die Referenz ist noch 
	
	
	
	





```
null
```
, deswegen wird eine NullPointerException geschmissen.


----------



## Markus09 (15. Sep 2012)

Wieso, in mach ich doch?!?

```
JFrame Fenster1;
```


----------



## jgh (15. Sep 2012)

damit erzeugst du kein neues Objekt, sondern deklarierst nur eines!

hier mal dein Code ein wenig korrigiert:
Insbesondere die Zeilen 
[java=55]  weiter.addActionListener(new WeiterListener(this));[/code]
und die geänderete 
	
	
	
	





```
WeiterListener
```
-Klasse solltest du Beachtung schenken.

Fenster2 und die Main-Methode sind halt nur einfach schnell hingeschrieben, damit der Code kompilieren kann...musst du natürlich mit deinem Code austauschen.

[java=65] private class WeiterListener implements ActionListener {
        Fenster1 fenster1;

        public WeiterListener(Fenster1 fenster1) {
            this.fenster1 = fenster1;
        }...[/code]


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

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class Fenster1 extends JFrame {
	public static void main(String[] args) {
		new Fenster1();
	}

	JLabel begrüßung;
	JLabel nameAusgabe;
	JButton weiter;
	JButton abbrechen;
	JTextField nameEingabe;
	JFrame Fenster2;
	//JFrame Fenster1; Das wird nicht benutzt!!!

	public Fenster1() {

		setSize(600, 400);
		setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
		setTitle("Rechenprogramm");
		setLocationRelativeTo(null);
		setLayout(null);
		setResizable(false);

		begrüßung = new JLabel(
				"<html>Hallo,<p><p>Dies ist ein kleines Programm, welches dir hilft "
						+ "rechnen zu lernen, oder wenn du schon rechnen kannst, es zu verbessern.<p>"
						+ "wenn du möchtest, schreibe in den Kasten unten am Fensterrand deinen "
						+ "Namen und klicke mit der linken Maustaste auf den 'Weiter'-knopf. Du"
						+ "kannst aber auch auf den 'Abbrechen'-knopf klicken, wenn du das Programm beenden möchtest.");
		Font Schrift = new Font("Serif", Font.BOLD, 20);
		begrüßung.setBounds(20, -89, 580, 400);
		begrüßung.setFont(Schrift);
		add(begrüßung);

		nameAusgabe = new JLabel("ich");
		nameAusgabe.setBounds(20, 90, 300, 400);
		nameAusgabe.setFont(Schrift);
		add(nameAusgabe);

		nameEingabe = new JTextField();
		nameEingabe.setBounds(20, 312, 300, 30);
		nameEingabe.setFont(Schrift);
		add(nameEingabe);

		weiter = new JButton("Weiter");
		weiter.setBounds(350, 300, 100, 50);
		weiter.addActionListener(new WeiterListener(this));
		add(weiter);

		abbrechen = new JButton("Abbrechen");
		abbrechen.setBounds(460, 300, 100, 50);
		add(abbrechen);

		setVisible(true);
	}

	private class WeiterListener implements ActionListener {
		Fenster1 fenster1;

		public WeiterListener(Fenster1 fenster1) {
			this.fenster1 = fenster1;
		}

		@Override
		public void actionPerformed(ActionEvent e) {

			nameAusgabe.setText(nameEingabe.getText());
			nameEingabe.setText("");

			Fenster2 = new Fenster2();
			Fenster2.setVisible(true);
			fenster1.dispose();
		}
	}

	private class Fenster2 extends JFrame {

	}
}
```


----------



## Markus09 (16. Sep 2012)

OK, ich hab es wieder etwas umstrukturiert,

Der Listener steht jetzt in der *Mainklasse*:

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

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class MainProgramm {
	
	public class WeiterListener implements ActionListener {
        
		JLabel nameAusgabe;
		JButton weiter;
		JButton abbrechen;
		JTextField nameEingabe;
		JFrame Fenster2 = new Fenster2();
		JFrame Fenster1 = new Fenster1();
		
		public WeiterListener(Fenster1 Fenster1) {
			
			this.Fenster1 = Fenster1;
         }
 
        @Override
        public void actionPerformed(ActionEvent e) {
 
            nameAusgabe.setText(nameEingabe.getText());
            nameEingabe.setText("");
 
            Fenster2.setVisible(true);
            Fenster1.dispose();
        }
	}
		public static void main(String[] args){
			
		}	
}
```

...alle Objekte im 1. Fenster in *Fenster1*:

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

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
	 
public class Fenster1 extends JFrame {
	
	JLabel begrüßung;
	JLabel nameAusgabe;
	JButton weiter;
	JButton abbrechen;
	JTextField nameEingabe;
	JFrame Fenster2;
	JFrame Fenster1;
	
	public Fenster1() {	
	    						
	    setSize(600, 400);
	    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	    setTitle("Rechenprogramm");
	    setLocationRelativeTo(null);
	    setLayout(null);
	    setResizable(false);
	    	    
	    begrüßung = new JLabel("<html>Hallo,<p><p>Dies ist ein kleines Programm, welches dir hilft " +
	    		"rechnen zu lernen, oder wenn du schon rechnen kannst, es zu verbessern.<p>" +
	    		"Wenn du möchtest, schreibe in den Kasten unten im Fenster deinen " +
	    		"Namen und klicke mit der linken Maustaste auf den 'Weiter'-Knopf. Du" +
	    		"kannst aber auch auf den 'Abbrechen'-Knopf klicken, wenn du das Programm beenden möchtest.");
	    Font Schrift = new Font("Serif", Font.BOLD, 20);
	    begrüßung.setBounds(20,-89,580,400);
	    begrüßung.setFont(Schrift);
	    add(begrüßung);
	    
	    nameAusgabe = new JLabel("ich");
	    nameAusgabe.setBounds(20,90,300,400);
	    nameAusgabe.setFont(Schrift);
	    add(nameAusgabe);
	    
	    nameEingabe = new JTextField();
	    nameEingabe.setBounds(20,312,300,30);
	    nameEingabe.setFont(Schrift);
	    add(nameEingabe);
	    
	    weiter = new JButton("Weiter");
	    weiter.setBounds(350,300,100,50);
	    weiter.addActionListener (new WeiterListener(this));
	    add(weiter);
	    
	    abbrechen = new JButton ("Abbrechen");
	    abbrechen.setBounds(460,300,100,50);
	    add(abbrechen);
	    
	    setVisible(true);
    }
   	
}
```

alle Objekte (noch nicht fertig) im 2. Fenster in *Fenster2*:

```
import java.awt.Font;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class Fenster2 extends JFrame {
	
	public Fenster2() {	
		
		setSize(600, 400);
	    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	    setTitle("Rechenprogramm");
	    setLocationRelativeTo(null);
	    setLayout(null);
	    setResizable(false);    
	    setVisible(true);
    }    
}
```
Allerdings hab ich wohl in *Fenster1* Zeile 51 folgenden Fehler: _WeiterListener cannot be resolved to a type_. Google meint, das wohl ein Import fehlt. Welcher denn? Wisst ihr weiter?
Dann hab ich das Problem, das zwar ein 2. Fenster sich öffnet aber nich das Fenster2 das srtört mich wie bekomme ich das nu hin?

Danke für Eure Hilfen.


Dann noch ewas komplett anderes. Soll ich jetzt immer weiter hier im Thread machen, oder soll ich einen neuen mit treffenderer Beschreibung aufmachen? Was meint ihr? Danke für die Antworten!


----------



## jgh (16. Sep 2012)

was soll man dazu noch sagen?

na evtl. morgen mehr...hier mal ein lauffähiger Code deiner Application, einige bemerkungen stehen im Code:


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

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class Fenster1 extends JFrame {

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

	JLabel begrüßung;
	JLabel nameAusgabe;
	JButton weiter;
	JButton abbrechen;
	JTextField nameEingabe;
	JFrame Fenster2;

	// JFrame Fenster1; Das wird nicht benutzt!!!

	public Fenster1() {

		setSize(600, 400);
		setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
		setTitle("Rechenprogramm");
		setLocationRelativeTo(null);
		setLayout(null);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setResizable(false);

		begrüßung = new JLabel(
				"<html>Hallo,<p><p>Dies ist ein kleines Programm, welches dir hilft "
						+ "rechnen zu lernen, oder wenn du schon rechnen kannst, es zu verbessern.<p>"
						+ "wenn du möchtest, schreibe in den Kasten unten am Fensterrand deinen "
						+ "Namen und klicke mit der linken Maustaste auf den 'Weiter'-knopf. Du"
						+ "kannst aber auch auf den 'Abbrechen'-knopf klicken, wenn du das Programm beenden möchtest.");
		Font Schrift = new Font("Serif", Font.BOLD, 20);
		begrüßung.setBounds(20, -89, 580, 400);
		begrüßung.setFont(Schrift);
		add(begrüßung);

		nameAusgabe = new JLabel("ich");
		nameAusgabe.setBounds(20, 90, 300, 400);
		nameAusgabe.setFont(Schrift);
		add(nameAusgabe);

		nameEingabe = new JTextField();
		nameEingabe.setBounds(20, 312, 300, 30);
		nameEingabe.setFont(Schrift);
		add(nameEingabe);

		weiter = new JButton("Weiter");
		weiter.setBounds(350, 300, 100, 50);
		weiter.addActionListener(new WeiterListener(this));
		add(weiter);

		abbrechen = new JButton("Abbrechen");
		abbrechen.setBounds(460, 300, 100, 50);
		add(abbrechen);

		setVisible(true);
	}

}

class Fenster2 extends JFrame {

	public Fenster2() {

		setSize(600, 400);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setTitle("Rechenprogramm");
		setLocationRelativeTo(null);
		setLayout(null);
		setResizable(false);
		setVisible(true);
	}
}

class WeiterListener implements ActionListener {

	// JLabel nameAusgabe; wie sollen dieses Variablen einen Wert bekommen????
	// JButton weiter;
	// JButton abbrechen;
	// JTextField nameEingabe;
	Fenster2 fenster2; // wenn dann ist das vom Typ Fenster 2
	Fenster1 fenster1;

	public WeiterListener(Fenster1 Fenster1) {

		this.fenster1 = Fenster1;
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		System.out.println(123);
		fenster1.nameAusgabe.setText(fenster1.nameEingabe.getText());
		fenster1.nameEingabe.setText("");
		fenster2 = new Fenster2();
		fenster2.setVisible(true);
		fenster1.dispose();
	}
}
```


----------



## Markus09 (17. Sep 2012)

Hallo jgh,
Danke erstmal, 
als warscheinlich erfahrener Java-programmierer wirst du wohl nur kopfschüttelnd über meinem Code gesessen haben. 
Naja bin ja auch noch nen Java-"Kleinkind". Aber ich werde "älter".Habe mir mal das Videomaterial der Uni Aachen angeeignet, und es ist zihemlich gut. Aber jetzt zu deinem Code-Beispiel.
So wie ich das sehe habe ich für alles nur noch 1 Fenster in welchem der Code kommt.
Ich habe soetwas mla in VB angefangen, und dieser Code wäre in VB das reinste Chaos, dort wir alle möglich in eigene Klassen verpackt und fast jedes "Teil" auf der GUI bekommt sein eignenes Codefenster, ist das hier nicht? Dann muß ich mich wieder umgewöhnen. Denn ich war ja im begriff für (wenigstens) meine Fenster eigene Klassencodefenster zu erstellen damit der GesamtCode nicht so Lang und unübersichtlich wird.

ach ja 2 Dinge noch

1. Das *System.out.println(123)*; in Zeile 100 ist doch völlig überflüssig. feif:
2. Wenn ich das so ausführe habe ich ein leeres 2. Fenster, also *JLabel name Ausgabe* ins 2 Frame gepackt, Alles angepasst, keine Fehler, Programmstart, Name eingegeben,Button geklickt und nicht geht mehr ;(


```
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at WeiterListener.actionPerformed(Hauptfenster.java:100)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$000(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue$4.run(Unknown Source)
	at java.awt.EventQueue$4.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
```


```
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
 
public class Hauptfenster extends JFrame {  
 
    public static void main(String[] args) { //Programm begin mit dem 1.Fenster (Hauptfenster).
        new Hauptfenster();
    }
 
    JLabel begrüßung;
    JButton weiter;
    JButton abbrechen;
    JTextField nameEingabe;
    JFrame Fenster2;
  
    public Hauptfenster() {
 
        setSize(600, 400);
        setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        setTitle("Rechenprogramm");
        setLocationRelativeTo(null);
        setLayout(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);
        
        begrüßung = new JLabel( //Begrüßungslabel, Hier liest der user um was es geht.
                "<html>Hallo,<p><p>Dies ist ein kleines Programm, welches dir hilft "
                        + "rechnen zu lernen, oder wenn du schon rechnen kannst, es zu verbessern.<p>"
                        + "wenn du möchtest, schreibe in den Kasten unten am Fensterrand deinen "
                        + "Namen und klicke mit der linken Maustaste auf den 'Weiter'-knopf. Du"
                        + "kannst aber auch auf den 'Abbrechen'-knopf klicken, wenn du das Programm beenden möchtest.");
        Font Schrift = new Font("Serif", Font.BOLD, 20);
        begrüßung.setBounds(20, -89, 580, 400);
        begrüßung.setFont(Schrift);
        add(begrüßung);
 
        nameEingabe = new JTextField(); //Hier soll der User seinennamen eingeben der auf allen folgenden Frames immer steht (Bsp: Hallo:xxx)
        nameEingabe.setBounds(20, 312, 300, 30);
        nameEingabe.setFont(Schrift);
        add(nameEingabe);
 
        weiter = new JButton("Weiter"); //Der knopf um weiter zu kommen
        weiter.setBounds(350, 300, 100, 50);
        weiter.addActionListener(new WeiterListener(this));
        add(weiter);
 
        abbrechen = new JButton("Abbrechen"); //DerKnopf zum Abbrechen des Programms
        abbrechen.setBounds(460, 300, 100, 50);
        add(abbrechen);
 
        setVisible(true);
    }
 
}
 
class Fenster2 extends JFrame {
	
	JLabel nameAusgabe;
 
    public Fenster2() { //Neues Fenster
    	
    	setSize(600, 400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("Rechenprogramm");
        setLocationRelativeTo(null);
        setLayout(null);
        setResizable(false);
        
        nameAusgabe = new JLabel("Hallo"); //hier (sollte stehen) steht der Name der im ersten Fenster eingegeben wurde
        Font Schrift = new Font("Serif", Font.BOLD, 20);
        nameAusgabe.setBounds(20, 90, 300, 400);
        nameAusgabe.setFont(Schrift);
        add(nameAusgabe);
        
        setVisible(true);
    }
}
 
class WeiterListener implements ActionListener {
 
    
    Fenster2 fenster2;
    Hauptfenster fenster1;
 
    public WeiterListener(Hauptfenster Fenster1) {
 
        this.fenster1 = Fenster1;
    }
 
    @Override
    public void actionPerformed(ActionEvent e) {
                
        fenster1.nameEingabe.setText("");
        fenster2.nameAusgabe.setText(fenster1.nameEingabe.getText());
        
        new Fenster2();
        
        fenster1.dispose();
    }
}
```


----------



## jgh (17. Sep 2012)

^^ aber evtl. kannst du mich mal aufklären, was du hier machen willst:


```
public class MainProgramm {
    
    public class WeiterListener implements ActionListener {
```

wozu dieses Konstrukt...wenn ich ehrlich bin, war ich sogar überrascht, dass sowas kompiliert...


grundsätzlich sollte das hier auch so sein...wenn du allerdings Fragen hast, oder Hilfe brauchst, lässt sich das weitaus einfacher erledigen, wenn alles in einer Datei steht. Für dein Projekt solltest du die Klassen einzeln in Dateien und Packages speichern. Hier im Forum ist ein KSKB das einfachste...

Wenn du eine Klasse WeiterListener hast, dann kannst du da zwar Labels, Textfields usw. deklarieren...solange du sie initialisierst wirst du beim Zugriff auf diese Elemente immer eine NPE bekommen.

Was du eigentlich willst, sind die Komponenten deines Frames...und die holst du dir, indem du bspw. eine Instanz deines Fensters an die WeiterListener-Klasse übergibst.


----------



## jgh (17. Sep 2012)

bitte nicht nach Std einfach in deinen Antworten wühlen, editieren usw...macht es für mich umso schwerer.

Hier mal -hoffentlich- das, was du gerade erreichen willst...


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

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class Hauptfenster extends JFrame {

	public static void main(String[] args) { // Programm begin mit dem 1.Fenster
												// (Hauptfenster).
		new Hauptfenster();
	}

	JLabel begrüßung;
	JButton weiter;
	JButton abbrechen;
	JTextField nameEingabe;
	JFrame Fenster2;

	public Hauptfenster() {

		setSize(600, 400);
		setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
		setTitle("Rechenprogramm");
		setLocationRelativeTo(null);
		setLayout(null);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setResizable(false);

		begrüßung = new JLabel( // Begrüßungslabel, Hier liest der user um was
								// es geht.
				"<html>Hallo,<p><p>Dies ist ein kleines Programm, welches dir hilft "
						+ "rechnen zu lernen, oder wenn du schon rechnen kannst, es zu verbessern.<p>"
						+ "wenn du möchtest, schreibe in den Kasten unten am Fensterrand deinen "
						+ "Namen und klicke mit der linken Maustaste auf den 'Weiter'-knopf. Du"
						+ "kannst aber auch auf den 'Abbrechen'-knopf klicken, wenn du das Programm beenden möchtest.");
		Font Schrift = new Font("Serif", Font.BOLD, 20);
		begrüßung.setBounds(20, -89, 580, 400);
		begrüßung.setFont(Schrift);
		add(begrüßung);

		nameEingabe = new JTextField(); // Hier soll der User seinennamen
										// eingeben der auf allen folgenden
										// Frames immer steht (Bsp: Hallo:xxx)
		nameEingabe.setBounds(20, 312, 300, 30);
		nameEingabe.setFont(Schrift);
		add(nameEingabe);

		weiter = new JButton("Weiter"); // Der knopf um weiter zu kommen
		weiter.setBounds(350, 300, 100, 50);
		weiter.addActionListener(new WeiterListener(this));
		add(weiter);

		abbrechen = new JButton("Abbrechen"); // DerKnopf zum Abbrechen des
												// Programms
		abbrechen.setBounds(460, 300, 100, 50);
		add(abbrechen);

		setVisible(true);
	}

}

class Fenster2 extends JFrame {

	JLabel nameAusgabe;
	String name;

	public Fenster2(String name) { // Neues Fenster
		this.name = name;
		setSize(600, 400);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setTitle("Rechenprogramm");
		setLocationRelativeTo(null);
		setLayout(null);
		setResizable(false);

		nameAusgabe = new JLabel("Hallo " + name); // hier (sollte stehen) steht
		// Name der im ersten Fenster
		// eingegeben wurde
		Font Schrift = new Font("Serif", Font.BOLD, 20);
		nameAusgabe.setBounds(20, 90, 300, 400);
		nameAusgabe.setFont(Schrift);
		add(nameAusgabe);

		setVisible(true);
	}
}

class WeiterListener implements ActionListener {

	Fenster2 fenster2;
	Hauptfenster fenster1;

	public WeiterListener(Hauptfenster Fenster1) {

		this.fenster1 = Fenster1;
	}

	@Override
	public void actionPerformed(ActionEvent e) {

		// fenster1.nameEingabe.setText("");

		new Fenster2(fenster1.nameEingabe.getText());

		fenster1.dispose();
	}
}
```


----------



## Markus09 (17. Sep 2012)

danke, jetzt klappts: :toll:
und das editieren war halt um Doppelposts zu vermeiden. Aber kein problem, wenns bevorzugt wird mach ich das auch gern...


----------

