java JComboBox 中每个项目的多种颜色
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/10951449/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Multiple Colors for Each Item in JComboBox
提问by Marek Ceglowski
I'm trying to make a ComboBox that uses different colors for different items. I wrote out some test code but it doesn't seem to work. Adding in the renderer causes the program to crash but commenting it out makes the box display on in the frame.
我正在尝试制作一个对不同项目使用不同颜色的 ComboBox。我写了一些测试代码,但它似乎不起作用。添加渲染器会导致程序崩溃,但将其注释掉会使框显示在框架中。
Is there anything I'm missing or am I doing this the wrong way? I tried using the custom ComboBox Renderertutorial as an example.
有什么我遗漏的还是我做错了?我尝试使用自定义 ComboBox Renderer教程作为示例。
Here is my code:
这是我的代码:
TestComboColor.java
测试组合颜色.java
import java.awt.Color;
import javax.swing.JComboBox;
import javax.swing.JFrame;
public class TestComboColor {
static Color[] colors = {Color.BLUE, Color.GRAY, Color.RED};
static String[] strings = {"Test1", "Test2", "Test3"};
public static void main(String[] args)
{
JFrame frame = new JFrame("JAVA");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JComboBox cmb = new JComboBox();
ComboBoxRenderer renderer = new ComboBoxRenderer(cmb);
renderer.setColors(colors);
renderer.setStrings(strings);
cmb.setRenderer(renderer);
frame.add(cmb);
frame.pack();
frame.setVisible(true);
}
}
ComboBoxRenderer.java
ComboBoxRenderer.java
import java.awt.Color;
import java.awt.Component;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.ListCellRenderer;
public final class ComboBoxRenderer extends JPanel implements ListCellRenderer
{
private static final long serialVersionUID = -1L;
private Color[] colors;
private String[] strings;
JPanel textPanel;
JLabel text;
public ComboBoxRenderer(JComboBox combo) {
textPanel = new JPanel();
textPanel.add(this);
text = new JLabel();
text.setOpaque(true);
text.setFont(combo.getFont());
textPanel.add(text);
}
public void setColors(Color[] col)
{
colors = col;
}
public void setStrings(String[] str)
{
strings = str;
}
public Color[] getColors()
{
return colors;
}
public String[] getStrings()
{
return strings;
}
@Override
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
if (isSelected)
{
setBackground(list.getSelectionBackground());
}
else
{
}
if (colors.length != strings.length)
{
System.out.println("colors.length does not equal strings.length");
return this;
}
else if (colors == null)
{
System.out.println("use setColors first.");
return this;
}
else if (strings == null)
{
System.out.println("use setStrings first.");
return this;
}
text.setText(strings[index]);
text.setForeground(colors[index]);
text.setBackground(getBackground());
return text;
}
}
Thanks!
谢谢!
回答by Andrew Thompson
Is this what you mean?
你是这个意思吗?
import java.awt.Color;
import java.awt.Component;
import javax.swing.*;
public class TestComboColor {
static Color[] colors = {Color.BLUE, Color.GRAY, Color.RED};
static String[] strings = {"Test1", "Test2", "Test3"};
public static void main(String[] args)
{
JFrame frame = new JFrame("JAVA");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JComboBox cmb = new JComboBox(strings);
ComboBoxRenderer renderer = new ComboBoxRenderer(cmb);
renderer.setColors(colors);
renderer.setStrings(strings);
cmb.setRenderer(renderer);
frame.add(cmb);
frame.pack();
frame.setVisible(true);
}
}
class ComboBoxRenderer extends JPanel implements ListCellRenderer
{
private static final long serialVersionUID = -1L;
private Color[] colors;
private String[] strings;
JPanel textPanel;
JLabel text;
public ComboBoxRenderer(JComboBox combo) {
textPanel = new JPanel();
textPanel.add(this);
text = new JLabel();
text.setOpaque(true);
text.setFont(combo.getFont());
textPanel.add(text);
}
public void setColors(Color[] col)
{
colors = col;
}
public void setStrings(String[] str)
{
strings = str;
}
public Color[] getColors()
{
return colors;
}
public String[] getStrings()
{
return strings;
}
@Override
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
if (isSelected)
{
setBackground(list.getSelectionBackground());
}
else
{
setBackground(Color.WHITE);
}
if (colors.length != strings.length)
{
System.out.println("colors.length does not equal strings.length");
return this;
}
else if (colors == null)
{
System.out.println("use setColors first.");
return this;
}
else if (strings == null)
{
System.out.println("use setStrings first.");
return this;
}
text.setBackground(getBackground());
text.setText(value.toString());
if (index>-1) {
text.setForeground(colors[index]);
}
return text;
}
}