JTabs

Status
Nicht offen für weitere Antworten.

Skully

Mitglied
Hi!

Wie kann man eigentlich am besten Tabs erstellen, wo auch oben bei den tabs ein Symbol zum schliessen ist?
Oder addet man zum TabbedPane am besten einen internal Frame oder so und nutzt dort das schliessen?
 

meez

Top Contributor
Mit einm eigenen UI...

Hier ein Beispiel:
Code:
import java.awt.Color;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.plaf.basic.BasicTabbedPaneUI;

public class JCloseableTabbedPaneUI extends BasicTabbedPaneUI {
    public JCloseableTabbedPaneUI() {
        super();
    }

    protected void paintTab(Graphics g, int tabPlacement, Rectangle[] rects, int tabIndex, Rectangle iconRect,
            Rectangle textRect) {
        super.paintTab(g, tabPlacement, rects, tabIndex, iconRect, textRect);
        Rectangle rect = rects[tabIndex];
        g.setColor(Color.black);
        g.drawRect(rect.x + 5, rect.y + 5, 10, 10);
        g.drawLine(rect.x + 5, rect.y + 5, rect.x + 15, rect.y + 15);
        g.drawLine(rect.x + 15, rect.y + 5, rect.x + 5, rect.y + 15);

    }

    protected int calculateTabWidth(int tabPlacement, int tabIndex, FontMetrics metrics) {
        return super.calculateTabWidth(tabPlacement, tabIndex, metrics) + 20;
    }

    protected MouseListener createMouseListener() {
        return new ClosableTabMouseHandler();
    }

    class ClosableTabMouseHandler extends MouseHandler {
        public ClosableTabMouseHandler() {
            super();
        }

        public void mouseClicked(MouseEvent e) {
            int x = e.getX();
            int y = e.getY();
            int tabIndex = -1;
            int tabCount = tabPane.getTabCount();
            f:for (int i = 0; i < tabCount; i++) {
                if (rects[i].contains(x, y)) {
                    tabIndex = i;
                    break f;
                }
            }
            if (tabIndex >= 0) {
                Rectangle tabRect = rects[tabIndex];
                x = x - tabRect.x;
                y = y - tabRect.y;
                if ((x >= 5) && (x <= 15) && (y >= 5) && (y <= 15)) 
                    tabPane.remove(tabIndex);
                
            }
        }
    }
}


Dann einfach mit setUI(new JCloseableTabbedPaneUI()) auf die JTabbedPane auftragen...
 

Skully

Mitglied
ne Idee wieso ich nach bissel rumprobieren, also hinzufügen und entfernen neuer Tabs folgende Exception bekomme, sobald ich aus dem Fokus der Tabs gehe, sei es ich geh auf Menu oder wechsel zu anderem Programm

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 1
at javax.swing.plaf.basic.BasicTabbedPaneUI.getTabBounds(Unknown Source)
at javax.swing.plaf.basic.BasicTabbedPaneUI.getTabBounds(Unknown Source)
at javax.swing.plaf.basic.BasicTabbedPaneUI$Handler.focusLost(Unknown Source)
at java.awt.Component.processFocusEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.KeyboardFocusManager.redispatchEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
K JTabs werden nicht angezeigt AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen


Oben