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, новые вставки(0, 0, 0, 0)); UIManager.getDefaults().put(TabbedPane.tabsOverlapBorder, false);' Который работает для правой, нижней, левой границ. Только теперь нужно снять верхнюю часть. Спасибо в любом случае. - person Brandon; 16.05.2013