我将JTextField "rfid“设置为MainGUI类中的setEnabled(false),并创建了方法setRfidEnabled,以便能够从另一个名为CardLayout的类启用textfield。当我试图从CardLayout按按钮事件侦听器调用它时,它什么也不做,我的意思是textfield,因为System.out.print("LOL");工作正常。MainGUI包含JFrame,并通过按钮调用CardLayout类中的另一个JFrame。
当我初始化MainGUI类时,它有Thread[Thread-2,6,main],但是当我调用CardLayout时,它变成了Thread[AWT-EventQueue-0,6,main],与CardLayout本身一样。我试着让"rfid“变化无常,没有成功。
--编辑代码--
MainGUI:
public class MainGUI {
JTextField rfid;
JButton button;
final JFrame frame;
final JPanel pane;
LayoutChanger layout = new LayoutChanger();
public MainGUI() {
rfid = new JTextField("", 10);
button = new JButton("CardLayoutSwitch");
frame = new JFrame("Main GUI Panel");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout(5,5));
pane = new JPanel(new GridLayout(5, 5));
frame.add(pane,BorderLayout.CENTER);
pane.add(rfid);
pane.add(button);
rfid.setEnabled(false);
button.setEnabled(true);
frame.pack();
frame.setVisible(true);
frame.setLocationRelativeTo(null);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed (ActionEvent e){
layout.changeLayout(1);
}
});
}
public void setRfidEnabled() {
System.out.println("LOL");
rfid.setEnabled(true);
button.setEnabled(false);
}
}LayoutChanger类:
public class LayoutChanger {
public static void main(String[] args) {
MainGUI gui = new MainGUI();
}
public void changeLayout(int i){
if (i == 1) {
CardLayout card = new CardLayout();
}
}
}CardLayout类:
public class CardLayout {
JFrame frame;
JButton manual;
final JPanel pane;
MainGUI gui = new MainGUI();
public CardLayout() {
manual = new JButton("UID MANUAL");
frame = new JFrame("Card Scan Panel");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setLayout(new BorderLayout(5, 5));
pane = new JPanel(new BorderLayout(5, 5));
manual.setPreferredSize(new Dimension(50, 25));
frame.add(pane, BorderLayout.CENTER);
pane.add(manual);
frame.pack();
frame.setVisible(true);
frame.setLocationRelativeTo(null);
manual.addActionListener(new ActionListener() {
@Override
public void actionPerformed (ActionEvent e){
gui.setRfidEnabled();
}
});
}
}发布于 2019-05-13 15:46:58
如@matt在上面的评论中所述
每次单击manual按钮时,都会创建一个new MainGUI()。
您需要在构造函数或ActionListener中创建一个实例,并询问是否已经有它的实例(即Singleton)并使用它。
如果决定使用第一个变量,则将gui声明为全局变量:
MainGUI gui = new MainGUI();在您的ActionListener上,它更改为:
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(currentThread());
gui.setRfidEnabled();
//frame.dispose();
}那么您就有了它的一个实例。
同样,正如@Sergiy所述,您并不需要所有这些线程
下面是一些关于如何使用ActionListeners的示例
Timer (处理动画的另一个线程,但不阻塞EDT)正如您在上述所有示例中所看到的,它们都不需要另一个线程来处理操作,使用线程的线程只用于执行动画,而不是响应用户的单击。
推荐教程:如何使用动作
https://stackoverflow.com/questions/56113513
复制相似问题