【问题标题】:How do I remove the blue border highlight that appears when selecting a tab in a JTabbedPane?如何删除在 JTabbedPane 中选择选项卡时出现的蓝色边框突出显示?
【发布时间】:2014-02-17 01:33:56
【问题描述】:

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

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

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

我试过的东西都被注释掉了:

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

【问题讨论】:

  • 与其中一个链接问题中的解决方案类似,您可以通过 UIManager.put("TabbedPane.focus", new Color(0, true)); 获得所需的结果,这不会删除边框但应该使其完全透明。
  • 是的,它应该像所有其他 UIManager.put() 调用一样工作,但事实并非如此。唯一似乎有任何效果的是UIManager.put("TabbedPane.background", Color.GREEN);
  • com.apple.laf.AquaTabbedPaneUI 忽略此属性。

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    tabbedPane.setFocusable(false);
    

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

    【讨论】:

    • +1 我猜它确实会阻止某人使用密钥,但它确实有效。
    【解决方案3】:

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

    例如:

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

    这会移除蓝色焦点边框。

    【讨论】:

      猜你喜欢
      • 2021-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-18
      • 1970-01-01
      • 2015-12-20
      • 1970-01-01
      相关资源
      最近更新 更多