我的ActionListener遇到技术问题。您会看到,我有一个按钮,它可能具有多种操作,具体取决于之前单击的MenuItem。因此,我创建了一个带有ActionEvent e的ActionListener。 “ e”应该验证3个条件之一(因为我有3个MenuItems-Add,Delete和Modify),并且根据所选择的条件,所发生的动作彼此不同。
问题是e.getSource()的两个条件都从未得到验证(即使我已经检查过几次了。)我在这个问题上已经停留了3天了,老实说有点帮助非常欢迎!
与此同时,祝圣诞快乐,新年快乐!
private void buttonValidateActionPerformed(java.awt.event.ActionEvent evt){
// TODO add your handling code here:
ActionListener l = (ActionEvent e) -> {
if(e.getSource()==menuItemAdd)
{
System.out.println("eureka!");
buttonResearch.setEnabled(false);
if (evt.getSource()== buttonValidate)
{
DataTransac dt = new DataTransac();
dt.ajouterProgrammeurs("...");
}
}
if(e.getSource()==itemDelete)
{
if(evt.getSource()== buttonValidate)
{
DataTransac dt = new DataTransac();
dt.deleteProgrammers("...");
}
}
if(e.getSource()==itemModify)
{
if(evt.getSource()==buttonValidate)
{
DataTransac dt = new DataTransac();
dt.modifyProgrammeurs("...");
}
}
};
menuItemAdd.addActionListener(l);
itemDelete.addActionListener(l);
itemModify.addActionListener(l);
/*
*/
}
编辑:我尝试了“ .equals()”方法,但是效果不佳。
ActionListener l = (ActionEvent e) -> {
if(e.equals(menuItemAjouter))
{
System.out.println("eureka!");
buttonResearch.setEnabled(false);
if (evt.getSource()== buttonValidate)
{
DataTransac dt = new DataTransac();
dt.addProgrammers("...");
}
...
编辑2:在测试了哈希方法之后,我偶然发现了一个奇怪的错误。首先,当我单击“添加”菜单项,然后单击“验证”按钮时,什么也没有发生。但是,如果我单击“ Validate”按钮,然后单击“ Add MenuItem”,则代码可以正常工作……我将尝试其他条件。
答案 0 :(得分:0)
我有一个按钮,该按钮可能有几种操作,具体取决于之前单击过哪个MenuItem。
为响应按钮单击而触发的ActionEvent
的源是被单击的按钮。您不能使用它来查询用户先前与之交互的控件。至少不是直接。
对我来说,GUI中的控制流程并不十分清楚,但是您可以选择的控制类别有以下几种:
ActionListener
中的哪个,以便可以通过调用侦听器来驱动效果的选择。前两个中的任何一个都比最后一个更可取,我主要是为了完整性而提供
答案 1 :(得分:0)
这是一个非常令人困惑的问题。
我首先要说使用getSource
通常是一个坏主意。它将动作与组件耦合在一起-正是引入问题侦听器来解决这个问题。就像回到JDK 1.00一样,没有人想要它,只是现在我们增加了其他复杂性。另外,Swing倾向于使用复合组件(这是Composite设计模式)。
让我们看看您的代码。
private void buttonValidateActionPerformed(java.awt.event.ActionEvent evt){
// TODO在此处添加您的处理代码:
ActionListener l =(ActionEvent e)-> {
这是怎么回事。真正的动作听众请站起来。放入一些printfs(或使用调试器)以确保控制流符合预期。
if(e.getSource()==menuItemAdd)
{
System.out.println("eureka!");
buttonResearch.setEnabled(false);
if (evt.getSource()== buttonValidate)
我想你也在某个地方写过信。
buttonValidate = menuItemAdd;
值得在您的监听器中检查所有设置是否正确。在顶部尝试一些printfs。
System.err.println("e.getSource(): "+System.identityHashCode(e.getSource());
System.err.println("buttonValidate: "+System.identityHashCode(buttonValidate));
System.err.println("menuItemAdd: "+System.identityHashCode(menuItemAdd));
System.err.println("itemDelete: "+System.identityHashCode(itemDelete));
System.err.println("itemModify: "+System.identityHashCode(itemModify));
如果您在某处弄乱了一些分配,这应该显示为意外的对象哈希码。
我建议退出代码并为每个动作添加一个动作侦听器。您不需要到处都需要这些if
语句。然后,在每个侦听器中,他们可以根据需要检查状态。