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

Java 如何删除在JTabbedPane中选择选项卡时出现的蓝色边框突出显示?,java,swing,osx-mountain-lion,look-and-feel,jtabbedpane,Java,Swing,Osx Mountain Lion,Look And Feel,Jtabbedpane,这是我的一个延续,但它解决了一个可能对其他人有用的具体问题,所以我想我会把它作为一个单独的问题发布 我已成功创建了一个JTabbedPane,但有一个蓝色边框突出显示,显示我要删除的选项卡: 为了澄清我的意思,这里有一张没有Eclipse蓝色边框突出显示的JTabbedPane图片: 我尝试过的事情已经被评论掉了: public class SeaGlassExercise { public static void initWindow() { JFrame fra

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

我已成功创建了一个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运行时环境(build 1.7.0_25-b15)运行我的程序。我使用的是默认的外观(即,我没有在代码中使用.setUI()指定任何内容)

以下是我已经研究过的一些问题:


  • 我知道移除选项卡边框的正确视觉解决方案:

    tabbedPane.setFocusable(false);
    

    但是您无法使用选项卡式窗格的键。

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

    说到这里,您可能想看看这篇关于最流行的外观和感觉默认值的有趣文章:。查看这些表时,您会发现并非所有L&f都支持相同的属性,并且在创建UI对象时可能会忽略它们(f.i.
    TabbedPaneUI

    如果你喜欢Mac L&F(我喜欢),那么我建议你尝试定制一款与Mac非常相似的产品。这样,您将获得以下好处:

    • 标准的跨平台L&F与您的应用程序附带的Mac L&F类似
    • 自定义L&F,此更改也将跨平台进行
    • 统一用户体验(非小事)。也许你和我可以在Mac OS、Windows或Linux上使用不同L&F的同一个应用程序。但许多用户做不到:当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);
    

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

    我相信设置边框将删除这些。。。它在JTextField上执行

    例如:

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

    这将删除蓝色焦点边框。

    与其中一个链接问题中的解决方案类似,您可以通过执行
    UIManager.put(“TabbedPane.focus”,新颜色(0,true))获得所需结果,它不会删除边框,但应该使其完全透明。是的,它应该像所有其他UIManager.put()调用一样工作,但它不会。唯一能产生效果的是
    UIManager.put(“TabbedPane.background”,Color.GREEN)
    com.apple.laf.AquaTabbedPaneUI
    忽略此属性。+1我想它确实会阻止某人使用密钥,但确实有效。