2009-08-22 20 views
0

Könnte jemand erklären, was ich mit meinen Klassen falsch mache, dass mein JTabbedPane nicht angezeigt wird, wenn JFrame.setvisible auf true gesetzt ist?Warum wird dieses Swing-Registerkartenfenster nicht angezeigt?

Ja, die Hauptmethode des Programms (die ich hier nicht einfügen werde) verwendet den Event-Dispatching-Thread, um ArionGUI zu initiieren.

Hier ist mein Code für die JFrame:

import javax.swing.*; 


public class ArionGUI extends JFrame { 

    public ArionGUI() { 
     // Set up GUI frame for Arion 
     JFrame arionFrame = new JFrame("Arion v 0.01"); 
     // Add Arion Tabbed Pane 
     arionFrame.getContentPane().add(new ArionTabbedPane()); 
     // Terminate the application when closed 
     arionFrame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
     // Set the size of the frame 
     arionFrame.setSize(500, 500); 
     // Center window 
     arionFrame.setLocationRelativeTo(null); 
     // Prevent user from resizing window 
     arionFrame.setResizable(false); 
     // Make Arion frame visible on screen 
     arionFrame.setVisible(true);     
    } 
} 

Und hier ist mein Code für die JTabbedPane:

import javax.swing.JTabbedPane; 
import javax.swing.JLabel; 
import javax.swing.JComponent; 

public class ArionTabbedPane extends JComponent { 

    JTabbedPane arionTabbedPane; 

    public ArionTabbedPane() { 

     arionTabbedPane = new JTabbedPane(JTabbedPane.TOP); 
     arionTabbedPane.addTab("Characters", new JLabel("This is the characterz tab")); 
     arionTabbedPane.addTab("Miscellaneous", new JLabel("This is the miscellaneous tab")); 
     add(arionTabbedPane); 

    } 

} 

Antwort

3

Da ArionTabbedPane nicht wirklich ein Registerteilfenster ist. Es ist ein Wrapper für einen. Sie fügen Ihrem JFrame nur eine Komponente hinzu, nicht ein TabbedPane. Wenn Sie den ArionTabbed-Bereich zu Ihrem JFrame hinzufügen möchten, müssen Sie JTabbedPane erweitern. Wenn Sie das Fenster, das es umschließt, hinzufügen möchten, benötigen Sie eine Funktion, die einen Verweis auf das interne Registerkartenfenster zurückgibt, und Sie müssen das zu Ihrem JFrame hinzufügen. Etwas wie folgt aus:

ArionTabbedPane tabbedPane = new ArionTabbedPane(); 
arionFrame.getContentPane().add(tabbedPane.getPane()); 

Wo ArionTabbedPane.getPane() ist so etwas wie dieses:

Public JTabbedPane getPane() { 
return arionTabbedPane; 
} 

Edit: Hmm .. das andere, was Sie, dass mioght Arbeit tun können, wenn Sie nicht wollen, Um beides zu tun, haben ArionTabbedPane JPanel anstelle von JComponent erweitert. Java weiß, dass JPanel ein Container ist, und wenn es zu Ihrem JFrame hinzugefügt wird, sollte es innerhalb des JPanel überprüfen, ob Dinge angezeigt werden. Die einzige Sache, die Sie für das ändern müssten, würde ArionTabbedPane haben, erweitern JPanel anstelle von JComponent.

Bearbeiten Sie erneut, wenn Sie JTabbedPane erweitern, dann müssen Sie das interne JTabbedPane entfernen. Die neue ArionTabbedPane sollte wie folgt aussehen:

public class ArionTabbedPane erweitert JTabbedPane {

public ArionTabbedPane() { 
    super(JTabbedPane.TOP); // Calls JTabbedPane's constructor. 
    this.addTab("Characters", new JLabel("This is the characterz tab")); 
    this.addTab("Miscellaneous", new JLabel("This is the miscellaneous tab")); 
} 

}

wirklich viel einfacher.

+0

+1 ich den Code neu erstellen hatte, das Problem zu sehen ... Gut gemacht – OscarRyz

+0

Dank. Ihre erste Antwort ArionTabbedPane sollte JTabbedPane funktioniert erweitern! Das ist alles was ich brauche. – elwynn

+0

Vorsichtig, aber Sie müssen Ihre interne JTabbedPane entfernen, wenn Sie JTabbedPane erweitern möchten. Du wirst es nicht mehr benutzen. Du bist neu Klasse sollte so etwas aussehen wie ich jetzt in die Antwort bearbeiten werde. –

Verwandte Themen