Dak*_*hah 1 java swing netbeans jcombobox
我有一个ComboBox我有8个项目,其中我想要显示所有但在某个条件下,用户应该只能选择前两个,所以我已经编程,如果条件为真,用户选择任何其他选项,然后显示消息框显示"You cannot choose this",然后自动选择默认值.到现在为止还挺好.
但现在的问题是用户无法通过查看JComboBox可以选择的选项来确定,所以我想要做的是,如果条件为真,那么除了前两个选项之外的所有选项都应该被禁用(或者灰色或其他东西),以便用户可以知道你无法选择它,如果他们仍然这样做,那么我的消息框应该出现.
我尝试了什么:我试着查看这个,但我无法弄清楚问题中做了什么(它的答案对我没有用),我也尝试了其他选择,但没有成功.
注意:我正在使用Netbeans GUI来创建所有内容,我正在编写的代码已经开启JComboBoxActionPerformed,我是一个新手,所以我无法弄清楚自己,为此道歉
这将需要一些手动编码.GUI Builder不会帮助你.
您可以实现自己的BasicComboBoxRenderer,在其中传递给它ListSelectionModel.根据您传递给它的模型,只有选定的间隔将使用标准渲染器进行渲染.通过更改前景色及其选择背景,剩余索引将以禁用方式呈现.
注意:这只会影响项目的呈现,而不会影响实际的选择事件
import java.awt.Color;
import java.awt.Component;
import javax.swing.JList;
import javax.swing.ListSelectionModel;
import javax.swing.UIManager;
import javax.swing.plaf.basic.BasicComboBoxRenderer;
public class EnabledComboBoxRenderer extends BasicComboBoxRenderer {
private ListSelectionModel enabledItems;
private Color disabledColor = Color.lightGray;
public EnabledComboBoxRenderer() {}
public EnabledComboBoxRenderer(ListSelectionModel enabled) {
super();
this.enabledItems = enabled;
}
public void setEnabledItems(ListSelectionModel enabled) {
this.enabledItems = enabled;
}
public void setDisabledColor(Color disabledColor) {
this.disabledColor = disabledColor;
}
@Override
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
Component c = super.getListCellRendererComponent(list, value, index,
isSelected, cellHasFocus);
if (!enabledItems.isSelectedIndex(index)) {// not enabled
if (isSelected) {
c.setBackground(UIManager.getColor("ComboBox.background"));
} else {
c.setBackground(super.getBackground());
}
c.setForeground(disabledColor);
} else {
c.setBackground(super.getBackground());
c.setForeground(super.getForeground());
}
return c;
}
}
Run Code Online (Sandbox Code Playgroud)

您可以使用两个单独的侦听器.一个用于启用项目,一个用于禁用项目.启用项目后,您可以1.更改选择模型2.添加启用的侦听器3.删除已禁用的侦听器
private class EnabledListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(((JComboBox) e.getSource()).getSelectedItem());
}
}
private class DisabledListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
if (((JComboBox) e.getSource()).getSelectedIndex() != SELECTION_INTERVAL[0]
&& ((JComboBox) e.getSource()).getSelectedIndex() != SELECTION_INTERVAL[1]) {
JOptionPane.showMessageDialog(null,
"You can't Select that Item", "ERROR",
JOptionPane.ERROR_MESSAGE);
} else {
System.out.println(((JComboBox) e.getSource())
.getSelectedItem());
}
}
}
protected void enableItemsInComboBox() {
comboBox.removeActionListener(disabledListener);
comboBox.addActionListener(enabledListener);
model.setSelectionInterval(SELECTION_INTERVAL[0], comboBox.getModel()
.getSize() - 1);
}
Run Code Online (Sandbox Code Playgroud)
反之亦然
protected void disableItemsInComboBox() {
comboBox.removeActionListener(enabledListener);
comboBox.addActionListener(disabledListener);
model.setSelectionInterval(SELECTION_INTERVAL[0], SELECTION_INTERVAL[1]);
}
Run Code Online (Sandbox Code Playgroud)

这是一个完整的运行示例,使用EnabledComboBoxRenderer从上面开始
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.DefaultListSelectionModel;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
public class ComboBoxDisabledItemsDemo {
private static final int[] SELECTION_INTERVAL = { 0, 1 };
private JComboBox comboBox;
private JCheckBox disableCheckBox;
private DefaultListSelectionModel model = new DefaultListSelectionModel();
private EnabledComboBoxRenderer enableRenderer = new EnabledComboBoxRenderer();
private EnabledListener enabledListener = new EnabledListener();
private DisabledListener disabledListener = new DisabledListener();
public ComboBoxDisabledItemsDemo() {
comboBox = createComboBox();
disableCheckBox = createCheckBox();
disableCheckBox.setSelected(true); // this adds the action listener to
// the
// to the combo box
JFrame frame = new JFrame("Disabled Combo Box Items");
frame.setLayout(new GridBagLayout());
frame.add(comboBox);
frame.add(disableCheckBox);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 300);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
private JComboBox createComboBox() {
String[] list = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5",
"Item 6", "Item 7" };
JComboBox cbox = new JComboBox(list);
model.addSelectionInterval(SELECTION_INTERVAL[0], SELECTION_INTERVAL[1]);
enableRenderer.setEnabledItems(model);
cbox.setRenderer(enableRenderer);
return cbox;
}
private class EnabledListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(((JComboBox) e.getSource()).getSelectedItem());
}
}
private class DisabledListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
if (((JComboBox) e.getSource()).getSelectedIndex() != SELECTION_INTERVAL[0]
&& ((JComboBox) e.getSource()).getSelectedIndex() != SELECTION_INTERVAL[1]) {
JOptionPane.showMessageDialog(null,
"You can't Select that Item", "ERROR",
JOptionPane.ERROR_MESSAGE);
} else {
System.out.println(((JComboBox) e.getSource())
.getSelectedItem());
}
}
}
protected void disableItemsInComboBox() {
comboBox.removeActionListener(enabledListener);
comboBox.addActionListener(disabledListener);
model.setSelectionInterval(SELECTION_INTERVAL[0], SELECTION_INTERVAL[1]);
}
protected void enableItemsInComboBox() {
comboBox.removeActionListener(disabledListener);
comboBox.addActionListener(enabledListener);
model.setSelectionInterval(SELECTION_INTERVAL[0], comboBox.getModel()
.getSize() - 1);
}
private JCheckBox createCheckBox() {
JCheckBox checkBox = new JCheckBox("diabled");
checkBox.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
disableItemsInComboBox();
} else if (e.getStateChange() == ItemEvent.DESELECTED) {
enableItemsInComboBox();
}
}
});
return checkBox;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new ComboBoxDisabledItemsDemo();
}
});
}
}
Run Code Online (Sandbox Code Playgroud)