扩展Swing JComboBox以删除不需要的边框

时间:2014-12-28 20:44:21

标签: java swing jcombobox

我花了最后几个小时寻找解决方案或者至少是关于这个问题的合适指南,但一无所获。

我正在为我的一个小GUI实现自定义Swing外观和感觉。到目前为止,我一直在使用UIManager.put("key", values);方法取得了很好的成功,但在适当修改JComboBoxes时我遇到了困难。

使用this list我设法让我的jComboBox真正接近我想要的样子:

modified JComboBox

我有两个问题,主要问题和次要问题:

  • 主要

    enter image description here

    我希望蓝色边框不见了。

  • enter image description here

    我真的很喜欢黑色边框消失了。

key中显然没有UIDefaults与两个边界有任何关系:它们似乎在某种程度上硬编码在我修改的外观(应该是金属)。我使用手动扩展ComboBoxRenderer并设法得到这个:

package exec.laf.theme;

import java.awt.*;
import javax.swing.*;
import javax.swing.plaf.basic.BasicComboBoxRenderer;


public class ComboBoxRenderer extends BasicComboBoxRenderer {
    private Color background;
    private Color selectionBackground;

    public ComboBoxRenderer() {
        super();

        background = UIManager.getColor("ComboBox.background");
        selectionBackground = UIManager.getColor("ComboBox.selectionBackground");
    }

    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
        setText((String) value);

        if (isSelected) setBackground(selectionBackground);
        else setBackground(background);

        return this;
    }
}

每当我像这样创建一个JComboBox时指定此Renderer:

aComboBox.setRenderer(new ComboBoxRenderer());

获得与非扩展JComboBox相同的外观。

问题在于,通过此扩展程序,我无法找到触摸这些边框的方法。添加setBorder(new EmptyBorder(0, 0, 0, 0));无法完成任何操作,因为它只是为列出的项添加了边框。

我检查了javax.swing.plaf.basic.BasicComboBoxRenderer的源代码以查看是否在那里应用了任何边框,但没有找到任何边框(唯一的边框是应用于所列项目的边框,我可以覆盖如上所示。

我该怎么办?我是否延长了错误的课程,或者我错过了其他什么?

3 个答案:

答案 0 :(得分:0)

我找到的解决方案是:

UIManager.put("ComboBox.borderPaintsFocus", Boolean.TRUE)

这在ComboBoxUI中设置了一个布尔值,用于防止渲染焦点边框,焦点边框是聚焦时所有按钮周围的边框。它的风格取决于你的外观和感觉。

答案 1 :(得分:0)

删除comboBox PopUp的黑色边框,

Object child = comboBox.getAccessibleContext().getAccessibleChild(0);
BasicComboPopup popup = (BasicComboPopup)child;
popup.setBorder(BorderFactory.createEmptyBorder());

答案 2 :(得分:0)

如果我理解的话,您的问题通常是如何使用BasicComboBoxRenderer中的扩展类。因此,这里有一个简单的代码向您解释如何使用它:

public class RenderComboBox extends BasicComboBoxRenderer {

    Color selectedBackground;
    Color selectedForground;
    Color background;
    Color forground;

    public RenderComboBox() {
        setOpaque(true);        
        background = new Color(37, 37, 37);
        selectedBackground = new Color(93, 93, 93);
        forground = Color.WHITE;
        selectedForground = forground;
    }

    @Override
    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {

        if (isSelected) {
            setBackground(selectedBackground);
            setForeground(selectedForground);
        } else {
            setBackground(background);
            setForeground(forground);
        }
        setFont(list.getFont());
        if (value == null) {
            setText("");
        } else {
            setText(value.toString());
        }
        return this;
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setLayout(null);
        frame.setPreferredSize(new Dimension(200, 170));

        JComboBox<String> combobox = new JComboBox<>();
        combobox.setRenderer(new RenderComboBox());
        combobox.setBounds(50, 50, 100, 20);
        combobox.addItem("TEST");
        combobox.addItem("REVERT");

        frame.add(combobox);
        frame.pack();
        frame.setVisible(true);

    }

}