我在MainGUI类中将JTextField
“ rfid”设置为setEnabled(false)
,并创建了方法setRfidEnabled
以能够启用另一个名为CardLayout的类的文本字段。
当我尝试通过按钮事件侦听器从CardLayout调用它时,它什么也不做,这是指文本字段,因为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();
}
});
}
}
答案 0 :(得分:1)
如@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的另一个线程)在上述所有示例中都可以看到,它们都不需要另一个线程来处理这些动作,使用线程的那个线程仅用于执行动画,而不会对用户的点击做出反应。
推荐的教程:How to use Actions