Java:如何在JTabbedPane上去除边距/填充?

5
我想知道如何去掉我的JTabbedPane和JFrame内容窗格之间以及JTabbedPane和其内部JPanel之间的边距。我圈出了我想要移除的边距。绿线是用来显示JTabbedPane内部JPanel之间的间隙。
我尝试查看一些名为setMargin的方法,但它不存在于JTabbedPane上。我还检查了不同布局(根内容窗格,我的JPanel等)上的HgapVgap(均为0)。
所以欢迎任何建议。 谢谢。 The image is here

你有一个实时示例吗?如果有,请发送链接,我可以解决你的CSS问题。 - bluefoot
3个回答

7

外观决定了选项卡窗格内组件周围的空间大小 - 通常会根据您的桌面默认值来确定。JTabbedPane没有设置内部组件周围插入的方法。

可以全局设置所有选项卡窗格的插入(注意:仅适用于MetalLookAndFeel,可能也会适用于Windows L&F,但可能不会适用于不基于BasicLookAndFeel的GTK或Nimbus外观)。这将改变VM中所有选项卡窗格的外观

UIManager.getDefaults().put("TabbedPane.contentBorderInsets", new Insets(0,0,0,0));
UIManager.getDefaults().put("TabbedPane.tabsOverlapBorder", true);

您可能还需要确保您的JTabbedPane具有EmptyBorder(0,0,0,0),并且其中包含的组件也是如此。

如果这在您的目标桌面上不起作用,则可以采用以下替代方法:

  • 如果您不关心选项卡窗格与本地应用程序选项卡窗格的区别,那么 (不愉快的) 替代方案是编写自己的TabbedPaneUI。
  • 将要像这样显示的单个JTabbedPane的UI委托设置为MetalTabbedPaneUI或一些其他响应这些属性的UI委托。

6

我刚遇到同样的问题,其他人说的都不是很完整,所以我想出了这个解决方法:

    import javax.swing.plaf.basic.BasicTabbedPaneUI;

    tabbedPane.setUI(new BasicTabbedPaneUI() {
        private final Insets borderInsets = new Insets(0, 0, 0, 0);
        @Override
        protected void paintContentBorder(Graphics g, int tabPlacement, int selectedIndex) {
        }
        @Override
        protected Insets getContentBorderInsets(int tabPlacement) {
            return borderInsets;
        }
    });

即使不重写paintContentBorder方法,它也可以正常工作。但是这样做可能会使UI在调整大小或类似操作时稍微更有效率,因为标准的方法似乎将其委托给多个其他方法。

在WindowMaker中的Oracle Java 6 u43、Mac OS X 10.6.7上的Mac Java 6 u37以及带有Java 7 u07的Windows 7上进行了测试,希望这可以帮助某些人 :-)


虽然这可以去除边框,但它也会改变实际选项卡上的用户界面。 - Thomas Ahle

1

通过在UI元素上设置边框来添加边距。查看您的JTabbedPane边框的设置。


谢谢您的回答,我可以通过将“right”和“bottom”属性设置为负值来去除边框。我认为这样做有点奇怪。 - grandouassou

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接