【发布时间】:2012-02-28 14:03:44
【问题描述】:
我正在尝试使用彩色项目制作彩色下拉列表(请参阅下面的代码)。组合框失去焦点后将应用颜色。
这是正确的行为吗?
当组合框获得焦点时,如何更改前景色和/或背景色?
谢谢
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.border.*;
public class DropDown {
enum Colors {
red(Color.red), orange(Color.orange), green(Color.green), yellow(Color.yellow), blue(Color.blue);
Colors(Color color) {
this.color = color;
}
static String[] listModel() {
java.util.List<Colors> values = Arrays.asList(values());
String s = values.toString().replaceAll(" ", "");
return s.substring(1, s.length() - 1).split(",");
}
final Color color;
}
static class ColoredCellRenderer implements ListCellRenderer {
protected DefaultListCellRenderer defaultRenderer = new DefaultListCellRenderer();
private final static Dimension preferredSize = new Dimension(0, 20);
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected,
boolean cellHasFocus) {
JLabel renderer = (JLabel) defaultRenderer.getListCellRendererComponent(list, value, index, isSelected,
cellHasFocus);
if (index != -1) if (value instanceof String) renderer.setForeground(Colors.valueOf((String) value).color);
else
System.out.println("not a string");
else
System.out.println("in getListCellRendererComponent, index=-1");
renderer.setPreferredSize(preferredSize);
return renderer;
}
}
private static JComboBox addLabeledComboBox(Container c, String label, String[] model) {
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
Border border = BorderFactory.createLineBorder(Color.green, 1);
panel.setBorder(border);
JLabel l = new JLabel(label);
panel.add(l);
final JComboBox comboBox = new JComboBox(model);
comboBox.setName(label);
l.setLabelFor(comboBox);
comboBox.setRenderer(new ColoredCellRenderer());
panel.add(comboBox);
c.add(panel);
return comboBox;
}
private static void addContent(Container c) {
c.setLayout(new BoxLayout(c, BoxLayout.Y_AXIS));
ActionListener actionListener = new ActionListener() {
@Override public void actionPerformed(ActionEvent e) {
if (e.getSource() instanceof JComboBox) {
final JComboBox comboBox = (JComboBox) e.getSource();
Object selected = comboBox.getSelectedItem();
String string = (String) selected;
Color color = Colors.valueOf(string).color;
int i = comboBox.getSelectedIndex();
if (i != -1) {
System.out.println("comboBox " + comboBox.getName() + " " + color);
comboBox.setForeground(color);
System.out.println(comboBox.hasFocus());
// comboBox.repaint();
} else
System.out.println("in actionListener selected=" + selected);
} else
System.out.println("in actionListener selected is not a comboBox");
}
};
c.add(new JButton("button"));
for (int i = 0; i < 2; i++) {
JPanel panel = new JPanel();
Border border = BorderFactory.createLineBorder(Color.red, 1);
panel.setBorder(border);
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.add(new JLabel("label " +(i+1)));
JComboBox comboBox = addLabeledComboBox(panel, "" + (i + 1), Colors.listModel());
comboBox.addActionListener(actionListener);
comboBox.setSelectedIndex(0); // select something
c.add(panel);
}
}
private static void createAndShowGUI() {
JFrame frame = new JFrame("Colored JComboBox");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
addContent(frame.getContentPane());
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@SuppressWarnings("synthetic-access") public void run() {
createAndShowGUI();
}
});
}
}
【问题讨论】:
-
你在调试器中单步执行了吗?您的哪一个
if语句失败了? -
没有失败,我想改变框的外观,当它有焦点时,我不知道该怎么做。
标签: java swing colors focus jcombobox