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

时间:2014-01-26 05:27:59

标签: java swing osx-mountain-lion look-and-feel jtabbedpane

这是我previous question的延续,但它解决了一个对其他人有用的特定问题,所以我想我会把它作为一个单独的问题发布。

我已经成功创建了一个JTabbedPane,但是有一个蓝色边框突出显示,显示我要删除的选项卡:

Blue border highlight

为了澄清我的意思,这里是一张JTabbedPane的图片,没有Eclipse的蓝色边框高亮显示:

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运行时环境(版本1.7.0_25-b15)运行我的程序。我使用的是默认外观(即我的代码中没有使用.setUI()指定任何内容)。

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

  1. Controlling Color in Java Tabbed Pane
  2. JTabbedPane - set default border around tabs..?
  3. remove blue color from JTabbedPane

3 个答案:

答案 0 :(得分:2)

请注意,目前的方法可能不适用于其他平台/外观。如果您当前的项目仅适用于您的Mac,并且您不打算将来进行更改,那么在这种情况下它可能会起作用。但通常Java应用程序旨在跨不同平台和外观工作。

话虽如此,你可能想看看这篇关于最流行的外观和感觉默认值的有趣文章:All UI defaults names for common Java look and feels on Windows, Mac OS X, and Linux。当您查看表格时,您将看到并非所有L& Fs都支持相同的属性,并且在创建UI对象时可能会忽略它们(f.i。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);

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

答案 1 :(得分:1)

我知道删除标签边框的正确视觉解决方案:

tabbedPane.setFocusable(false);

但是你失去了使用标签窗格键的可能性。

答案 2 :(得分:-1)

我相信设置边框会删除这些......它会在JTextField上删除。

例如:

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

这将删除蓝色焦点边框。