【问题标题】:How to hide elements with in a JComboBox?如何在 JComboBox 中隐藏元素?
【发布时间】:2015-07-05 20:43:10
【问题描述】:

假设我有一个 JComboBox,其中包含向量中的元素...

 public class Shade(){
       //code for creating panels etc and other components/containers
       JCheckBox primary = new JCheckBox("Primary", false);           
       Vector<String> colours = new Vector<String>();
}
public Shade(){
//setTitle, look&feel, defaultCloseOperation, Layouts etc etc...

 colours.add(0, "Purple);
 colours.add(1, "Red");
 colours.add(2, "Blue");
 colours.add(3, "Magenta");

JComboBox<String> colourSelector = new JComboBox<String>(colours);

}

如果选择了主 JCheckBox,我想从 JComboBox 中“隐藏”紫色和磁色,一旦取消选择主 JCheckBox,我想显示隐藏的元素,以便原始列表相关。

我试过这样做......

   public class eventHandler implements itemListener(){

   Shade refObj;
public eventHandler(Shade rinseFM){
refObj = rinseFM;
}

#Overriding abstract implemented method...
public void itemStateChanged(ItemEvent event){

if(refObj.primary.isSelected() == true){
refObj.colours.hide(// index of colours required to hide))
}
}
}

hide 方法实际上并不存在,有没有类似的东西。

【问题讨论】:

  • 不确定JComboBox 是否存在这样的功能。您可能必须手动从模型中删除项目,然后在需要时添加它们。或者创建您自己的允许它的实现。据我所知,这是不支持的
  • 如果我删除它们,当我取消选择该框时,它们将不会重新出现。这是一个问题,因为我不得不说 if(refObj.primary.isSelected() == false) //add what was removed 这将是一种乏味的方式来做我想做的事。您还可以详细说明创建我自己的实现吗?

标签: java vector jcombobox jcheckbox itemlistener


【解决方案1】:

试试这个:

private JFrame frame = new JFrame("JComboExample");
private JCheckBox primary = new JCheckBox("Primary");
private JComboBox<String> colorSelector;

private String[] colorsToHide = { "Purple", "Magenta" };

public JComboExample() {
    SwingUtilities.invokeLater(() -> {
        setupFrame();
        setupCheckbox();
        initJComboBox("Purple", "Red", "Blue", "Magenta");
        frame.add(primary, BorderLayout.NORTH);
        frame.add(colorSelector, BorderLayout.CENTER);
    });
}

private void setupFrame() {
    frame.setSize(300, 100);
    frame.setLocationByPlatform(true);
    frame.setDefaultCloseOperation(3);
    frame.setLayout(new BorderLayout());
}

private void setupCheckbox() {
    primary.addActionListener(event -> {
        if(primary.isSelected()) {
            for(String color: colorsToHide) {
                colorSelector.removeItem(color);
            }

        } else {
            for(String color: colorsToHide) {
                colorSelector.addItem(color);
            }
        }
    });
}

private void initJComboBox(String... colors) {
    colorSelector = new JComboBox<String>(colors);
}

public void setVisbility(boolean visibility) {
    frame.setVisible(visibility);
}

public static void main(String[] args) {
    JComboExample example = new JComboExample();
    example.setVisbility(true);
}

当复选框被点击时,该类实现一个回调(添加一个 ActionListener)。在回调中,当复选框被激活时,我们只需删除数组colorsToHide 中的颜色。如果复选框未激活,我们将它们添加回来。

旁注:

在 Java 中,您不应该为此目的使用向量。向量在很大程度上被认为是过时的。看到这个帖子:Why is Java Vector class considered obsolete or deprecated?

您还应该在 EDT 上创建所有 GUI/处理所有 GUI 状态更改。 Swing 不是线程安全的,尽管在大多数情况下它可能看起来不需要,但在处理 GUI 之前调用 SwingUtilities.invokeLaterSwingUtilities.invokeAndWait 是一种很好的做法。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-08
  • 2010-09-30
  • 2016-06-19
  • 1970-01-01
  • 1970-01-01
  • 2020-11-29
  • 2021-12-22
相关资源
最近更新 更多