【问题标题】:How to use actionPerformed( ActionEvent e ) with more that one button?如何使用带有多个按钮的 actionPerformed( ActionEvent e )?
【发布时间】:2016-01-18 20:54:45
【问题描述】:

所以我的任务是创建一个顺序文件。我的教授给了我这个执行动作的简单代码:

    public void actionPerformed( ActionEvent e )  { 

    //FOR STATE AND COUNTRY
    String country = (String)comboBox_1.getSelectedItem();
        Object o = states.get( country );

        if (o == null)
        {
            comboBox_2.setModel( new DefaultComboBoxModel() );
        }
        else
        {
            comboBox_2.setModel( new DefaultComboBoxModel( (String[])o ) );
        }
        //****DONE WITH THE STATE AND COUNTRY COMBOBOXEZ*****

    addRecord( ) ;



    if ( e.getSource( ) == btnDone )  {
      try {
        output.close( ); 
      }
      catch ( IOException io )  {
        System.err.println( "File not closed properly\n" +
           e.toString( ) );
        System.exit(1);
      }



      System.exit(0); 


    }
  } 

}
它基本上说如果你点击“完成”按钮以外的任何东西,它会创建一个顺序文件。我应该怎么做才能选择每个动作会做什么?我做了一个包含国家和州的 jcombobox,当我选择一个国家时,它会创建文件,然后将我带到该国的州。希望你能帮助我,谢谢。

【问题讨论】:

  • 您是否尝试将处理程序传递给多个按钮?是什么让你认为你不能这样做?
  • 我不知道怎么做,或者至少我认为我不知道.. 我尝试了很多不同的按钮和 if 语句,我很烂!!
  • 您可能想告诉您的教授,在 swing UI 线程上执行 I/O 是个坏主意。
  • 公平地说,这最初是针对 awt 组件的,不知道是否同样适用。

标签: java swing actionlistener jcombobox


【解决方案1】:

我不确定我是否完全理解您的问题,但是...

你可以使用:

  • ActionEvent#getSource 获取事件的源组件。假设您可以引用其他组件,您可以简单地使用它来比较它们,例如if (e.getSource( ) == btnDone) {
  • ActionEvent#getActionCommand 返回与组件关联的 actionCommand(通过支持组件上的 setActionCommand 设置),它为您提供确定事件类型的方法,而无需引用源组件,这在以下情况下也很有用您可能有一个可以通过多种不同方式触发的“常见”操作。

现在,一般来说,当actionPerformed 被调用时,你想确定是什么触发了动作并采取适当的动作,所以对于你的代码,你可能会做一些更像......

if (e.getSource() == comboBox_1) {
    String country = (String) comboBox_1.getSelectedItem();
    Object o = states.get(country);

    if (o == null) {
        comboBox_2.setModel(new DefaultComboBoxModel());
    } else {
        comboBox_2.setModel(new DefaultComboBoxModel((String[]) o));
    }
    //****DONE WITH THE STATE AND COUNTRY COMBOBOXEZ*****

    addRecord();
} else if (e.getSource() == btnDone) {
    try {
        output.close();
    } catch (IOException io) {
        System.err.println("File not closed properly\n"
                + e.toString());
        System.exit(1);
    }

    System.exit(0);

}

这是设计ActionListener 的一种相当“古老”的方式,这可以追溯到inner/anonymous classes 之前的日子,那时创建单个ActionListener 类更简单。

现在通常更优选使用内部/匿名类来生成小型、孤立和上下文监听器,这可能看起来像......

comboBox_1.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        String country = (String) comboBox_1.getSelectedItem();
        Object o = states.get(country);

        if (o == null) {
            comboBox_2.setModel(new DefaultComboBoxModel());
        } else {
            comboBox_2.setModel(new DefaultComboBoxModel((String[]) o));
        }
        //****DONE WITH THE STATE AND COUNTRY COMBOBOXEZ*****

        addRecord();
    }
});

这是一个独立的、上下文相关的单元作品,专为单次使用而设计。一般来说,它更容易阅读和维护,因为上下文定义明确,并且您不会试图在一堆不相关的工作中小心翼翼。

如果您需要更可重复使用的东西,那么您应该看看How to Use Actions

【讨论】:

  • 谢谢伙计,我希望我在开始我的任务之前就知道这一点,这样就不会那么混乱了,而且我可能不会被卡住。尽管如此,尽管它发生了同样的事情,但我还是无法弄清楚这件事。
【解决方案2】:

我找到了解决方案,它就在我眼前,这是为未来的用户准备的。

public void actionPerformed(ActionEvent e){ 

  //FOR STATE AND COUNTRY
  String country = (String)comboBox_1.getSelectedItem();
  Object o = states.get(country);
  if (o == null){
      comboBox_2.setModel(new DefaultComboBoxModel());
  }
  else{
      comboBox_2.setModel(new DefaultComboBoxModel((String[])o));
  }
  //****DONE WITH THE STATE AND COUNTRY COMBOBOXES*****

  // this was the solution for my problem
  if(e.getSource==buttonToAddRecords){
      addRecord( ) ;
  }

  if(e.getSource( ) == btnDone){
    try{
      output.close( ); 
    }
    catch(IOException io){
      System.err.println("File not closed properly\n" +
         e.toString( ));
      System.exit(1);
    }
    System.exit(0); 
  }
} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多