我试图将我的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);
}
}
一个很好的方法是使用 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()
方法传递任何内容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
类指示的响应。
这是代码:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
public class Main {
public static void main(String[] args) {
// Show GUI
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
GUI gui = new GUI() {
@Override
public void execute(Object result) {
System.out.println("You have selected " + result);
}
};
gui.setVisible(true);
}
});
// Kick off a process based on the user's selection
}
}
interface Callback {
void execute(Object result);
}
abstract class GUI extends JFrame implements Callback {
private static final long serialVersionUID = 1L;
public GUI() {
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 comboBox = new JComboBox(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
execute(comboBox.getSelectedItem());
}
});
cp.add(comboBox);
}
}
如何在java摆中从第二个JFrame获取数据?我有一个带有JLabel和JButton的帧。单击JButton时,它会打开另一个带有自定义日历的帧。我想选择日期(通过JButton)并将日期放在主JFrame的JLabel中。我不想创建第一帧的新实例,因为还有其他用户可能键入的我不想删除的信息。
我在一个父类中与Java中的ActionListener作斗争,我尝试了一系列可能的解决方案,但都无法使其工作。这在这里也没有帮助:Java actionlistener在不同的类中执行actionPerformed 问题如下: 父类 子类
我在一个java应用程序上工作。我想在箭头键上实现一个KeyListener。我有一个扩展JFrame并实现ActionListener的类
我写的程序有问题。我把你放在上下文中... 我尝试在这个程序中实现:MVC模式,因此,基本上,我将这些类分离在不同的包中。 我有一个:视图和控制器包,在视图包中我有:UserInterface类,它扩展了JFrame,并包含:JMenuBar、jMenus和JMenuItem。。。 你可以用JMenuItem添加标签,这个JMenuItem,获取并添加一个: ActionListener,这个ac
我创建了一个DefaultTableModel,它在JTabbedPane中显示了一个非常基本的用户列表。 这是显示和它的好,但谁能指导我使用什么语法来添加行,我已经尝试过: 但这不起作用,eclipse要求我向Statistics类添加一个名为“add row”的方法,但我以为“add row”已经是DefaultTableModel的方法了,所以我很困惑。有没有人能帮助我如何将一行数据添加到表