当在JTabbedPane中选择选项卡时,如何去除出现的蓝色边框高亮显示?

5
这是我之前的问题的延续,但它解决了一个具体的问题,对其他人可能有用,所以我想将其作为一个单独的问题发布。
我成功地创建了一个JTabbedPane,但是有一个蓝色边框突出显示哪个选项卡已被选择,我想删除它。

Blue border highlight

为了澄清我的意思,这是Eclipse中没有蓝色边框突出显示的JTabbedPane的图片:

Eclipse

我尝试过的内容已被注释掉:
public class SeaGlassExercise {

    public static void initWindow() {
        JFrame frame = new JFrame("Application Name");
        CustomTabbedPane content = new CustomTabbedPane();
        frame.setContentPane(content);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setLocationByPlatform(true);
//                try {
//                    UIManager.setLookAndFeel(
//        UIManager.getSystemLookAndFeelClassName());
//                } catch (Exception e) {
//                    e.printStackTrace();
//                }
//                SwingUtilities.updateComponentTreeUI(frame);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                initWindow();
            }
        });
    }

}

class CustomTabbedPane extends JPanel {

    public CustomTabbedPane() {
        super(new GridLayout(1, 1));

//        UIManager.put("TabbedPane.contentAreaColor", Color.GREEN);
//        UIManager.put("TabbedPane.light", ColorUIResource.GREEN);
//        UIManager.put("TabbedPane.highlight", ColorUIResource.GREEN);
//        UIManager.put("TabbedPane.shadow", ColorUIResource.GREEN);
//        UIManager.put("TabbedPane.darkShadow", ColorUIResource.GREEN);
//        UIManager.put("TabbedPane.selected", ColorUIResource.GREEN);
//        UIManager.put("TabbedPane.borderHightlightColor", ColorUIResource.GREEN);
//        UIManager.put("TabbedPane.borderHightlightColor", ColorUIResource.GREEN);
//        UIManager.put("TabbedPane.contentBorderInsets", new Insets(0, 0, 0, 0));

        JTabbedPane tabbedPane = new JTabbedPane();
        JComponent panel1 = makeTextPanel("Panel #1");
        tabbedPane.addTab("AAA", panel1);
        JComponent panel2 = makeTextPanel("Panel #2");
        tabbedPane.addTab("BBB", panel2);
        JComponent panel3 = makeTextPanel("Panel #3");
        tabbedPane.addTab("CCC", panel3);
        JComponent panel4 = makeTextPanel("Panel #4");
        tabbedPane.addTab("DDD", panel4);
        add(tabbedPane);
        tabbedPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
    }

    protected JComponent makeTextPanel(String text) {
        JPanel panel = new JPanel();
        JLabel filler = new JLabel(text);
        filler.setHorizontalAlignment(JLabel.CENTER);
        panel.setLayout(new GridLayout(1, 1));
        panel.add(filler);
        return panel;
    }
}

额外信息

我目前在使用OS X Mountain Lion操作系统,以及java版本为"1.7.0_25",Java(TM) SE Runtime Environment (build 1.7.0_25-b15)。我正在使用默认的外观(即我没有在代码中使用 .setUI() 指定任何内容)。

以下是我看过的一些问题:

  1. 控制Java选项卡面板中的颜色
  2. JTabbedPane-在选项卡周围设置默认边框..?
  3. 从JTabbedPane中删除蓝色颜色

类似于其中一个链接问题中的解决方案,您可以通过执行 UIManager.put("TabbedPane.focus", new Color(0, true)); 来获得所需的结果,这不会删除边框,但应该使其完全透明。 - VGR
是的,它应该像所有其他UIManager.put()调用一样工作,但它并没有。唯一似乎产生任何效果的是UIManager.put("TabbedPane.background", Color.GREEN); - Kent Shikama
1
com.apple.laf.AquaTabbedPaneUI 忽略了这个属性。 - trashgod
3个回答

2
请注意,当前的方法可能无法适用于其他平台或外观。如果您当前的项目仅打算在Mac上工作,并且未来不打算更改,那么它可能有效。但通常Java应用程序旨在跨不同平台和外观工作。
话虽如此,您可能想看看这篇有关最流行的外观默认值的有趣文章:Windows、Mac OS X和Linux上常见Java外观的所有UI默认名称。当您查看表格时,您会发现并非所有L&Fs都支持相同的属性,并且在创建UI对象时可能会忽略它们(例如 TabbedPaneUI )。
如果您喜欢Mac L&F(我喜欢),那么我建议您尝试自定义Seaglass Look and Feel,它与Mac的外观非常相似。这样,您将获得以下好处:
- 标准的跨平台L&F类似于您应用程序提供的Mac的L&F。 - 自定义L&F,此更改也将跨平台。 - 统一用户体验(非微不足道的事情)。您和我可能能够使用具有不同L&F的Mac OS、Windows或Linux上的相同应用程序。但许多用户无法做到这一点:当GUI外观不同时,他们会迷失方向。
要自定义Seaglass,您可以按如下列出默认属性:
for(Object key : UIManager.getLookAndFeel().getDefaults().keySet()) {
    System.out.println(key + " = " + UIManager.get(key));
}

这些内容相当多,我确实没有足够的时间给你提供一个工作示例,所以我希望这个想法足够好,能够帮助到你。

注意

如果您不想要框架和对话框具有Seaglass提供的默认装饰(对我来说很丑),那么您需要按如下方式操作:

UIManager.setLookAndFeel(new SeaGlassLookAndFeel());
JFrame.setDefaultLookAndFeelDecorated(false);
JDialog.setDefaultLookAndFeelDecorated(false);

这样,框架和对话框将由当前窗口管理器(最多到操作系统)提供其窗口装饰。

1

我知道正确的视觉解决方案,可以去除选项卡的边框:

tabbedPane.setFocusable(false);

但是您失去了使用选项卡窗格的键的可能性。

+1 我猜它确实能防止某人使用密钥,但它确实有效。 - Kent Shikama

-1

我相信设置边框会移除这些...就像在JTextField上一样。

例如:

JTextField field = new JTextField();
field.setBorder(new EmptyBorder(3, 3, 3, 3));

这将移除蓝色的焦点边框。


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