# neues Fenster mit Button öffnen



## KlemensyXYZ (21. Feb 2011)

Moin,

ich versuche grade ein neues Fenster mit einem Button zu öffnen.
Doch das Programm will nicht so wie ich ;(

bei google habe ich das hier gefunden:

```
Dialogfenster wnd = new Dialogfenster(); 
wnd.setVisible(true);
```

ich habe das "Dialogfenster" durch meinen Namen ersetzt und das ganze in den Action Listener eingebaut:

```
import java.awt.event.*;
import java.awt.*;

public class MyActionListener_4 implements ActionListener
{
	public NeuesFensterOeffnen f;
	public MyActionListener_4(NeuesFensterOeffnen f)
    {
		this.f=f;
    }
	
	public void actionPerformed(ActionEvent e)
	{
		if(e.getSource()==f.neu)
		{
			Fenster2 wnd = new Fenster2();
			wnd.setVisible(true);
		}
		
		if(e.getSource()==f.btnBeenden)
		{
			System.exit(0);
		}
	}
}
```

Das erste Fenster ist das hier:


```
import java.awt.*;

public class NeuesFensterOeffnen extends Frame
{
	public Button neu = new Button("Neues Fenster");
	public Button btnBeenden = new Button("Beenden");
	
	private Panel pnlNorth = new Panel();
	
	private MyActionListener_4 myActionListener = new MyActionListener_4(this);
	
	public NeuesFensterOeffnen()
	{
		this.pnlNorth.add(this.neu);
		//this.pnlNorth.add(this.btnBeenden);
		this.add(this.pnlNorth,BorderLayout.NORTH);
		this.add(this.btnBeenden,BorderLayout.SOUTH);
		this.pack();
		this.show();
		this.addWindowListener(new MyWindowListener());
		this.btnBeenden.addActionListener(myActionListener);
	}
	public static void main(String argv[]  )
	{
		NeuesFensterOeffnen f = new NeuesFensterOeffnen();
	}
}
```

was mach ich denn noch falsch das das nicht funktioniert?

Danke


----------



## feiste (21. Feb 2011)

von meinem lehrer ^^


```
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;


public class KNOPFFENSTER extends JFrame implements ActionListener
{
    JButton buttonHallo;
    JButton buttonServus;
    
    public KNOPFFENSTER()
    {
        // Fenster soll sichtbar sein
        setVisible(true);
        
        // Standard-Layout setzen (einfach so lassen...)
        getContentPane().setLayout(new FlowLayout());
        
        // Button erzeugen. Im Konstruktor steht der Name, der im Knopf erscheinen soll
        buttonHallo = new JButton("Hallo");
        
        // Button wird dem Fenster hinzugefügt
        add(buttonHallo);
        
        // Jetzt wird dem Knopf gesagt, dass bei einem Knopfdruck die actionPerformed Methode 
        // aufgerufen werden soll. Sieht etwas verwegen aus, einfach so übernehmen.
        buttonHallo.addActionListener(this);
        
        // Das ganze nochmal für einen zweiten Knopf
        buttonServus = new JButton("Servus");
        add(buttonServus);
        buttonServus.addActionListener(this);
        
        // Muss am Ende stehen, damit die eingetragenen Sachen sichtbar werden
        pack();
    }
    
    // Wenn irgendeiner der Knöpfe gedrückt wird, dann wird diese Methode
    // automatisch aufgerufen. Eine Art von auslösender Aktion
    public void actionPerformed(ActionEvent event) 
    {
        System.out.print("Irgendein Knopf wurde gedrückt...");
        // Wir müssen nun herausfinden, welcher Knopf gedrückt wurde...
        
        // Handelt es sich bei der Quelle der Aktion um das Objekt buttonHallo? Dann gib "Hallo" aus.
        if(event.getSource() == buttonHallo)
        {
            System.out.println("Hallo");
        }
        
        if(event.getSource() == buttonServus)
        {
            System.out.println("Servus");
        }
        
    }
}
```


----------



## KlemensyXYZ (21. Feb 2011)

dank dir schon mal dafür,
aber geht das auch ohne Swing?
das kommt erst danach und darf ich noch nicht 
(wenns nicht anders geht hat mein Lehrer pech gehabt ueh:


----------



## feiste (21. Feb 2011)

weiß ich nicht 
ist alles von meinem Lehrer gemacht.


----------



## KlemensyXYZ (21. Feb 2011)

:bahnhof: ähm und wo ist denn deine main Klasse?
so ist das nicht ausführbar!

Und soweit ich das sehe wird auch da nur ein Fenster (mit 2 Buttons, die nichts können) geöffnet.
Ich möchte ja mit einem Button ein anderes Fenster öffnen.


----------



## feiste (21. Feb 2011)

```
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;


public class KNOPFFENSTER extends JFrame implements ActionListener
{
    JButton buttonHallo;
    JButton buttonServus;
    
    public KNOPFFENSTER()
    {
        // Fenster soll sichtbar sein
        setVisible(true);
        
        // Standard-Layout setzen (einfach so lassen...)
        getContentPane().setLayout(new FlowLayout());
        
        // Button erzeugen. Im Konstruktor steht der Name, der im Knopf erscheinen soll
        buttonHallo = new JButton("Hallo");
        
        // Button wird dem Fenster hinzugefügt
        add(buttonHallo);
        
        // Jetzt wird dem Knopf gesagt, dass bei einem Knopfdruck die actionPerformed Methode 
        // aufgerufen werden soll. Sieht etwas verwegen aus, einfach so übernehmen.
        buttonHallo.addActionListener(this);
        
        // Das ganze nochmal für einen zweiten Knopf
        buttonServus = new JButton("Servus");
        add(buttonServus);
        buttonServus.addActionListener(this);
        
        // Muss am Ende stehen, damit die eingetragenen Sachen sichtbar werden
        pack();
    }
    
    // Wenn irgendeiner der Knöpfe gedrückt wird, dann wird diese Methode
    // automatisch aufgerufen. Eine Art von auslösender Aktion
    public void actionPerformed(ActionEvent event) 
    {
        System.out.print("Irgendein Knopf wurde gedrückt...");
        // Wir müssen nun herausfinden, welcher Knopf gedrückt wurde...
        
        // Handelt es sich bei der Quelle der Aktion um das Objekt buttonHallo? Dann gib "Hallo" aus.
        if(event.getSource() == buttonHallo)
        {
            System.out.println("Hallo");
        }
        
        if(event.getSource() == buttonServus)
        {
            System.out.println("Servus");
        }
        
    }
    public static void main(String args[]) {
        new KNOPFFENSTER(); }
}
```


wir arbeiten mit BlueJ da braucht man das nicht


----------



## KlemensyXYZ (21. Feb 2011)

feiste hat gesagt.:


> ```
> public void actionPerformed(ActionEvent event)
> {
> System.out.print("Irgendein Knopf wurde gedrückt...");
> ...


----------



## feiste (21. Feb 2011)

dann musst du halt einfach, statt 
System.out.println("...")
was anderes ausführen
war ja nur ein Bespiel

wenn ne neue klasse ausgeführt werden soll 
schaut eben so aus


```
public void actionPerformed(ActionEvent event) 
    {
       
        
        // Handelt es sich bei der Quelle der Aktion um das Objekt buttonHallo? Dann gib "Hallo" aus.
        if(event.getSource() == buttonHallo)
        {
            new Fenster();
        }
        
        if(event.getSource() == buttonServus)
        {
            new Fenster2();
        }
        
    }
```


----------



## W9ND3R (21. Feb 2011)

Deinem Quellcode nach fehlt in deinem ersten Fenster einfach nur der ActionLIstener für den Button, der das neue Fenster öffnen soll. Also:

```
this.neu.addActionListener(myActionListener);
```


----------



## KlemensyXYZ (22. Feb 2011)

oha dummer fehler 

gibt es vielleicht auch eine Möglichkeit den buttons ein bestimmte Größe zuzuordnen?
in meinem Buch steht davon nichts drin.


----------



## L-ectron-X (22. Feb 2011)

Du benutzt FlowLayout, da kannst du das mit setPreferredSize(...) machen.


----------



## KlemensyXYZ (22. Feb 2011)

so und noch ein Problem:
wenn ich das neue Fenster wieder schließe gehen beide Fenster wieder zu.
Ist es auch möglich *nur* das neue Fenster zu schließen und das alte offen zu lassen?


----------



## Chr1z (22. Feb 2011)

setDefaultCloseOperation(DISPOSE_ON_CLOSE);

könnte funktionieren


----------



## L-ectron-X (22. Feb 2011)

Wenn du das Fenster über die Buttons aus deinem Layout schließen willst: am Fenster nicht 
	
	
	
	





```
System.exit(0);
```
 aufrufen, sondern 
	
	
	
	





```
this.dispose();
```


----------



## KlemensyXYZ (22. Feb 2011)

L-ectron-X hat gesagt.:


> Du benutzt FlowLayout, da kannst du das mit setPreferredSize(...) machen.


das habe ich irgendwie nicht verstanden.
Könnte jemand bittte mal ein kurzes Beispiel zeigen?


L-ectron-X hat gesagt.:


> Wenn du das Fenster über die Buttons aus deinem Layout schließen willst: am Fenster nicht
> 
> 
> 
> ...


Das hab ich inzwischen mit 
	
	
	
	





```
wnd.setVisible(true);
```
 und 
	
	
	
	





```
wnd.setVisible(false);
```
gelöst. Die andere Lösung funktioniert aber auch.


----------



## L-ectron-X (22. Feb 2011)

Das FlowLayout richtet die Komponenten so lange in einer Zeile aus, bis der Platz erschöpft ist. Wenn kein Platz mehr ist, werden die Komponenten, die nicht mehr in die Zeile passen, in die nächste Zeile verschoben.
Es richtet sich dabei nach der voreingestellten Größe einer Komponente. Und die Größe (PreferredSize) kann man im FlowLayout (anders als bspw. im GridLayout) wirksam setzen.

Hier mal ein Beispiel mit deinem Code: (Zeile 30)

```
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;


public class KnopfFenster extends JFrame implements ActionListener {
    private JButton buttonHallo;
    private JButton buttonServus;

    public KnopfFenster() {
        super("KnopfFenster");
        
        // Standard-Layout setzen (einfach so lassen...)
        getContentPane().setLayout(new FlowLayout());

        // Standardaktion beim Klicken auf den Fenster-Button "Schließen"
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // Button erzeugen. Im Konstruktor steht der Name, der im Knopf erscheinen soll
        buttonHallo = new JButton("Hallo");

        // Button wird dem Fenster hinzugefügt
        add(buttonHallo);

        // Jetzt wird dem Knopf gesagt, dass bei einem Knopfdruck die actionPerformed Methode
        // aufgerufen werden soll. Sieht etwas verwegen aus, einfach so übernehmen.
        buttonHallo.addActionListener(this);

        // Das ganze nochmal für einen zweiten Knopf
        buttonServus = new JButton("Servus");
        
        buttonServus.setPreferredSize(new Dimension(80, 40)); //Standardgröße für den Button setzen
        
        add(buttonServus);
        buttonServus.addActionListener(this);

        // Muss am Ende stehen, damit die eingetragenen Sachen sichtbar werden
        pack();

        //Fenster auf dem Bildschirm zentrieren
        setLocationRelativeTo(null);
        
        // Fenster soll sichtbar sein (immer als letzte Anweisung!)
        setVisible(true);
    }

    // Wenn irgendeiner der Knöpfe gedrückt wird, dann wird diese Methode
    // automatisch aufgerufen. Eine Art von auslösender Aktion
    public void actionPerformed(ActionEvent event) {
        System.out.print("Irgendein Knopf wurde gedrückt...");
        // Wir müssen nun herausfinden, welcher Knopf gedrückt wurde...

        // Handelt es sich bei der Quelle der Aktion um das Objekt buttonHallo? Dann gib "Hallo" aus.
        if(event.getSource() == buttonHallo) {
            System.out.println("Hallo");
        }

        else if(event.getSource() == buttonServus) {
            System.out.println("Servus");
        }

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

Habe nebenbei auch noch ein paar Sachen bereinigt.


----------



## KlemensyXYZ (22. Feb 2011)

ah dank dir
hab kapiert :applaus:

und das geht doch sicher auch mit dem GridLayout und dem BorderLayout, oder?

PS.: Das war nicht mein Code sondern der von feiste ueh: ; meiner ist ganz oben auf der Seite


----------



## L-ectron-X (22. Feb 2011)

Sicher, nur wird das Ergebnis u.U. etwas anders aussehen. Das GridLayout ignoriert gänzlich die Angaben von Standardgrößen. Es verteilt die Komponenten lediglich mit gleicher Größe im Layout.
Über das BorderLayout haben wir einen kleinen FAQ-Beitrag: http://www.java-forum.org/java-faq-beitraege/109662-borderlayout.html


----------

