JFrame durch Menüpunkt in einem anderen JFrame aufrufen

TDS95

Grünschnabel
Hallo,

ich habe folgendes Problem:

ich habe einen JFrame erstellt und diesem eine JMenuBar hinzugefügt mit entsprechenden Menüpunkten. Und jetzt möchte ich über einen von diesen Menüpunkten einen anderen JFrame als so ne Art "Über ..." Fenster aufrufen.

So sieht mein Code aus
Java:
import javax.swing.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.BorderLayout;
/**
 * @author 
 * @version 
 */
public class main
{
    JFrame mainframe;
    JMenuBar mainmenu;
    JFrame aboutFrame;
    JLabel aboutLabel;
    JButton aboutCloseButton;
    // JMenu Elemente
    JMenu file;
    JMenu help;
    // Datei
    JMenuItem exit;
    // Hilfe
    JMenuItem about;
    JMenuItem helpF;

    public main()
    {
        new JMenuBarBeispiel();
        new JAboutFrame();
    }
    public class JMenuBarBeispiel implements ActionListener {
        public JMenuBarBeispiel() {
            // Erzeugt Hauptfenster
            mainframe = new JFrame("Architekt v1.00");
            mainframe.setVisible(true);
            mainframe.setSize(500, 400);
            mainframe. setLocationRelativeTo(null);
            mainframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            // Erzeugt Menüleiste
            mainmenu = new JMenuBar();
            // Erzeuge Menüelemente
            file = new JMenu("Datei");
            help = new JMenu("Hilfe");
            // Erzeuge Untermenüelemente
            exit = new JMenuItem("Beenden");
            exit.addActionListener(this);
            about = new JMenuItem("Über");
            about.addActionListener(this);
            helpF = new JMenuItem("Hilfe");
            helpF.addActionListener(this);
            // Menüelemente hinzufügen
            mainmenu.add(file);
            mainmenu.add(help);
            // Untermenüelemente hinzufügen
            file.add(exit);
            help.add(about);
            help.add(helpF);
            // JMenuBar an Fenster binden
            mainframe.add(mainmenu, BorderLayout.NORTH);
        }
        public void actionPerformed(ActionEvent object) {
            if (object.getSource() == exit) {
                System.exit(0);
            }
        }
    }
    public class JAboutFrame implements ActionListener {
        public void JAboutFrame() {
            //Erzeuge Fenster
            aboutFrame = new JFrame("Architekt v1.00 - Über");
            aboutLabel = new JLabel("Test");
            aboutCloseButton = new JButton("Schließen");
            aboutLabel.setVisible(false);
            aboutFrame.setVisible(false);
            aboutFrame.setSize(100, 75);
            aboutFrame.setLocationRelativeTo(null);
            aboutFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
        public void actionPerformed(ActionEvent object) {
            if (object.getSource() == about) {
                aboutFrame.setVisible(true);
                aboutFrame.setAlwaysOnTop(true);
            }
        }
    }
}

Mein Problem jetzt, wenn ich den JFrame über den Menüpunkt "Über" aufrufen möchte erscheint der Frame einfach nicht. Ich weis einfach nicht weiter, hat einer von euch vielleicht einen Tipp für mich?

Vielen Dank schon mal im Vorraus
 
Hi,
wie G1n0 0n3 schon sagte, ist es ratsam das Hauptfenster als JFrame zu machen und "Popup"-Fenster als Dialoge. Ledigliche Fenster, die "unabhängig" vom Hauptfenster sein sollen, ist es sinnvoll als JFrame zu machen.

Jetzt aber zu deinem Problem. In deiner inneren Klasse JMenuBarBeispiel, welche du von ActionListener implementieren lässt, erzeugst du das Menü richtig. Allerdings hast du vergessen deinen ActionListener so anzupassen, dass er auch auf all die Menüpunkte reagiert, die ihm zugewießen wurden.
Hier erzeugst du den Menüpunkt "Über" und weißt ihm den ActionListener deiner JMenuBarBeispiel zu.
Java:
about = new JMenuItem("Über");
about.addActionListener(this);
Allerdings reagierst du in deinem ActionListener nicht auf dieses Event.
Java:
public void actionPerformed(ActionEvent object) {
      if (object.getSource() == exit) {
          System.exit(0);
      }
}
Du musst den Inhalt des ActionListeners von deiner inneren Klasse JAboutFrame noch mit zu dem ActionListener von JMenuBarBeispiel hinzufügen.
Java:
public void actionPerformed(ActionEvent object) {
      if (object.getSource() == about) {
          aboutFrame.setVisible(true);
          aboutFrame.setAlwaysOnTop(true);
      }
}

Das würde dann so aussehen. (JMenuBarBeispiel)
Java:
public void actionPerformed(ActionEvent object) {
      if (object.getSource() == about) {
          // aboutFrame wird eine NullPointerException werfen, da das JFrame noch nicht initialisiert wurde
          aboutFrame.setVisible(true);
          aboutFrame.setAlwaysOnTop(true);
      } else if (object.getSource() == exit) {
          System.exit(0);
      }
}

Gruß

Fabio
 
Zurück