Java 如何更改JCheckBox中聚焦环的颜色?

Java 如何更改JCheckBox中聚焦环的颜色?,java,swing,jcheckbox,Java,Swing,Jcheckbox,我们的Swing GUI有一个带有白色控件的黑色面板。但是,面板上的JCheckBox实例始终以黑色显示焦点环。渲染聚焦环时,它似乎忽略了前景色。下面是一个示例,我将内容窗格背景设置为灰色,以便可以看到焦点环: 以下是我使用的代码: import javax.swing.*; import java.awt.*; public class ScratchSpace { public static void main(String[] args) throws Exception {

我们的Swing GUI有一个带有白色控件的黑色面板。但是,面板上的JCheckBox实例始终以黑色显示焦点环。渲染聚焦环时,它似乎忽略了前景色。下面是一个示例,我将内容窗格背景设置为灰色,以便可以看到焦点环:

以下是我使用的代码:

import javax.swing.*;
import java.awt.*;

public class ScratchSpace {

    public static void main(String[] args) throws Exception {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JCheckBox checkBox = new JCheckBox("Hello cruel world");
                checkBox.setForeground(Color.WHITE);
                checkBox.setOpaque(false);

                JPanel contentPane = new JPanel();
                contentPane.setOpaque(true);
                contentPane.setBackground(new Color(0.5f, 0.5f, 0.5f));
                contentPane.add(checkBox);

                JFrame frame = new JFrame();
                frame.setContentPane(contentPane);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
}

如何让JCheckBox以特定颜色渲染聚焦环?理想情况下,它将使用控件的前景色。

您可以尝试更改look and feel属性的
复选框。请注意,这样做将影响所有
JCheckBox
的效果

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestCheckBox {

    public static void main(String[] args) {
        new TestCheckBox();
    }

    public TestCheckBox() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                UIManager.put("CheckBox.focus", Color.RED);

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new GridBagLayout());
                frame.add(new JCheckBox("Hello world"));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

}


您可以尝试更改look and feel属性
复选框。请注意,这样做将影响所有
JCheckBox
s

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestCheckBox {

    public static void main(String[] args) {
        new TestCheckBox();
    }

    public TestCheckBox() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                UIManager.put("CheckBox.focus", Color.RED);

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new GridBagLayout());
                frame.add(new JCheckBox("Hello world"));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

}


谢谢我需要这样做,只有一个面板-其余的应用程序不应该改变。我可以更改单个组件的UI属性吗?不,很遗憾,您需要创建自己的UI委托并进行自己的调整,因为它完全由此处控制。例如,您可以覆盖
WindowsCheckBoxUI
paintFocus
,并进行自己的调整,但如果您决定使用不同的外观,这将有问题…谢谢。我需要这样做,只有一个面板-其余的应用程序不应该改变。我可以更改单个组件的UI属性吗?不,很遗憾,您需要创建自己的UI委托并进行自己的调整,因为它完全由此处控制。例如,您可以覆盖
WindowsCheckBoxUI
paintFocus
,并进行自己的调整,但如果您决定使用不同的外观,则会出现问题。。。