ActionListener和ActionEvent问题

时间:2018-12-24 14:56:44

标签: java jbutton jmenuitem

我的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”,则代码可以正常工作……我将尝试其他条件。

2 个答案:

答案 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语句。然后,在每个侦听器中,他们可以根据需要检查状态。