JTabbedPane FlowLayout抛出ArrayIndexOutOfBoundsException

时间:2013-05-15 20:23:07

标签: java swing jtabbedpane indexoutofboundsexception flowlayout

我正在尝试将流布局应用于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();
        }
    }
}

没有流程布局我看到了什么: enter image description here

我想删除黑色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 个答案:

答案 0 :(得分:3)

我不认为你可以搞乱JTabbedPane的布局。即使考虑这一点也没有意义。它可能有自己的专业布局。


编辑1
实际上它肯定会:TabbedPaneLayout

解决方案:不要弄乱JTabbedPane的布局,当然也不要把它换成另一个不能用JTabbedPane运行的布局。


编辑2
你说:

  

如何消除周围的空隙呢?我在组件周围留下了这些空隙:S我也尝试了其他布局......是的,他们也扔了。

最好更改JTabbedPane所持有的组件的布局,以允许它们重新调整大小并填补空白,但为了使我们能够完全理解您可能遇到的问题,请显示正是您所看到的以及您尝试展示的内容。


编辑3
你说:

  

希望移除Black JPanel周围的绿松石边框。我不想删除标签。我只想删除选项卡和组件之间的空间。我想删除上图中看起来像蓝色的组件周围的空间。

这可能是一个外观&感觉问题而不是布局问题。至于你原来问题的直接答案,答案是:不要混淆JTabbedPane布局,期间。至于你试图解决的问题,考虑使用不同的L& F,或者如果这不起作用,为JTabbedPane编写自己的ui委托。我自己从来没有这样做过。

相关问题