与色的项目和焦点的色的jcombobox [英] Colored jcombobox with colored items and focus

查看:132
本文介绍了与色的项目和焦点的色的jcombobox的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想用彩色项目制作彩色下拉列表(请参阅下面的代码)。在combobox失去焦点后颜色被应用。



这是正确的行为吗?



如何获得前景和/或背景颜色

  import java.awt 。*; 
import java.awt.event。*;
import java.util。*;
import javax.swing。*;
import javax.swing.border。*;
public class DropDown {
enum颜色{
red(Color.red),orange(Color.orange),green(Color.green),yellow(Color.yellow),blue 。蓝色);
颜色(颜色){
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颜色颜色;
}
static class ColoredCellRenderer实现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 = 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()JComboBox的实例){
final JComboBox comboBox = JComboBox)e.getSource();
Object selected = comboBox.getSelectedItem();
String string =(String)selected;
颜色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(在actionListener中选择不是一个comboBox);
}
};
c.add(new JButton(button));
for(int i = 0; i <2; i ++){
JPanel panel = new JPanel();
边框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颜色selectionBackground =新颜色(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&感觉
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(< html>< font color =+ hex(fgc)+>+ value);
l.setBackground(isSelected?selectionBackground:list.getBackground());
return l;
}
private static String hex(Color c){
return String.format(#%06x,c.getRGB()& 0xffffff);
}
}


i am trying to make a colored dropdown list with colored items (please see code below). The color is getting applied after the combobox loses focus.

is this correct behaviour?

how can i get the foreground and/or the background color to change when the combobox has the focus?

thanks

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

解决方案

Here is another approach:

//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("<html><font color="+hex(fgc)+">"+value);
    l.setBackground(isSelected?selectionBackground:list.getBackground());
    return l;
  }
  private static String hex(Color c) {
    return String.format("#%06x", c.getRGB()&0xffffff);
  }
}

这篇关于与色的项目和焦点的色的jcombobox的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆