自定义JCombobox默认选择背景色不可见
我创建了扩展 JCombobox 的自定义组合框。它在弹出列表中有复选框。当我尝试选择/检查弹出窗口内的复选框时,没有选择颜色。
我尝试将背景设置为自定义渲染器内的复选框,但它不起作用。这是我的代码,如果有任何想法请帮助。提前致谢。
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import javax.swing.*;
public class MyCombo extends JComboBox implements ActionListener
{
/**
* Serial version uid
*/
private static final long serialVersionUID = 1L;
/**
* Renderer for CheckBoxListComboBox
*/
protected CheckComboRenderer renderer;
/**
* Editor for CheckBoxListComboBox
*/
protected ComboEditor editor;
/**
* String Buffer that holds currently selected values
*/
protected StringBuffer selectedValues;
/**
* Creates a <code>CheckBoxListComboBox</code> that contains the elements
* in the specified arrayList. By default no item becomes selected.
* @param arrayList ArrayList holds data to display
*/
public MyCombo()
{
renderer = new CheckComboRenderer();
editor = new ComboEditor();
selectedValues = new StringBuffer();
setEditable(true);
setModel(makeModel());
addActionListener(this);
setRenderer(renderer);
setEditor(editor);
}
/* (non-Javadoc)
* @see javax.swing.JComboBox#setPopupVisible(boolean)
*/
public void setPopupVisible(boolean v)
{
//Dont hide popup on click
//super.setPopupVisible(v);
}
/* (non-Javadoc)
* @see javax.swing.JComboBox#actionPerformed(java.awt.event.ActionEvent)
*/
public void actionPerformed(ActionEvent e)
{
JComboBox cb = (JComboBox)e.getSource();
CheckComboStore store = (CheckComboStore)cb.getSelectedItem();
CheckComboRenderer ccr = (CheckComboRenderer)cb.getRenderer();
ccr.checkBox.setSelected((store.state = !store.state));
JTextField tf = (JTextField) editor.getEditorComponent();
StringBuffer buffer = new StringBuffer("");
DefaultComboBoxModel mdl = (DefaultComboBoxModel) cb.getModel();
for (int i = 0; i < mdl.getSize(); i++)
{
store = (CheckComboStore)mdl.getElementAt(i);
if (store.getState().booleanValue())
{
if (buffer.length() == 0)
buffer.append(store.getId());
else
buffer.append("; " + store.getId());
}
}
tf.setText(buffer.toString());
}
private DefaultComboBoxModel makeModel()
{
DefaultComboBoxModel model = new DefaultComboBoxModel();
model.addElement(new CheckComboStore("Item1", false));
model.addElement(new CheckComboStore("Item2", false));
model.addElement(new CheckComboStore("Item3", false));
model.addElement(new CheckComboStore("Item4", false));
model.addElement(new CheckComboStore("Item5", false));
return model;
}
private JPanel getContent()
{
final JComboBox combo = new JComboBox()
{
public void setPopupVisible(boolean v)
{
//Dont hide popup on click
//super.setPopupVisible(v);
}
};
combo.setPreferredSize(new Dimension(250,25));
combo.setEditable(true);
combo.setModel(makeModel());
combo.addActionListener(this);
combo.setRenderer(renderer);
combo.setEditor(editor);
JPanel panel = new JPanel();
panel.add(combo);
return panel;
}
public static void main(String[] args)
{
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().add(new MyCombo().getContent());
f.setSize(300,160);
f.setLocation(200,200);
f.setVisible(true);
}
class CheckComboRenderer implements ListCellRenderer
{
JCheckBox checkBox;
public CheckComboRenderer()
{
checkBox = new JCheckBox();
}
public Component getListCellRendererComponent(JList list,
Object value,
int index,
boolean isSelected,
boolean cellHasFocus)
{
CheckComboStore store = (CheckComboStore)value;
checkBox.setText(store.getId());
checkBox.setSelected(((Boolean)store.state).booleanValue());
checkBox.setBackground(isSelected ? Color.red : Color.white);
return checkBox;
}
}
class ComboEditor implements ComboBoxEditor
{
JTextField tf;
public ComboEditor()
{
tf = new JTextField("");
}
public void addActionListener( ActionListener l ) {}
public void addKeyListener( KeyListener k){}
public Component getEditorComponent()
{
return tf;
}
public Object getItem()
{
return tf.getText();
}
public void removeActionListener( ActionListener l ) {}
public void selectAll() {}
public void setItem( Object o ) {}
}
class CheckComboStore
{
String id = "";
Boolean state = false;
public String toString()
{
return id;
}
public CheckComboStore(String id, Boolean state)
{
this.id = id;
this.state = state;
}
public String getId()
{
return id;
}
public Boolean getState()
{
return state;
}
}
}
I have created customized combobox which extends JCombobox. It is having checkboxes in popup list. When I try to select/check checkbox inside popup there is not selection color.
I tried to set background to checkbox inside custom renderer but its not working. Here is my code if any ideas please help. Thanks in advance.
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import javax.swing.*;
public class MyCombo extends JComboBox implements ActionListener
{
/**
* Serial version uid
*/
private static final long serialVersionUID = 1L;
/**
* Renderer for CheckBoxListComboBox
*/
protected CheckComboRenderer renderer;
/**
* Editor for CheckBoxListComboBox
*/
protected ComboEditor editor;
/**
* String Buffer that holds currently selected values
*/
protected StringBuffer selectedValues;
/**
* Creates a <code>CheckBoxListComboBox</code> that contains the elements
* in the specified arrayList. By default no item becomes selected.
* @param arrayList ArrayList holds data to display
*/
public MyCombo()
{
renderer = new CheckComboRenderer();
editor = new ComboEditor();
selectedValues = new StringBuffer();
setEditable(true);
setModel(makeModel());
addActionListener(this);
setRenderer(renderer);
setEditor(editor);
}
/* (non-Javadoc)
* @see javax.swing.JComboBox#setPopupVisible(boolean)
*/
public void setPopupVisible(boolean v)
{
//Dont hide popup on click
//super.setPopupVisible(v);
}
/* (non-Javadoc)
* @see javax.swing.JComboBox#actionPerformed(java.awt.event.ActionEvent)
*/
public void actionPerformed(ActionEvent e)
{
JComboBox cb = (JComboBox)e.getSource();
CheckComboStore store = (CheckComboStore)cb.getSelectedItem();
CheckComboRenderer ccr = (CheckComboRenderer)cb.getRenderer();
ccr.checkBox.setSelected((store.state = !store.state));
JTextField tf = (JTextField) editor.getEditorComponent();
StringBuffer buffer = new StringBuffer("");
DefaultComboBoxModel mdl = (DefaultComboBoxModel) cb.getModel();
for (int i = 0; i < mdl.getSize(); i++)
{
store = (CheckComboStore)mdl.getElementAt(i);
if (store.getState().booleanValue())
{
if (buffer.length() == 0)
buffer.append(store.getId());
else
buffer.append("; " + store.getId());
}
}
tf.setText(buffer.toString());
}
private DefaultComboBoxModel makeModel()
{
DefaultComboBoxModel model = new DefaultComboBoxModel();
model.addElement(new CheckComboStore("Item1", false));
model.addElement(new CheckComboStore("Item2", false));
model.addElement(new CheckComboStore("Item3", false));
model.addElement(new CheckComboStore("Item4", false));
model.addElement(new CheckComboStore("Item5", false));
return model;
}
private JPanel getContent()
{
final JComboBox combo = new JComboBox()
{
public void setPopupVisible(boolean v)
{
//Dont hide popup on click
//super.setPopupVisible(v);
}
};
combo.setPreferredSize(new Dimension(250,25));
combo.setEditable(true);
combo.setModel(makeModel());
combo.addActionListener(this);
combo.setRenderer(renderer);
combo.setEditor(editor);
JPanel panel = new JPanel();
panel.add(combo);
return panel;
}
public static void main(String[] args)
{
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().add(new MyCombo().getContent());
f.setSize(300,160);
f.setLocation(200,200);
f.setVisible(true);
}
class CheckComboRenderer implements ListCellRenderer
{
JCheckBox checkBox;
public CheckComboRenderer()
{
checkBox = new JCheckBox();
}
public Component getListCellRendererComponent(JList list,
Object value,
int index,
boolean isSelected,
boolean cellHasFocus)
{
CheckComboStore store = (CheckComboStore)value;
checkBox.setText(store.getId());
checkBox.setSelected(((Boolean)store.state).booleanValue());
checkBox.setBackground(isSelected ? Color.red : Color.white);
return checkBox;
}
}
class ComboEditor implements ComboBoxEditor
{
JTextField tf;
public ComboEditor()
{
tf = new JTextField("");
}
public void addActionListener( ActionListener l ) {}
public void addKeyListener( KeyListener k){}
public Component getEditorComponent()
{
return tf;
}
public Object getItem()
{
return tf.getText();
}
public void removeActionListener( ActionListener l ) {}
public void selectAll() {}
public void setItem( Object o ) {}
}
class CheckComboStore
{
String id = "";
Boolean state = false;
public String toString()
{
return id;
}
public CheckComboStore(String id, Boolean state)
{
this.id = id;
this.state = state;
}
public String getId()
{
return id;
}
public Boolean getState()
{
return state;
}
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
查看DefaultCellRenderer源码
See from DefaultCellRenderer source
在 Renderer 类的 getListCellRendererComponent 方法中使用标志 isSelected 来更改所选项目的颜色。
例如:
注意:- 上面的代码并不完美,您需要根据需要更改它。它只是为了演示 isSelected 标志的使用。
Use flag
isSelected
ingetListCellRendererComponent
method of Renderer class to change color of selected item.Something like:
Note:- The above code is not perfect you need to change it as your need. It is just to demonstrate the use of
isSelected
flag.