我想为JCombobox中的行/条目设置字体颜色,每行都是唯一的。所以基本上当你点击下拉箭头时,你应该会看到几行不同的颜色,我想根据它们的属性自己指定颜色。我应该怎么做呢?谢谢!
答案 0 :(得分:2)
您需要创建一个自定义ListCellRenderer:
class Renderer extends JLabel implements ListCellRenderer {
并实现此方法:
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
// Get the selected index. (The index param isn't
// always valid, so just use the value.)
if (isSelected) {
setBackground(list.getSelectionBackground());
setForeground(list.getSelectionForeground());
} else {
setBackground(list.getBackground());
setForeground(list.getForeground());
}
// Display the text
String text = (String) value;
setText(text);
// Get the source
然后,根据您的来源,使用this.setForeground(颜色)设置文本的颜色。最后,
return this;
}
答案 1 :(得分:1)
您可能需要为JComboBox提供自定义渲染器,请查看Sun的教程:
http://java.sun.com/docs/books/tutorial/uiswing/components/combobox.html#renderer
(很抱歉没有链接,因为我是新会员而无法发布链接)
答案 2 :(得分:1)
您可以使用ListCellRenderer
。你需要为此编写自定义类。以下是基于索引设置前景的完整代码(以避免重复)。您还可以为此设置自定义选择背景和背景。请参阅代码中的注释。
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
class ListCellRendererDemo2 extends JFrame
{
Hashtable<Integer,Color> table;
JComboBox<String> c;
public ListCellRendererDemo2()
{
createAndShowGUI();
}
private void createAndShowGUI()
{
setTitle("JComboBox Demo");
setLayout(new FlowLayout());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
table=new Hashtable<Integer,Color>();
table.put(1,Color.RED);
table.put(2,Color.BLUE);
table.put(3,Color.GREEN);
table.put(4,Color.GRAY);
c=new JComboBox<String>();
c.addItem("Item 1");
c.addItem("Item 2");
c.addItem("Item 3");
c.addItem("Item 4");
c.addItem("Item 5");
c.addItem("Item 6");
c.addItem("Item 7");
c.addItem("Item 8");
c.setRenderer(new MyListCellRenderer(table));
add(c);
setSize(400,400);
setVisible(true);
}
public static void main(String args[])
{
SwingUtilities.invokeLater(new Runnable(){
public void run()
{
new ListCellRendererDemo2();
}
});
}
}
class MyListCellRenderer extends DefaultListCellRenderer
{
Hashtable<Integer,Color> table;
public MyListCellRenderer(Hashtable<Integer,Color> table)
{
this.table=table;
// Set opaque for the background to be visible
setOpaque(true);
}
public Component getListCellRendererComponent(JList jc,Object val,int idx,boolean isSelected,boolean cellHasFocus)
{
// Set text (mandatory)
setText(val.toString());
// Set the foreground according to the selected index
setForeground(table.get(idx));
// Set your custom selection background, background
// Or you can get them as parameters as you got the table
if(isSelected) setBackground(Color.LIGHT_GRAY);
else setBackground(Color.WHITE);
return this;
}
}