java彩色的世界_java – 彩色项目和焦点的彩色jcombobox

这篇博客探讨了如何在Java中创建一个彩色的JComboBox,使其在具有焦点时改变前景和背景颜色。作者提供了不同的实现方法,包括通过自定义ListCellRenderer和利用HTML。同时,还讨论了组件失去焦点后的颜色应用行为。
摘要由CSDN通过智能技术生成

我正在尝试使用彩色项目制作彩色下拉列表(请参阅下面的代码).组合框失去焦点后,颜色会被应用.

这是正确的行为吗?

当组合框具有焦点时,如何才能使前景和/或背景颜色发生变化?

谢谢

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 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();

}

});

}

}

解决方法:

这是另一种方法:

//JList#setSelectionForeground(...) version

static class ColoredCellRenderer implements ListCellRenderer {

protected DefaultListCellRenderer defaultRenderer = new DefaultListCellRenderer();

private final Color selectionBackground = new Color(240,200,200);

public Component getListCellRendererComponent(

JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {

Color fgc = Colors.valueOf((String)value).color;

if(index<0) {

//comboBox.setForeground(fgc); //Windows, CDE/Motif Look & Feel

list.setSelectionForeground(fgc);

list.setSelectionBackground(selectionBackground);

}

JLabel renderer = (JLabel) defaultRenderer.getListCellRendererComponent(

list, value, index, isSelected, cellHasFocus);

if (index != -1) {

renderer.setForeground(fgc);

}

return renderer;

}

}

//html version

static class ComboHtmlRenderer extends DefaultListCellRenderer {

private final Color selectionBackground = new Color(240,200,200);

@Override public Component getListCellRendererComponent(

JList list, Object value, int index, boolean isSelected, boolean hasFocus) {

Color fgc = Colors.valueOf((String)value).color;

if(index<0) {

list.setSelectionBackground(selectionBackground);

}

JLabel l = (JLabel)super.getListCellRendererComponent(

list, value, index, isSelected, hasFocus);

l.setText(""+value);

l.setBackground(isSelected?selectionBackground:list.getBackground());

return l;

}

private static String hex(Color c) {

return String.format("#%06x", c.getRGB()&0xffffff);

}

}

标签:jcombobox,java,focus,colors,swing

来源: https://codeday.me/bug/20191006/1858426.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值