当前位置: 首页 > 知识库问答 >
问题:

如何禁用组合框中的项目?

翟昊明
2023-03-14

如何禁用swing组合框中的项目?我将这些项添加为代码,因为在我的项目中,我们无法从设计中手动添加它们。我想禁用项目,例如如果从swing Month组合框中选择了April,则项目31也应禁用,并显示警告消息,因为四月有30天,而不是31天。

public void months()

{

   cmbDay.addItem("1");
   cmbDay.addItem("2");
   cmbDay.addItem("3");
   cmbDay.addItem("4");
   cmbDay.addItem("5");
   cmbDay.addItem("6");
   cmbDay.addItem("7");
   cmbDay.addItem("8");
   cmbDay.addItem("9");
   cmbDay.addItem("10");
   cmbDay.addItem("11");
   cmbDay.addItem("12");
   cmbDay.addItem("13");
   cmbDay.addItem("14");
   cmbDay.addItem("15");
   cmbDay.addItem("16");
   cmbDay.addItem("17");
   cmbDay.addItem("18");
   cmbDay.addItem("19");
   cmbDay.addItem("20");
   cmbDay.addItem("21");
   cmbDay.addItem("22");
   cmbDay.addItem("23");
   cmbDay.addItem("24");
   cmbDay.addItem("25");
   cmbDay.addItem("26");
   cmbDay.addItem("27");
   cmbDay.addItem("28");
   cmbDay.addItem("29");
   cmbDay.addItem("30");
   cmbDay.addItem("31");




   String getMonths = String.valueOf(cmbMonth.getSelectedItem());

  if (cmbMonth.getSelectedItem().equals("April"))
   {



   }

   else if (cmbMonth.getSelectedItem().equals("June"))
   {



   }
   else if (cmbMonth.getSelectedItem().equals("September"))
   {



   }
   else if (cmbMonth.getSelectedItem().equals("November"))
   {



   }
  }

共有1个答案

微生恩
2023-03-14

要回答您提出的问题,禁用JComboBox下拉列表中的特定项目有几个不同的方面:

  1. 当用户选择禁用的项目时不执行任何操作
  2. 使项目显示为禁用状态(例如,灰色文本而不是黑色文本)
  3. 使项目的行为被禁用(以便单击它不会关闭下拉列表)

方面#1并不是真正的Swing问题,但会在您的事件处理代码中完成,即使实现了#3,IMHO也应该完成(尽管#3似乎使#1变得不必要)。

方面#2可以通过为JComboBox使用定制的ListCellRendererfor来实现。这并不像听起来那么难,只是网上有很多代码示例没有正确完成。如果您是新手,很难知道哪些代码示例值得信任。(同一个自定义ListCellRenderer还可以使禁用的项目在用户将光标放在它上面时看起来没有装饰。)

方面#3很棘手。我并不是说这是不可能的,但是(除非有一些我不知道的相关API),我不会打扰,因为它需要太多的工作,即使这样也可能太笨拙了。[编辑:覆盖ComboBoxModel.setSelectedItem()以在禁用其参数时不执行任何操作,可以完成大部分您需要的操作。这并不太笨拙,但仅凭这一点,单击禁用的项目仍会关闭弹出窗口。

但是要回答一个你没有问的问题,这真的是最好的设计吗?您真的希望用户看到包含一些禁用项目的下拉选项列表,而不是只包含有效项目的下拉列表吗?JComboBox提供了一种机制,可用于在下拉列表弹出之前调整下拉列表中的项目,该机制是addPopupMenuListener()。您可以编写自己的PopupMenuListener,并在其popupMenuWillBecomeVisible()方法中添加或移除项目。

最后,考虑一下人们可能会如何使用您的GUI。假设组合框当前为2月1日,并且用户希望将其更改为1月31日。您想强制用户先更改月份,然后更改日期吗?或者用户可能会尝试先更改日期(这会让他/她感到沮丧,因为31要么被禁用,要么不存在),然后更改月份?一个合理的设计可能是允许用户将GUI设置为2月31日,但仅限于过渡,并且如果日期不正确,则不允许GUI进行下一步。

 类似资料:
  • 问题内容: 我有一个带有组合框的UI。每次组合将要打开列表时,必须刷新可以选择的项目列表。 有什么办法-即添加一个侦听器,该侦听器将通知UI Combo即将打开? 不幸的是,当列表更改时,我无法观察模型来更新列表。 问题答案: 不幸的是,SWT组件没有这种方法。在Swing中,借助于PopupMenuListener接口将很容易。 我可以想到的一种解决方法是实现MouseListener和Keyb

  • 我有两个组合框。我正在填充这样的两个组合框。组合框1和2的名称是cmbpartyName和cmbprefPT2。 在这里,我从combox1中选择一个值,在它所选的索引更改事件中,如下所示。 由于两个组合框具有相同的值,如何从第二个组合框cmbPrefPT2中删除第一个组合框的选定值?

  • 问题内容: 我需要一些帮助,将一些项目添加到中。因此,我有两个组合框,其中一个根据所选项目填充另一个。 我的问题是,用于新项目,它可以工作,但是如果我为组合框选择另一个选项,它将添加新项目,但先前的项目不见了-新项目下面有空白项目。 我以为每次我从第一个组合框选择一个新选项来清除第二个组合框的内容。所以我在第二个上使用了-但没有用。 我就是这样想的: 上面是第一次更改时执行的功能的一部分。 问题答

  • 说到编程或java,我只是一个完全的初学者。所以一开始,我的计划是使用JavaFX(结合场景构建器)创建一个窗口,在那里我有一个按钮,可以引导我进入另一个窗口,在那里我有一个组合框。我谷歌了几个小时,想找到一种方法来填充组合框,但我找到的所有解决方案都不适合我。这就是为什么我认为我在这里犯了一些错误,我希望你能以某种方式帮助我。或者在列表中给我一个提示,我应该学习/阅读什么才能自己找到解决方案。首

  • 我在工作表上使用“生成”按钮。当我单击按钮时,会出现一个弹出窗口(表单),其中包含两个组合框。根据第一个组合框中的选择,填充第二个组合框选项列表。 对于第一个组合框,当我对项目值进行硬编码时,它工作正常。表单代码如下: 我尝试使用以下表单代码从Excel工作表中的列中获取组合框项目值,从而使此项目列表动态化: 但是上面的代码抛出错误:运行时错误“1004”:对象“_Global”的方法“范围”失败

  • 我正在用文本对象填充一个组合框。通过使用文本对象而不是字符串,我可以添加一个id值,我可以在程序中使用它,然后在我决定国际化UI时利用它。不管怎样,以下是我正在做的:主课: } 控制器: 测验fxml: 现在,这个很好用。但问题是,当我选择一个项目时,该项目上的文本会变成空白,如下所示: 如果我选择另一个,它也会消失: 我仍然可以选择这些项目,但它们只是不在那里。这是一个错误吗?如果是的话,有办法