neues Fenster mit Button öffnen

  • Themenstarter Themenstarter KlemensyXYZ
  • Beginndatum Beginndatum
K

KlemensyXYZ

Gast
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:
Java:
Dialogfenster wnd = new Dialogfenster(); 
wnd.setVisible(true);

ich habe das "Dialogfenster" durch meinen Namen ersetzt und das ganze in den Action Listener eingebaut:
Java:
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:

Java:
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
 
von meinem lehrer ^^

Java:
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");
        }
        
    }
}
 
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:
 
: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.
 
Zuletzt bearbeitet von einem Moderator:
Java:
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
 
Java:
    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");
        }
        
    }
stattdessen soll ein neues Fenster kommen 🙂
Java:
    public static void main(String args[]) {
        new KNOPFFENSTER(); }
}
das habe ich jetzt auch schon gemacht😳

PS. Ich arbeite mit Eclipse
 
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

Java:
 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();
        }
        
    }
 
Zuletzt bearbeitet:
Deinem Quellcode nach fehlt in deinem ersten Fenster einfach nur der ActionLIstener für den Button, der das neue Fenster öffnen soll. Also:
Java:
this.neu.addActionListener(myActionListener);
 
oha dummer fehler 😳

gibt es vielleicht auch eine Möglichkeit den buttons ein bestimmte Größe zuzuordnen?
in meinem Buch steht davon nichts drin.
 
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?
 
Wenn du das Fenster über die Buttons aus deinem Layout schließen willst: am Fenster nicht
Code:
System.exit(0);
aufrufen, sondern
Code:
this.dispose();
 
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?
Wenn du das Fenster über die Buttons aus deinem Layout schließen willst: am Fenster nicht
Code:
System.exit(0);
aufrufen, sondern
Code:
this.dispose();
Das hab ich inzwischen mit
Code:
wnd.setVisible(true);
und
Code:
wnd.setVisible(false);
gelöst. Die andere Lösung funktioniert aber auch.
 
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)
Java:
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.
 
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
 
Zuletzt bearbeitet von einem Moderator:

Zurück
Oben