gpt4 book ai didi

java - 如何禁用 JComboBox 中的某些项目

转载 作者:行者123 更新时间:2023-11-29 10:01:47 24 4
gpt4 key购买 nike

我有一个 ComboBox,其中有 8 个项目,我想显示所有项目,但在特定条件下,用户应该只能选择其中的前两个项目,所以我已经编程,如果条件为真,并且用户选择任何其他选项,那么它会显示一个消息框,显示 "You cannot choose this" 然后自动选择默认值。到目前为止一切顺利。

但现在的问题是,用户无法通过查看 JComboBox 的选项来确定他可以选择哪些选项,所以我想做的是,如果条件为真,则所有除了前两个之外的选项应该被禁用(或灰色或其他东西),以便用户可以确定您不能选择它,如果他们仍然选择,那么我的消息框应该出现。

我尝试了什么:我尝试查找 this但我无法弄清楚问题中做了什么(它的答案对我没有用)我也尝试了其他选项但没有成功。

注意:我正在使用 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;
}
}

enter image description here

至于选择项目...

您可以使用两个单独的监听器。一种用于启用项目,另一种用于禁用项目。启用项目后,您可以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);
}

反之亦然

protected void disableItemsInComboBox() {
comboBox.removeActionListener(enabledListener);
comboBox.addActionListener(disabledListener);
model.setSelectionInterval(SELECTION_INTERVAL[0], SELECTION_INTERVAL[1]);
}

enter image description here

这是一个完整的运行示例,使用上面的 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();
}
});
}
}

关于java - 如何禁用 JComboBox 中的某些项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23722706/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com