首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ActionListener和ActionEvent问题

ActionListener和ActionEvent问题
EN

Stack Overflow用户
提问于 2018-12-24 22:56:44
回答 2查看 34关注 0票数 0

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

问题是这两个e.getSource()条件都没有得到验证(尽管我已经检查过几次了。我已经被这个问题困扰了3天了,所以老实说,如果你能帮我一点忙,我会非常欢迎的!

同时,祝圣诞快乐,新年快乐!

代码语言:javascript
复制
 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()“方法,但是它不能很好地工作。

代码语言:javascript
复制
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:在测试散列方法之后,我意外地发现了一个奇怪的bug。首先,当我点击"Add“MenuItem,然后点击"Validate”按钮,没有任何反应。但是,如果我单击“验证”按钮,然后单击"Add MenuItem,the code works...我将尝试不同的条件“。

EN

回答 2

Stack Overflow用户

发布于 2018-12-24 23:22:39

我有一个按钮,它有几个可能的操作,这取决于之前单击的是哪个MenuItem。

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

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

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

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

票数 0
EN

Stack Overflow用户

发布于 2018-12-24 23:28:07

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

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

让我们来看看你的代码。

private void buttonValidateActionPerformed(java.awt.event.ActionEvent事件){

代码语言:javascript
复制
 // TODO add your handling code here:   ActionListener l = (ActionEvent e) -> {

这是怎么回事。真正的听众请起立。放入一些printfs (或使用调试器)以确保控制流符合预期。

代码语言:javascript
复制
 if(e.getSource()==menuItemAdd)
 {
     System.out.println("eureka!");
     buttonResearch.setEnabled(false);
  if (evt.getSource()== buttonValidate)

我猜你也在某个地方写过。

buttonValidate = menuItemAdd;

检查一下你的监听器是否一切都设置正确是值得的。在顶部尝试几个printfs。

代码语言:javascript
复制
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语句。在每个监听器中,如果需要的话,它们可以检查状态。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53914940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档