JTabbedPane FlowLayout хвърля ArrayIndexOutOfBoundsException

Опитвам се да приложа оформлението на потока към JTabbedPane, така че да мога да задам hgap(0) и vgap(0). Оформлението по подразбиране за JTabbedPane оставя празнини навсякъде.

Следният код хвърля, когато се опитвам да задам оформлението:

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.lang.reflect.InvocationTargetException;

import javax.swing.*;


public class Main {

    public static void main(String[] args) {
        try {
            SwingUtilities.invokeAndWait(new Runnable() {
                @Override public void run() {
                    JFrame F = new JFrame("Testing");
                    F.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    JTabbedPane Pane = new JTabbedPane();
                    Pane.setLayout(new FlowLayout(0, 0, FlowLayout.CENTER));
                    F.setLayout(new BorderLayout());
                    F.add(Pane, BorderLayout.CENTER);

                    Pane.addTab("Hello", new JPanel());
                                    F.pack();
                    F.setVisible(true);
                }
            });
        } catch (InvocationTargetException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}

Какво виждам без оформлението на потока: въведете описание на изображението тук

Искам да премахна тюркоазената рамка около черния JPanel. Не искам да премахвам раздела. Просто искам да премахна разстоянието между раздела и компонента. Искам да премахна пространството около компонента, който изглежда синкав на горната снимка.

Защо хвърля изключение, което казва ArrayIndexOutOfBounds:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0
at javax.swing.plaf.basic.BasicTabbedPaneUI.paintTabArea(Unknown Source)
at javax.swing.plaf.basic.BasicTabbedPaneUI.paint(Unknown Source)
at javax.swing.plaf.metal.MetalTabbedPaneUI.paint(Unknown Source)
at javax.swing.plaf.metal.MetalTabbedPaneUI.update(Unknown Source)
at javax.swing.JComponent.paintComponent(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JLayeredPane.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paintToOffscreen(Unknown Source)
at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(Unknown Source)
at javax.swing.RepaintManager$PaintManager.paint(Unknown Source)
at javax.swing.RepaintManager.paint(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at java.awt.GraphicsCallback$PaintCallback.run(Unknown Source)
at sun.awt.SunGraphicsCallback.runOneComponent(Unknown Source)
at sun.awt.SunGraphicsCallback.runComponents(Unknown Source)
at java.awt.Container.paint(Unknown Source)
at java.awt.Window.paint(Unknown Source)
at javax.swing.RepaintManager$3.run(Unknown Source)
at javax.swing.RepaintManager$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.prePaintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.access$1000(Unknown Source)
at javax.swing.RepaintManager$ProcessingRunnable.run(Unknown Source)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(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)

person Brandon    schedule 15.05.2013    source източник
comment
Не мисля, че можете да се забърквате с оформлението на JTabbedPane. Просто няма смисъл дори да обмисляме това. Вероятно има собствено специално оформление.   -  person Hovercraft Full Of Eels    schedule 16.05.2013
comment
Как мога да премахна пропуските около него тогава? Оставям тези празнини навсякъде около компонента: S Опитах и ​​други оформления.. да, и те хвърлят.   -  person Brandon    schedule 16.05.2013


Отговори (1)


Не мисля, че можете да се забърквате с оформлението на JTabbedPane. Просто няма смисъл дори да обмисляме това. Вероятно има собствено специално оформление.


Редактиране 1
И всъщност със сигурност го прави: TabbedPaneLayout

Решение: не се забърквайте с оформлението на JTabbedPane и със сигурност не го разменяйте с друго оформление, което няма да функционира с JTabbedPane.


Редактиране 2
заявявате:

Как мога да премахна пропуските около него тогава? Оставям тези празнини навсякъде около компонента: S Опитах и ​​други оформления.. да, и те хвърлят.

Вероятно би било най-добре да промените оформлението на компонентите, държани от JTabbedPane, за да им позволите да преоразмеряват и запълват празнини, но за да можем да разберем напълно какви проблеми може да имате, моля, покажете изображения на това, което виждате и какво се опитвате да покажете.


Редактиране 3
Заявявате:

искате да премахнете тюркоазената граница около черния JPanel. Не искам да премахвам раздела. Просто искам да премахна разстоянието между раздела и компонента. Искам да премахна пространството около компонента, който изглежда синкав на снимката по-горе.

Това вероятно е проблем с външния вид и усещането, а не проблем с оформлението. Що се отнася до директния отговор на първоначалния ви въпрос, отговорът е: не се забърквайте с оформлението на JTabbedPane, точка. Що се отнася до вашия проблем, който се опитвате да разрешите, обмислете използването на различен L&F, или ако това не работи, напишете свой собствен делегат на потребителския интерфейс за JTabbedPane. Самият аз никога не съм правил подобно нещо.

person Hovercraft Full Of Eels    schedule 15.05.2013
comment
Здравейте сър. Добавих снимка. Както и описание с него, което посочва какво се опитвам да премахна. - person Brandon; 16.05.2013
comment
Ще маркирам това като решено. Предполагам, че е достатъчно логично.. Опитах различен външен вид и усещане. Опитах: 'UIManager.getDefaults().put(TabbedPane.contentBorderInsets, new Insets(0, 0, 0, 0)); UIManager.getDefaults().put(TabbedPane.tabsOverlapBorder, false);' Което работи за дясната, долната, лявата граница. Просто трябва да махна горната част сега. Благодаря все пак. - person Brandon; 16.05.2013