【问题标题】:ActionListener and ActionEvent issueActionListener 和 ActionEvent 问题
【发布时间】:2018-12-24 14:56:43
【问题描述】:

我的 ActionListener 出现技术问题。你看,我有一个按钮,它有多个可能的操作,这取决于之前单击了哪个 MenuItem。所以我创建了一个带有 ActionEvent e 的 ActionListener。 “e”应该验证 3 个条件之一(因为我有 3 个菜单项 - 添加、删除和修改),并且根据选择的一个,发生的操作彼此不同。

问题是 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:在测试哈希方法后,我偶然发现了一个奇怪的错误。起初,当我单击“添加”菜单项然后单击“验证”按钮时,什么也没有发生。但是,如果我单击“验证”按钮,然后单击“添加菜单项,代码有效……我将尝试不同的条件。

【问题讨论】:

  • 不要在另一个 ActionListener 中添加一个 ActionListener。为您的每个菜单项添加一个 ActionListener恰好一次,而不是每次用户按下按钮时。让该侦听器将 ActionEvent 保存在私有字段中,以便按钮的单独 ActionListener 可以使用它。
  • @BrentR 不,不起作用 - 但无论如何感谢您的尝试!
  • 请编辑您的问题并展示您尝试过的其他内容。 不要替换您当前的代码, 因为这会导致当前的答案看起来毫无意义。将新代码添加到问题的末尾。
  • @VGR 当您谈论在另一个 ActionListener 中添加一个 ActionListener 时,我不明白。 ActionListeners 添加在最后一个括号和分号之后。你能改一下你刚才说的话吗?
  • buttonValidateActionPerformed(ActionEvent evt) 显然是从按钮的 ActionListener 调用的。当用户按下您的按钮时,将调用该方法。在该方法中,您将向每个菜单项添加一个全新的 ActionListener,这是您不应该做的事情。就像现在的代码一样,用户第一次按下按钮时,菜单项没有自己的 ActionListener。用户第二次按下按钮时,每个菜单项都有一个 ActionListener。下一次,每个菜单项将有两个 ActionListener。然后是三个,然后是四个,依此类推。

标签: java swing jbutton jmenuitem


【解决方案1】:

我有一个按钮,可以执行多个操作,具体取决于之前单击了哪个 MenuItem。

响应单击按钮而触发的ActionEvent 的来源是被单击的按钮。您不能使用它来查询用户之前与之交互的控件。至少,不是直接的。

您的 GUI 中的控制流对我来说并不完全清楚,但您的替代方案分为几类:

  • 使用不同的按钮,而不是让同一个按钮负责不同的操作。
  • 如果您想继续通过菜单项设置某种模式,请将当前模式存储到按钮事件处理程序可访问的某个共享变量中,并让它使用它而不是动作来源。
  • 或者让您的菜单项更改按钮上安装的几个专用ActionListeners 中的哪一个,以便可以由调用的侦听器驱动效果的选择。

前两个中的任何一个都比最后一个要好得多,我提供它主要是为了完整性。

【讨论】:

    【解决方案2】:

    这是一个非常令人困惑的问题。

    首先我要说的是,使用getSource 通常是个坏主意。它将该操作与组件耦合——正是引入问题侦听器以摆脱。这就像回到 JDK 1.00 并且没有人想要那样,只是现在我们增加了额外的复杂性。 Swing 也倾向于使用复合组件(这是复合设计模式)。

    让我们看看你的代码。

    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 语句。在每个侦听器中,他们可以在必要时检查状态。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-16
      • 2013-04-21
      • 1970-01-01
      相关资源
      最近更新 更多