2014-12-28 33 views
3

我花了最后几个小时寻找一个解决方案或至少一个有关这个问题的体面指南,但什么都没发现。扩展摆动JComboBox以移除不需要的边界

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

使用this list我设法让我jComboBoxes真的接近我希望他们看起来像:

modified JComboBox

我有两个问题与此,一个主要的和次要的一个:

  • 主要

    enter image description here

    我想让蓝色显示的边框消失。

  • enter image description here

    我真的很喜欢黑色边框显示了。

显然在UIDefaults没有key有什么用以下两种边界:他们似乎在查找莫名其妙硬编码和觉得我修改(这应该是金属)。我使出手动延长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,像这样:

aComboBox.setRenderer(new ComboBoxRenderer()); 

获得外观为非同一扩展的JComboBox。

问题是,用这个扩展名我找不到接触这些边界的方法。添加setBorder(new EmptyBorder(0, 0, 0, 0));不会完成任何操作,因为它只是为所列项目添加边框。

我检查的源代码javax.swing.plaf.basic.BasicComboBoxRenderer,看看是否有被应用于任何国界,但一无所获(唯一的边界存在一个适用于列出的项目,我可以重写,如上图所示。

那我该怎么办?难道我延长了错误的类,还是我失去了什么东西?

这是我的第一个问题,我是如此裸露的只要够不完整或不清晰。

+1

实现自己的外观委托。 [修改外观](http://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/) – MadProgrammer

+0

@MadProgrammer我似乎无法找到任何关于在该链接中实际修改LaF的内容,它似乎居中将现有的应用程序应用于GUI。 – Gliptal

+0

查看jdk中的src.jar,并查看Java附带的实现 – MadProgrammer

回答

0

解决方案我发现是:

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

这会在ComboBoxUI中设置一个布尔值,用于防止焦点边框呈现,即焦点边框绘制在所有按钮周围的边框。它的风格取决于你的外观和感觉。

+0

不幸的是,我不适合工作。 – Gliptal

0

要删除的组合框弹出的黑色边框,

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