Swing JTabbedPane: Zusätzliche Buttons neben den Tabs

hochl

Neues Mitglied
Hallo,

hier im Forum hat es ja schon mehrfach Fragen zu Icon oder zusätzlichen JComponents auf einem Tab gegeben. Ich möchte jetzt aber rechts neben den Tabs JButtons (oder sonstige JComponents) positionieren (s. Anhang). Ich hab jetzt schon einige Zeit herumprobiert, komme aber überhaupt nicht weiter. Hat jemand eine Idee?
 

Anhänge

  • JTabbedPaneMitButtons.png
    JTabbedPaneMitButtons.png
    1,7 KB · Aufrufe: 42
Moin,

dürfte IMHO gar nicht gehen!

Ich hatte mir deswegen schon mal dieAnzeige bestimmter Werte in einem Label auf einen eigenen Reiter gelegt, der ansonsten obsolet ist !

Gruß
Klaus
 
So ungerne ich auch meinem Freund VFL_Freak widerspreche, so geht dies doch🙂

Mit der Methode setTabComponentAt kann eine beliebige Component für ein Tab gesetzt werden.
Ich habe mal das Tutorial von Oracle dahingehend geändert und nun werden zwei Buttons hinzugefügt (siehe Screenshot).

Java:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.KeyEvent;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
 
@SuppressWarnings("serial")
public class TabbedPaneDemo extends JPanel {
    public TabbedPaneDemo() {
        super(new GridLayout(1, 1));
         
        JTabbedPane tabbedPane = new JTabbedPane();
        ImageIcon icon = createImageIcon("images/middle.gif");
         
        JComponent panel1 = makeTextPanel("Panel #1");
        tabbedPane.addTab("Tab 1", icon, panel1,
                "Does nothing");
        tabbedPane.setMnemonicAt(0, KeyEvent.VK_1);
         
        JComponent panel2 = makeTextPanel("Panel #2");
        tabbedPane.addTab("Tab 2", icon, panel2,
                "Does twice as much nothing");
        tabbedPane.setMnemonicAt(1, KeyEvent.VK_2);
         
        JComponent panel3 = makeTextPanel("Panel #3");
        tabbedPane.addTab("Tab 3", icon, panel3,
                "Still does nothing");
        tabbedPane.setMnemonicAt(2, KeyEvent.VK_3);
         
        JComponent panel4 = makeTextPanel(
                "Panel #4 (has a preferred size of 410 x 50).");
        panel4.setPreferredSize(new Dimension(410, 50));
        tabbedPane.addTab("Tab 4", icon, panel4,
                "Does nothing at all");
        tabbedPane.setMnemonicAt(3, KeyEvent.VK_4);
         
        //Add the tabbed pane to this panel.
        JPanel buttonPanel = new JPanel();
        buttonPanel.add(new JLabel("Tab 1"));
        buttonPanel.add(new JButton("Button 1"));
        buttonPanel.add(new JButton("Button 2"));
        tabbedPane.setTabComponentAt(0, buttonPanel);
        JPanel buttonPanel2 = new JPanel();
        buttonPanel2.add(new JLabel("Tab 3"));
        buttonPanel2.add(new JButton("Button 3"));
        buttonPanel2.add(new JButton("Button 4"));
        tabbedPane.setTabComponentAt(2, buttonPanel2);
        add(tabbedPane);
         
        //The following line enables to use scrolling tabs.
        tabbedPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
    }
     
    protected JComponent makeTextPanel(String text) {
        JPanel panel = new JPanel(false);
        JLabel filler = new JLabel(text);
        filler.setHorizontalAlignment(JLabel.CENTER);
        panel.setLayout(new GridLayout(1, 1));
        panel.add(filler);
        return panel;
    }
     
    /** Returns an ImageIcon, or null if the path was invalid. */
    protected static ImageIcon createImageIcon(String path) {
        java.net.URL imgURL = TabbedPaneDemo.class.getResource(path);
        if (imgURL != null) {
            return new ImageIcon(imgURL);
        } else {
            System.err.println("Couldn't find file: " + path);
            return null;
        }
    }
     
    /**
     * Create the GUI and show it.  For thread safety,
     * this method should be invoked from
     * the event dispatch thread.
     */
    private static void createAndShowGUI() {
        //Create and set up the window.
        JFrame frame = new JFrame("TabbedPaneDemo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         
        //Add content to the window.
        frame.add(new TabbedPaneDemo(), BorderLayout.CENTER);
         
        //Display the window.
        frame.pack();
        frame.setVisible(true);
    }
     
    public static void main(String[] args) {
        //Schedule a job for the event dispatch thread:
        //creating and showing this application's GUI.
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                //Turn off metal's use of bold fonts
        UIManager.put("swing.boldMetal", Boolean.FALSE);
        createAndShowGUI();
            }
        });
    }
}
 

Anhänge

  • tabbedpane.png
    tabbedpane.png
    37,4 KB · Aufrufe: 84
Zuletzt bearbeitet:
Hi turtle,

oh, das sieht interessant aus 🙂
Das mus sich bei Gelegenheit mal ausprobieren !

Danke für Beispiel :applaus: :toll:
Gruß
Klaus
 
Vielen Dank für die Antworten. Leider sind die Buttons auf dem Tab keine Lösung für mich. Die Buttons dürfen eben nicht auf einem Tab erscheinen, sondern müssen eine feste Position auf der linken Seite haben. Hat VfL_Freak möglicherweise doch recht?
 
Die einzige Lösung die ich bisher dafür gefunden habe, ist die Klasse JideTabbedPane zu benutzen (in Open Source Bibliothek von Jide). Hier kann man eine Komponente definieren die entweder vor oder nach der TabBar angezeigt wird.
 
Kenn mich mit Swing ja nicht aus, aber gibt es da kein "stack" pane oder so, bei dem man transparente Items übereinanderschaufeln kann? Dann könntest du doch erst dein TabPane erstellen und dann eben die zwei Buttons in einem eigenen Pane darüberlegen (und nach rechts oben schieben). Dann musst du nur darauf aufpassen, dass deine Tabs nicht in den Bereich der Buttons reichen.

Grüsse

PS: Bitte nicht Steinigen, wenn's nicht geht :-D
 
Konntest du mit JideTabbedPane was anfangen?

Wenn ich so darüber nachdenke, wie man es lösen könnte, ohne eine externe Bibliothek, würde mir folgendes in den Sinn kommen:

Die Zeile mit den Tabs:
- ist ein eigener Component
- Component 1 : TabbedPane
- Component 2 : ButtonPanel
Darunter kommt ein weiterer Composite.
Dieser hört auf die Selections aus der TabbedPane und zeigt diese dann entsprechend an.

Bedeutet also: Die Tabbed pane stellt lediglich die Tabs zur Verfügung, die eigentliche Darstellung erfolgt aber in einer anderen Composite.
So kannst du neben die TabbedPane ein ButtonPanel erstellen. welches stets rechts neben den Tabs zu sehen ist.
Das wäre mein Ansatz gewesen ^^
 

Neue Themen


Zurück
Oben