JInternalFrame - Handhabung?

MädMäx

Mitglied
Hallo zusammen,

ich möchte mir ein Programm mit fester Menüleiste basteln (d.h. Menüleiste immer am oberen Ende sichtbar). Leider bin ich nicht mit Javakünsten gesegnet und bin auch technisch nicht allzu fähig, die Java-/Swingdokumentation wirklich zu verstehen.

Folgendes Problem: Ich hab testweise einfach bissl rumgespielt und stoße auf das Problem, dass ich dem JInternalFrame keinen Button zuweisen kann. Nachfolgend der Code, bitte um Hilfe.

Java:
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class MailGUI implements ActionListener {

     JFrame applikation;
     Container container;

     // Menüleiste
     JMenuBar menueLeiste;

     // Menüleiste Elemente
     JMenu datei;
     JMenu hilfe;

     // Datei
     JMenuItem oeffnen;
     JMenuItem beenden;

     // Hilfe
     JMenuItem faq;
     JMenuItem about;

     // Textfeld
     JTextArea textarea;
     
     // Mainframe
     JScrollPane mainframe;
     
     // Interner Frame
     JInternalFrame iFrame1;

     //Button
    JButton button;
    
     public MailGUI() {
          applikation = new JFrame("JMenuBar Beispiel");
          container = applikation.getContentPane();

          // Menüleiste erzeugen
          menueLeiste = new JMenuBar();

          // Menüelemente erzeugen
          datei = new JMenu("Datei");
          hilfe = new JMenu("Hilfe");

          // Untermenüelemente erzeugen
          oeffnen = new JMenuItem("öffnen");
          oeffnen.addActionListener(this);
          beenden = new JMenuItem("beenden");
          beenden.addActionListener(this);
          faq = new JMenuItem("F.A.Q.");
          faq.addActionListener(this);
          about = new JMenuItem("Über");
          about.addActionListener(this);

          // Menüelemente hinzufügen
          menueLeiste.add(datei);
          menueLeiste.add(hilfe);

          // Untermenüelemente hinzufügen
          datei.add(oeffnen);
          datei.add(beenden);
          hilfe.add(faq);
          hilfe.add(about);

          // Textfeld erzeugen
          textarea = new JTextArea();
          mainframe = new JScrollPane();
          iFrame1 = new JInternalFrame();
          
          applikation.add(menueLeiste, BorderLayout.NORTH);
          applikation.add(mainframe.add(textarea), BorderLayout.CENTER);
          mainframe.add(iFrame1);
          iFrame1.setVisible(false);

          applikation.setSize(400, 300);
          applikation.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          applikation.setVisible(true);
          
          button = new JButton("Button1");
          button.setSize(100, 100);
          button.setLocation(100, 100);
          iFrame1.add(button);
          
     }

     public void actionPerformed(ActionEvent object) {
          if (object.getSource() == oeffnen){
        	  textarea.append("\n" + "öffnen wurde angeklickt");
        	  iFrame1.setVisible(false);
        	  textarea.setVisible(true);
          }
          if (object.getSource() == beenden){
        	  textarea.append("\n" + "beenden wurde angeklickt");
        	  textarea.setVisible(false);
        	  iFrame1.setVisible(true);
          }
          if (object.getSource() == faq){
        	  textarea.append("\n" + "faq wurde angeklickt");
          }
          if (object.getSource() == about){
        	  textarea.append("\n" + "über wurde angeklickt");
          }
     }

     public static void main(String[] args) {
          MailGUI gui = new MailGUI();
     }
}

Danke im Voraus und viele Grüße,
MädMäx
 
ist das Verständnis so schlecht, dass du nichtmal bei
How to Use Internal Frames (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)
vorbeigekommen bist und sowas elementares wie ein nötiges JDesktopPane überlesen hast?

auf Zeilen wie
> applikation.add(mainframe.add(textarea), BorderLayout.CENTER);
solltest du tunlichst verzichten,
ein JScrollPane mainframe zu benennen hat auch nicht gerade geholfen,

hier grob eine Version, die etwas anzeigt, die textArea habe ich weitgehend herausgestrichen, funkte auch überall dazwischen:
Java:
public class Test
{
    public static void main(String[] args)
    {
        MailGUI gui = new MailGUI();
    }
}

class MailGUI
    implements ActionListener
{

    JFrame applikation;
    Container container;

    // Menüleiste
    JMenuBar menueLeiste;

    // Menüleiste Elemente
    JMenu datei;
    JMenu hilfe;

    // Datei
    JMenuItem oeffnen;
    JMenuItem beenden;

    // Hilfe
    JMenuItem faq;
    JMenuItem about;

    // Textfeld
    JTextArea textarea;

    // Mainframe
    JScrollPane scrollPane;

    // Interner Frame
    JInternalFrame iFrame1;

    // Button
    JButton button;

    public MailGUI()
    {
        applikation = new JFrame("JMenuBar Beispiel");
        container = applikation.getContentPane();

        // Menüleiste erzeugen
        menueLeiste = new JMenuBar();

        // Menüelemente erzeugen
        datei = new JMenu("Datei");
        hilfe = new JMenu("Hilfe");

        // Untermenüelemente erzeugen
        oeffnen = new JMenuItem("öffnen");
        oeffnen.addActionListener(this);
        beenden = new JMenuItem("beenden");
        beenden.addActionListener(this);
        faq = new JMenuItem("F.A.Q.");
        faq.addActionListener(this);
        about = new JMenuItem("Über");
        about.addActionListener(this);

        // Menüelemente hinzufügen
        menueLeiste.add(datei);
        menueLeiste.add(hilfe);

        // Untermenüelemente hinzufügen
        datei.add(oeffnen);
        datei.add(beenden);
        hilfe.add(faq);
        hilfe.add(about);

        // Textfeld erzeugen
        textarea = new JTextArea();

        JDesktopPane desktop = new JDesktopPane();
        scrollPane = new JScrollPane(desktop);

        applikation.add(menueLeiste, BorderLayout.NORTH);
        applikation.add(scrollPane, BorderLayout.CENTER);

        applikation.setSize(400, 300);
        applikation.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        button = new JButton("Button1");
        button.setSize(100, 100);
        button.setLocation(100, 100);

        iFrame1 = new JInternalFrame();
        iFrame1.setSize(200, 200);
        iFrame1.add(button);
        iFrame1.setVisible(true);
        
        desktop.add(iFrame1);
        applikation.setVisible(true);
    }

    public void actionPerformed(ActionEvent object)
    {
        if (object.getSource() == oeffnen)
        {
            textarea.append("\n" + "öffnen wurde angeklickt");
            iFrame1.setVisible(false);
            textarea.setVisible(true);
        }
        if (object.getSource() == beenden)
        {
            textarea.append("\n" + "beenden wurde angeklickt");
            textarea.setVisible(false);
            iFrame1.setVisible(true);
        }
        if (object.getSource() == faq)
        {
            textarea.append("\n" + "faq wurde angeklickt");
        }
        if (object.getSource() == about)
        {
            textarea.append("\n" + "über wurde angeklickt");
        }
    }
}
 
Danke für die Hilfe. Was mir noch etwas unpassend ist, ist die Titelleiste des InternalFrames. (Ich will ja in Abhängigkeit von den geklickten MenuItems Forms bzw. Anzeigen unter der MenuBar anzeigen.) Gibt es dafür einen Workaround oder was würdet ihr vorschlagen? Ist der InternalFrame die falsche Lösung?

Noch etwas:

To add components to an internal frame, you add them to the internal frame's content pane.

D.h. wenn ich eine Anzeige (in meiner Form, mal ganz untechnisch ausgedrückt) ausblenden will, muss ich alle einzelen Komponenten der Form - die ich ja schlussendlich nicht binden kann - auch ausblenden? Oder wie kann ich weiter vorgehen?

Sorry, für meine Anfängerfehler und geistigen Hänger.

Grüße und vielen Dank im Voraus,
MädMäx
 
ich persönlich kann zur Titelleiste des InternalFrames wenig sagen,
deine MenuItems scheinen damit aber wenig zu tun zu haben, die Öffnen/ Schließen oder schreiben in die TextArea?
ich seh schon, ist wohl nicht so gut dass ich die TextArea rausgenommen habe, irgendwo muss die auch wieder rein

die zweite Häfte verstehe ich auch untechnisch kaum, was ist eine Anzeige?
in jedem Fall sollte es z.B. reichen, nur das JInternalFrame auszublenden, dann sind auch enthaltene Buttons usw. weg
 
So, nochmal:

Ich hab meine Menüleiste, mit der Ich den darunterstehenden (= die ganze Form unter der Menüleiste) Bereich abhängig von den geklickten MenuItems, Inhalte anzeigen will. Sprich, wenn FAQ angeklickt wird, soll eben eine Textkomponente angezeigt werden, wenn Hilfe angeklickt wird, kommen meinetwegen zweie Textkomponenten, wo ich meinetwegen eine Eingabe und einen Button (für den Search-Befehl bspw.) habe. Mir wäre recht, wenn ich eben unterhalb der MenüBar einfach komplette Bausteine auswechseln könnte, mit zugehörigen Komponenten zugleich.

Zum zweiten Teil:

der kursive Text besagt doch aus, dass ich die Komponenten auf die JDesktopPane legen soll, oder? Oder was ist mit Content Pane gemeint?
 
Zuletzt bearbeitet:
in dem Text gehts um den Inhalt des JInternalFrames, ähnlich dem Inhalt eines JFrames,
beschreibt quasi Zeile 93 aus meinem Programm, eine Verkürzung zum ContentPane,

letzlich funktioniert fast überall erstmal ein einfaches add(), außer bei Layouts
und JScrollPane findet das auch nicht gut (ein weiterer Fehler in deinem ersten Post),
dort die Komponente im Konstruktor übergeben oder per setViewportView()

----

zu deinen Darstellungswünschen:
kennst du die Varianten mit CardLayout oder JTabbedPane?
die kümmern sich um sowas, selber ist das recht kompliziert

schaue hier
How to Use CardLayout (The Java™ Tutorials > Creating a GUI With JFC/Swing > Laying Out Components Within a Container)
sogar direkt mit einem Beispiel für Wechsel zwischen Buttons und Text

oder suche bei google nach einem der Stichwörter zusammen mit 'java', dann findest du bestimmt auch deutsche Seiten
 

Zurück
Oben