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)
1 2

1 ответ:

Я не думаю, что вы можете испортить макет JTabbedPane. Это просто не имеет смысла даже рассматривать это. Он, вероятно, имеет свою собственную специализированную планировку.


Edit 1
И на самом деле это действительно так: TabbedPaneLayout

Решение: не связывайтесь с макетом JTabbedPane и, конечно же, не меняйте его на другой макет, который не будет работать с JTabbedPane.


Правка 2
вы заявляете:

Как же тогда я могу удалить пробелы вокруг него? Я оставляет эти пробелы вокруг компонента: S Я пробовал и другие макеты.. да, они тоже бросают.

Вероятно, было бы лучше изменить расположение компонентов, удерживаемых JTabbedPane, чтобы позволить им изменить размер и заполнить пробелы, но чтобы мы могли полностью понять, какие проблемы у вас могут возникнуть, пожалуйста, покажите изображения только того, что вы видите и что вы пытаетесь показать.


Правка 3
Вы заявляете:

Хотите убрать бирюзовый вид пограничная штука вокруг черной панели JP. Я не хочу удалять закладку. Я просто хочу удалить пространство между вкладкой и компонентом. Я хочу удалить пространство вокруг компонента, который выглядит синим на приведенном выше рисунке.

Это, вероятно, проблема внешнего вида, а не макета. Что касается прямого ответа на ваш первоначальный вопрос, ответ таков: Не связывайтесь с макетом JTabbedPane, точка. Что касается вашей проблемы, которую вы пытаетесь решить, рассмотрите возможность использования другого L&F, или, если это не работает, напишите свой собственный делегат пользовательского интерфейса для JTabbedPane. Хотя сам я никогда такого не делал.