JFrame referenzieren

Risfort

Grünschnabel
Wie kann ich aus einer beliebigen Klasse, sagen wir die Klasse für ActionListener, das aktuelle Frame referenzieren. Hintergrund meines Problems ist: Ich will - in Abhängigkeit von Benutzereingaben - mit dem selben Frame unterschiedliche ContentPane anzeigen lassen.
Danke!!
 
Hallo Risfort
warum übergibst du nicht einfach deinen JFrame an die ActionListener-Klasse?

Bsp: (Dieser Aufruf wird in deinem JFrame vollzogen)

button.addActionListener( AktionsListener( this ) );




public class AktionsListener implements ActionListener {

public AktionsListener( JFrame hauptFenster )
...
}
...

natürlich solltest du in diesem fall dann das übergebene objekt "hauptFenster" referenzieren auf ein eigenes objekt der Klasse AktionsListener, um dieses dann im actionPerformed() oder wo auch immer zu verwenden.
 
Zuletzt bearbeitet:
Danke Inkog!
Ich mache meine ersten Java-Geh- und -Stehversuche - vielleicht verstehe ich deshalb nicht die angedeutete Lösung: Da die Klasse der AktionsListener nicht zum Zeitpunkt des Events instanziert werden kann, bleibt es mir unklar, wie ich hauptFenster an den Konstruktor der Klasse übergeben soll.

Danke!
 
Zuletzt bearbeitet:
Ich merke auch gerade, dass ich einen fehler gemacht habe an der Stelle
button.addActionListener( AktionsListener( this ) );

Soll eigentlich heissen
button.addActionListener( new AktionsListener( this ) );
Es wird also ein Objekt von AktionsListener erstellt und das hauptFenster wird direkt an den konstruktor geleitet.
Ich denke das ist was unklar war.
 
Zuletzt bearbeitet:
Hallo Inkog: Dank 2!
Das Problem wird sein, dass ich zu ungenau gefragt habe.
Ich habe eine Klasse JPanel, eine Klasse JFrame und eine Klasse für den ActionListener;
in letzterer sollte ich eine Anweisung >JFrame<.setContentPane(cP) zustande bringen - hoffend, dass sie zu einem Austausch der Oberfläche führt.
Ich kann JFRame aber nicht instanzieren.
Vermutlich muss ich aus den Klassen JFrame und Actionlistener eine machen
 
Hallo Risfort,

Du kannst natürlich auch Deine Frame-Klasse zu einem ActionListener machen. Dafür musst Du einfach die entsprechende Schnittstelle implementieren:
Java:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;

/**
 * The Class JFrameActionListenerTest.
 */
public class JFrameActionListenerTest extends JFrame implements ActionListener {
    private JPanel content1 = new JPanel();
    private JPanel content2 = new JPanel();
    private JPanel content3 = new JPanel();
    private JMenuItem menuItem1 = new JMenuItem("Content 1");
    private JMenuItem menuItem2 = new JMenuItem("Content 2");
    private JMenuItem menuItem3 = new JMenuItem("Content 3");

    /**
     * Create a new instance of <code>JFrameActionListenerTest</code>.
     */
    public JFrameActionListenerTest() {
        super("JFrameActionListenerTest");
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);

        content1.setBackground(Color.RED);
        content2.setBackground(Color.BLUE);
        content3.setBackground(Color.GREEN);

        final JMenuBar menuBar = new JMenuBar();
        final JMenu menuFile = new JMenu("File");
        menuBar.add(menuFile);
        menuFile.add(menuItem1);
        menuItem1.addActionListener(this);
        menuFile.add(menuItem2);
        menuItem2.addActionListener(this);
        menuFile.add(menuItem3);
        menuItem3.addActionListener(this);
        setJMenuBar(menuBar);
    }

    /** {@inheritDoc} */
    public void actionPerformed(final ActionEvent e) {
        final Object source = e.getSource();
        if (source == menuItem1) {
            setContentPane(content1);
        } else if (source == menuItem2) {
            setContentPane(content2);
        } else if (source == menuItem3) {
            setContentPane(content3);
        }
        getRootPane().updateUI();
    }

    /**
     * The main method.
     *
     * @param args the arguments
     */
    public static void main(String[] args) {
        final JFrame frame = new JFrameActionListenerTest();
        final Dimension frameSize = new Dimension(600, 400);
        frame.setSize(frameSize);
        final Dimension screenSize =
            Toolkit.getDefaultToolkit().getScreenSize();
        final int frameX = (screenSize.width - frameSize.width) / 2;
        final int frameY = (screenSize.height - frameSize.height) / 2;
        frame.setLocation(frameX, frameY);
        frame.setVisible(true);
    }
}
Wichtig ist noch, dass Du die Methode updateUI() auf dem RootPane aufrufst, nachdem Du den neuen Content gesetzt hast, damit sich der Frame neu rendert.

Grüße
Vincent
 
Hallo Vincentius!
Dein Beitrag hat mir doppelt geholfen:
1. er zeigt mir eine Lösung für meine Aufgabe auf;
2. er macht mir deutlich - was drei z. T. sehr dicke
Bücher nicht vermochten -, dass ich noch zu sehr
in VBA verhaftet bin und den Weg zu Java noch nicht
richtig geschafft habe.
Darum: doppelten Dank!!
 
Zurück