java 操作侦听器和操作事件问题

r3i60tvu  于 2023-01-01  发布在  Java
关注(0)|答案(2)|浏览(101)

我的ActionListener遇到了一个技术问题。你看,我有一个按钮可能有几个操作,这取决于之前单击的是哪个MenuItem。因此我创建了一个带有ActionEvent e的ActionListener。“e”应该验证以下3个条件之一(因为我有3个菜单项-添加、删除和修改),根据选择的是哪一个,发生的动作彼此不同。
问题是,这两个e.getSource()条件都没有得到验证(尽管我已经检查过几次了),

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("...");
        
        }
        ...

在测试了散列方法之后,我偶然发现了一个奇怪的bug。起初,当我点击“添加”菜单项,然后点击“验证”按钮时,什么都没有发生。然而,如果我点击“验证”按钮,然后点击“添加菜单项”,代码就可以工作了......我将尝试不同的条件。

pgky5nke

pgky5nke1#

我有一个按钮,有几个可能的行动,这取决于哪个菜单项被点击之前。
响应按钮单击而激发的ActionEvent的源是被单击的按钮。不能使用它来查询用户以前与之交互的控件。至少不能直接查询。
GUI中的控制流对我来说并不完全清楚,但是您的替代方法可以分为以下几类:

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

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

idv4meu8

idv4meu82#

这是一个非常令人困惑的问题。
我首先要说的是,使用getSource通常是一个坏主意。它将操作耦合到组件--这正是引入侦听器要摆脱的问题。这就像回到JDK 1.00,没有人希望那样,只是现在我们增加了额外的复杂性。而且Swing倾向于使用复合组件(这是Composite设计模式)。
让我们看看您的代码。
私有空按钮验证已执行的操作(java.awt.事件.操作事件事件){
// TODO在此处添加处理代码:动作监听器l =(动作事件e)-〉{
这是怎么回事。请真实的的行动监听站起来。放一些printfs在(或使用调试器),以确保控制流是预期的。

if(e.getSource()==menuItemAdd)
 {
     System.out.println("eureka!");
     buttonResearch.setEnabled(false);
  if (evt.getSource()== buttonValidate)

我想你也写过。
按钮验证=菜单项目添加;
在你的监听器中检查一下是否一切都设置正确是值得的。尝试在顶部使用一些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语句。在每个侦听器中,如果需要,它们可以检查状态。

相关问题