JFrame在单独的类中,ActionListener怎么样?

时间:2014-03-21 18:38:23

标签: java swing actionlistener

我试图将Swing GUI与实际代码分开。简而言之,我希望用户启动一个过程(基于用户的选择);在这种情况下,将不再需要JFrame。

我无法弄清楚如何使用Main.class从GUI.class分享用户的选择。

你对我有什么建议吗?

这是我的代码:

public class Main {
  public static void main(String[] args) {
    // Show GUI
    java.awt.EventQueue.invokeLater(new Runnable() {
      public void run() {
        GUI gui = new GUI(templates);
        gui.setVisible(true);
      }
    });

    // Kick off a process based on the user's selection
  }
}

public class GUI extends JFrame {
  private static final long serialVersionUID = 1L;

  public GUI(Object[] objects) {
    setTitle("GUI");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 350, 100);
    setLocationRelativeTo(null);

    JPanel cp = new JPanel();
    cp.setBorder(new EmptyBorder(10, 10, 10, 10));
    setContentPane(cp);

    JLabel lbl = new JLabel("Selection:");
    cp.add(lbl);

    final JComboBox<String> comboBox = new JComboBox<String>(new String[] { "One", "Two", "Three" });
    comboBox.addActionListener(new ActionListener() {
      @Override
      public void actionPerformed(ActionEvent e) {
        setVisible(false);
        dispose();
        // Share the selected item with Main.class
      }
    });
    cp.add(comboBox);
  }
}

2 个答案:

答案 0 :(得分:1)

您可以创建一个对象来存储选择结果并将其传递给GUI类的构造函数。在关闭UI之前在该对象中设置选择结果,然后您的Main类可以访问值:

public class SelectionResult {
    private String selectionResult;

    public void setSelectionResult(final String selectionResult) {
        this.selectionResult = selectionResult;
    }

    public String getSelectionResult() {
        return this.selectionResult;
    }
}

然后,您可以像这样修改GUI构造函数:

private final SelectionResult selectionResult;

public GUI(Object[] objects, SelectionResult selectionResult) {
    this.selectionResult = selectionResult;
    ...

在Main类中创建一个SelectionResult对象,并将其传递给GUI类的构造函数。在GUI类ActionListener中,您可以使用所选值调用setSelectionResult()方法,并且该值可以从Main类中获得。

您需要添加代码以使主方法在等待在UI中设置值时等待,然后根据选择继续执行逻辑。

答案 1 :(得分:0)

这样做的好方法是使用 Callback机制

要遵循的步骤:

  • 创建一个回调接口

    interface Callback {
        void execute(Object result);
    }
    
  • GUI类将实现Callback接口,但不提供任何实现

  • 制作GUI课程abstract

    abstract class GUI extends JFrame implements Callback
    
  • 现在创建一个GUI类的对象,提供Callback接口的实际实现

  • 您可以在此处使用匿名类

    GUI gui = new GUI() {
    
        @Override
        public void execute(Object result) {
            System.out.println("You have selected " + result);
        }
    
    };
    
  • 您可以使用execute()的{​​{1}}方法传递任何内容。

    Callback

comboBox.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { setVisible(false); dispose(); // Share the selected item with Main.class // Callback execute(comboBox.getSelectedItem()); } }); 类负责捕获由Main类定向的Callback的响应。


以下是代码:

GUI