当一个项目在java中动态添加到JComboBox中时,如何避免触发JComboBox的actionlistener事件?
我需要您对后续任务的建议和指导。
我有一个框架,其中有两个 JComboBox,假定它们被命名为combo1 和combo2、一个 JTable 和其他组件。
在初始阶段,当框架对上述组件可见时。 combo1 组合框填充了一些值,但在初始阶段未选择任何值,combo2 组合框被禁用,表为空。
我在combo1 和combo2 上添加了一个actionListener。 combo1 中有两种类型的值,假设这些值是 type1 和 type2。
条件一: 当我们从 Combo1 中选择值类型 1 时,将调用组合 1 的 actionListener 方法,该方法调用组合 2 保持禁用状态的方法,并将一些行添加到与从组合 1 中选择的值类型 1 相关的表中。
条件2: 当我们从combo1中选择值type2时,combo1的actionListener方法被调用,该方法调用一个方法,该方法使combo2填充一些与type2相关的值并被启用,但没有从combo2中选择任何值,表也应该保持为空,直到我们从其中选择任何值组合2。
每次向combo2添加值时,combo2的动作侦听器方法都会被触发。在combo2的actionListener方法中,它获取combo2的选定值,但这里没有combo2的选定值,这会导致NullPointerException。
那么我应该怎么做才能在向combo2添加值后不会执行combo2的动作列表方法。
I need your suggestions and guidence on following task.
I have a frame which has two JComboBoxes supposed they are named combo1 and combo2, a JTable and other components.
At initial stage when frame is visible with above component. The combo1 combobox is filled with some values but no value is selected at initial stage, the combo2 combobox is disabled and the table is empty.
I have added an actionListener on combo1 as well as combo2. There are two types of values in combo1 suppose those values are type1 and type2.
Condition 1:
When we selects value type1 from Combo1 the actionListener method is called of combo1 which invokes a method which combo2 remains disabled and adds some rows to table related to selected value type1 from combo1.
Condition 2:
when we selects value type2 from combo1 the actionListener method is called of combo1 which invokes a method who makes combo2 filled with some values related to type2 and gets enabled but no value is selected from combo2 and table also should remain empty until we selects any value from combo2.
table at every addition of value to combo2 the action listener method of combo2 is gets fired. In actionListener method of combo2 which gets combo2 selected value but here there is no selected value of combo2 which leads to a NullPointerException.
So what should I do that the action listner method of combo2 will not be get executed after addition of an values to combo2.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
您可以在添加新元素之前删除操作侦听器,并在完成后将其添加回来。 Swing 是单线程的,因此无需担心其他线程需要触发侦听器。
您的听众可能还可以检查是否选择了某些内容,如果没有,则采取适当的操作。比获得 NPE 更好。
You could remove the action listener before you add the new elements, and add it back once you're done . Swing is single threaded so there is no need to worry about other threads needing to fire the listener.
Your listener could probably also check if something is selected and take appropriate action if not. Better than getting a NPE.
我所做的不是添加和删除操作侦听器,而是在操作侦听器中有一个布尔变量,如果必须允许操作通过,则为 true;如果必须阻止操作,则为 false。
然后,当我进行一些会触发操作侦听器的更改时,我将其设置为 false
What i do instead of adding and removing action listeners i have a boolean variable in my action listeners that is true if it has to allow the action through or false if it has to block it.
I then set it to false when i do some changes that will fire off the action listener
试试这个:
try this:
虽然已经晚了,但更好的选择是在修改之前禁用要修改的组合框。通过这样做,您可以防止触发修改后的组合框的事件,例如,当您使用 removeAllItems() 或 addItem() 等方法时
although its late, a better alternative would be to disabled the combobox to be modified prior to being modified. by doing so, you prevent firing events of the modified combobox, when for example, you use methods likes removeAllItems() or addItem()
更简洁的方法是使用像这样的 lambda 表达式:
为了使上述工作正常,您需要在某处定义以下方法:
The cleaner way is to use lambda expressions like this:
For the above to work, you need the following method defined somewhere:
这有效:
注意:您不能只覆盖
setSelectedItem(...)
或setSelectedIndex(...)
因为当实际选择项目时,这些也会在内部使用当您不想禁止触发侦听器时,用户可以进行键盘或鼠标操作。This works:
Note: You can't just override
setSelectedItem(...)
orsetSelectedIndex(...)
because these are also used internally when items are actually selected by user keyboard or mouse actions, when you do not want to inhibit firing the listeners.要确定是否执行actionListener 接口方法(actionPerformed() 代码块)中的各种方法,请在源组件(combo1 或combo2)上使用setActionCommand()。
对于您的示例,在将元素添加到combo2之前,调用setActionCommand(“doNothing”)并保护您的comboBoxActionPerformed()方法。
下面是一个可编译的示例,它使用这一原理让一个组合设置另一个组合的选定索引,同时还在 JTextField 中显示字符串。通过使用setActionCommand() 并保护comboActionPerformed() 代码块,JTextField 将循环遍历wordBank 中的每个单词。如果comboActionPerformed()方法没有被保护或者如果actionCommand字符串没有被改变,2个actionEvents将触发并且textField将跳过单词。
To determine whether or not to perform various methods in actionListener interface methods (actionPerformed() blocks of code) use setActionCommand() on source components (combo1 or combo2).
For your example, before adding elements to combo2, call setActionCommand("doNothing") and guard your comboBoxActionPerformed() method.
Here's a compilable example that uses this principle to have one combo set another combo's selected index while also displaying a String in a JTextField. By using setActionCommand() and guarding the comboActionPerformed() block of code, the JTextField will cycle through each word in the wordBank. If the comboActionPerformed() method was not guarded or if the actionCommand String was not changed, 2 actionEvents will trigger and the textField will skip words.
由于我是编程新手,因此我对程序的这个问题采取了愚蠢的简单路线。
我将动作侦听器更改为具有计数器 if 语句:
if(stopActionlistenersFromFiringOnLoad != 0){//action returned ;}
然后在 java 程序创建结束时,我向计数器添加了 1:
topActionlistenersFromFiringOnLoad += 1;
I kind of went the stupid simple route with this issue for my program since I am new to programming.
I changed the action listeners to have a counter if statement:
if(stopActionlistenersFromFiringOnLoad != 0){//action performed ;}
Then at the end of the java program creation, I added 1 to the counter:
topActionlistenersFromFiringOnLoad += 1;
为了避免 addItem 方法触发事件,最好在 JComboBox 中使用 DefaultComboBoxModel 来添加数据。另外,如果您调用 model.addElement(),则会触发一个事件,因此您可以将所有元素添加到模型中,然后使用 JComboBox.setModel(model)。这样,如果您向模型添加元素,则不会触发事件,因为您尚未将 JComboBox 与模型链接。然后,我向您展示一个例子。
首先,我们创建模型,将所有元素添加到模型中(不会触发事件,因为您尚未将 JComboBox 与模型链接起来),我们使用 ArrendatarioComboBox.setModel(model) 将模型与 JComboBox 链接起来。链接后,事件被触发。
To avoid that addItem method fire events is better to use an DefaultComboBoxModel in the JComboBox to add data. Also, if you invoke a model.addElement(), an event is fired, so, you can add all the elements to the model and later use JComboBox.setModel(model). In this way, if you add elements to the model, events are not fired because you have not link the JComboBox with the model. Then, I show you an example.
First, we create the model, add all elements to the model (events are not fired because you have not link the JComboBox with the model), we link the model with the JComboBox using ArrendatarioComboBox.setModel(model). After linking, events are fired.