我试图将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);
}
}
答案 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