Windows 7上的JComboBox具有渲染工件

时间:2014-06-17 10:19:50

标签: java swing jcombobox

当我在Windows 7上使用JComboBox时,四个角的每个角都有一个与父组件的背景颜色不匹配的像素。

在Windows 8中,这个问题并没有发生(尽管这可能是因为在Windows 8中,JComboBox被渲染为完美的矩形)。它也不会发生在OS X上。

如何让角落像素让父​​组件的背景颜色通过?

这是显示问题的图片:

enter image description here

这是我使用的自包含代码示例:

import com.sun.java.swing.plaf.windows.WindowsLookAndFeel;

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

public class Main {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                try {
                    UIManager.setLookAndFeel(new WindowsLookAndFeel());
                } catch (Exception e) {
                    e.printStackTrace();
                }

                JPanel contentPane = new JPanel();
                contentPane.setBackground(Color.WHITE);

                JComboBox<String> comboBox = new JComboBox<String>(new String[]{"One", "Two"});
                contentPane.add(comboBox);

                JFrame frame = new JFrame("JComboBox Test");
                frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
                frame.setContentPane(contentPane);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
}

2 个答案:

答案 0 :(得分:3)

尝试删除边框...

comboBox.setBorder(null);

enter image description here

下一个选择是设计一个专门的外观代表,在Windows上实现你想要的......

例如......

public static class MyComboBoxUI extends WindowsComboBoxUI {

    @Override
    protected void installDefaults() {
        super.installDefaults();
        LookAndFeel.uninstallBorder(comboBox);
    }

    public static ComponentUI createUI(JComponent c) {
        return new MyComboBoxUI();
    }

}

然后使用...

安装它
UIManager.put("ComboBoxUI", MyComboBoxUI.class.getName());

这意味着您不需要从您创建的每个组合框中删除边框

或者,您可以简单地覆盖UIManager ...

中的默认边框属性
UIManager.put("ComboBox.border", new EmptyBorder(0, 0, 0, 0));

无论哪种方式,它都会影响你应用它后创建的所有组合框......

答案 1 :(得分:-1)

我要尝试的第一件事是JComboBox上的setOpaque(false)。

此外,您不应直接设置WindowLookAndFeel。而是设置系统默认 L&amp; F:

// force platform native look & feel
try {
    final String className = UIManager.getSystemLookAndFeelClassName();
    UIManager.setLookAndFeel(className);
} catch (final Exception e) {
    // ignore
}

无论您运行的操作系统是什么,这都将始终设置操作系统的默认外观。