dbCnc
asked on
Need to display a JSeparator in a JComboBox
I use the following comboBox to display a set of strings to the operator, that will
grey out the third selection (see "Text Line 3", false)...
My problem is that the separator does not display correctly - it seems to produce the ToString()
results in the line of text. What can I do to display the horizontal separator in the comboBox list?
Thanks
grey out the third selection (see "Text Line 3", false)...
My problem is that the separator does not display correctly - it seems to produce the ToString()
results in the line of text. What can I do to display the horizontal separator in the comboBox list?
Thanks
Object[] items = { new ComboItem<String>(new String("Text Line 1"), true),
new ComboItem<String>(new String("Text Line 2"), true),
new ComboItem<JSeparator>(new JSeparator(), true),
new ComboItem<String>(new String("Text Line 3"), false),
selectionComboBox = new JComboBox(items);
selectionComboBox.setRenderer(new ComboRenderer());
selectionComboBox.addActionListener(new ComboListener(selectionComboBox));
selectionComboBox.setBounds(140, 101, 254, 25);
selectionComboBox.setMaximumRowCount(14);
getContentPane().add(selectionComboBox);
// CellRenderer
class ComboRenderer extends JLabel implements ListCellRenderer {
private static final long serialVersionUID = 1L;
public ComboRenderer() {
setOpaque(true);
setBorder(new EmptyBorder(1, 1, 1, 1));
}
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected,
boolean cellHasFocus) {
if (isSelected) {
setBackground(list.getSelectionBackground());
setForeground(list.getSelectionForeground());
} else {
setBackground(list.getBackground());
setForeground(list.getForeground());
}
if (!((CanEnable) value).isEnabled()) {
setBackground(list.getBackground());
setForeground(UIManager.getColor("Label.disabledForeground"));
}
setFont(list.getFont());
setText((value == null) ? "" : value.toString());
return this;
}
}
/**
* Handles the combo box selection
*
*/
class ComboListener implements ActionListener {
JComboBox combo;
Object currentItem;
ComboListener(JComboBox combo) {
this.combo = combo;
combo.setSelectedIndex(0);
currentItem = combo.getSelectedItem();
}
public void actionPerformed(ActionEvent e) {
Object tempItem = combo.getSelectedItem();
if (!((CanEnable) tempItem).isEnabled()) {
combo.setSelectedItem(currentItem);
} else {
currentItem = tempItem;
}
}
}
/**
* The item displayed by the combo box
*
* @param <T>
*/
class ComboItem<T> implements CanEnable {
T obj;
boolean isEnable;
ComboItem(T obj, boolean isEnable) {
this.obj = obj;
this.isEnable = isEnable;
}
ComboItem(T obj) {
this(obj, true);
}
public boolean isEnabled() {
return isEnable;
}
public void setEnabled(boolean isEnable) {
this.isEnable = isEnable;
}
public String toString() {
return obj.toString();
}
public T getValue() {
return obj;
}
}
ASKER
xxynk,
Thanks for the reply - but it's still not obvious to me how to display the separator as a line.
==>Sure. That's what you told it to do:
==>setText((value == null) ? "" : value.toString());
Perhaps I can test the obj T in ComboItem, and do something different from what is returned in line 93,
but I want a solid line to appear - of the correct length for the displayed ComboBox.
Could you elaborate?
Thanks again...
Thanks for the reply - but it's still not obvious to me how to display the separator as a line.
==>Sure. That's what you told it to do:
==>setText((value == null) ? "" : value.toString());
Perhaps I can test the obj T in ComboItem, and do something different from what is returned in line 93,
but I want a solid line to appear - of the correct length for the displayed ComboBox.
Could you elaborate?
Thanks again...
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
ZZYNX,
The first solution was exactly what I was looking for. I had gone through quite a few examples from that site - but never found that one.
I added my enable/disable code to the listeners, and I'm all set...
Thanks Again
The first solution was exactly what I was looking for. I had gone through quite a few examples from that site - but never found that one.
I added my enable/disable code to the listeners, and I'm all set...
Thanks Again
Thanx 4 axxepting
Sure. That's what you told it to do:
setText((value == null) ? "" : value.toString());