【问题标题】:I can't get the string from ActionListener to different class in Java我无法将字符串从 ActionListener 获取到 Java 中的不同类
【发布时间】:2013-07-08 05:44:33
【问题描述】:

我创建了一个 JComboBox 和 JButton 来提交信息。我需要将信息发送到不同的类以使用 switch 方法对其进行排序。但看起来在 ActionListener 中创建的字符串没有被其他类识别。

public Main() {
    final JComboBox comboB = new JComboBox(b);          //add int b in here for array
    comboB.setBounds(50, 30, 123, 20);
    contentPane.add(comboB);

    JButton btnTest = new JButton("Test");
    btnTest.setBounds(300, 350, 89, 23);
    contentPane.add(btnTest);

    btnTest.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            String s = (String)comboB.getSelectedItem();
        }
    });
 }

如何让 String 可以被其他类识别?我有一个单独的类,它将根据从 ComboBox 中选择的内容更改操作,但我似乎无法获取此信息。谢谢。

【问题讨论】:

  • 1) 为了尽快获得更好的帮助,请发帖 SSCCE。 2) Java GUI 可能必须在多个平台、不同的屏幕分辨率和使用不同的 PLAF 上工作。因此,它们不利于组件的精确放置。要组织强大的 GUI 组件,请改用布局管理器或它们的组合,以及用于空白空间的布局填充和边框。 3) 对代码块使用一致且符合逻辑的缩进。代码的缩进是为了帮助人们理解程序流程。
  • 将字符串设为实例变量,最好是private,并创建类似public String getS() { return this.s; }的get方法

标签: java swing awt actionlistener jcombobox


【解决方案1】:

首先,其他对象需要某种方式将ActionListener 注册到组合框。我建议为您的班级提供addActionListener 方法,这将充当代理方法并将调用简单地传递给comboB

其次,这意味着comboB 需要成为类实例变量

第三,例如,​​其他类将需要确定操作是否源自组合框。

@Override
public void actionPerformed(ActionEvent e) {
    if (e.getSource() instanceof JComboBox) {
        JComboBox cb = (JComboBox)e.getSource();
        String s = (String)cb.getSelectedItem();
    }
}

现在,这个问题没有太多可用的上下文,但就个人而言,我通常会使用某种模型,您的 UI 类会更新和/或其他类可以注册的 PropertyChangeListener 和监控主类的“属性”的变化。

【讨论】:

    【解决方案2】:

    您只需要创建一个私有方法并让组合调用它。然后您只需导航到您的组件/类,并执行操作。

        public Main() {
        final JComboBox comboB = new JComboBox(b);          //add int b in here for array
        comboB.setBounds(50, 30, 123, 20);
        contentPane.add(comboB);
    
        JButton btnTest = new JButton("Test");
        btnTest.setBounds(300, 350, 89, 23);
        contentPane.add(btnTest);
    
        btnTest.addActionListener(new ActionListener() {
    
            @Override
            public void actionPerformed(ActionEvent e) {
                String s = (String)comboB.getSelectedItem();
                myMethodThatProcessesS(s);
    
            }
        });
     }
    
    private void myMethodThatProcessesS(String s) {
         contentPane.getSomeOtherComponent().doSOmething(s);
    }
    

    【讨论】:

      【解决方案3】:

      由于 java swing 实现了MVC pattern,您可以将 JComboBox 的模型引用传递给其他对象。

      模型实现了观察者模式,因此如果其他对象需要在模型更改时立即得到通知,则可以自行注册。

      public class Main {
          public initializeComponent(OtherClass otherClass) {
              ...
              JComboBox comboBox = ...;
              ComboBoxModel comboBoxModel = comboBox.getModel();
              otherClass.setComboBoxModel(comboBoxModel);
          }
      }
      
      public class OtherClass {
      
          private ComboBoxModel comboBoxModel;
      
          public void setComboBoxModel(ComboBoxModel comboBoxModel) {
              this.comboBoxModel = comboBoxModel;
              ListDataListener listener = ...;
              comboBoxModel.addListDataListener(listener);
          }
      
          public String getSelectedItem(){
              Object selectedItem = comboBoxModel.getSelectedItem();
              ...
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-09-27
        • 2020-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-18
        • 2019-07-05
        相关资源
        最近更新 更多