【发布时间】:2019-09-30 11:35:24
【问题描述】:
我在 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”不稳定,但没有成功。
---修改后的代码---
主界面:
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();
}
}
}
卡片布局类:
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();
}
});
}
}
【问题讨论】:
-
请提供一个可运行的示例(又名minimal reproducible example),以便我们还可以重现您的“错误”行为并调试您的代码。请不要发布您当前的代码,而是尝试创建一个小的可运行示例来演示您的问题。如我所见,您使用线程来修改 Swing 小部件。这是个坏主意。所有修改都必须在 Swing-Thread 中执行。欲了解更多信息,请阅读concurrency in Swing。
-
你读过concurrency in Swing吗?当我在 Swing 代码中看到
Thread.sleep(2000)时,我会收到红色警报。 -
为什么在代码中使用线程?他们有必要吗?当需要在后台线程中做某事时,我使用
SwingWorker。但在你的情况下,恕我直言,你不需要它。 -
为什么要使用单独的线程来添加动作监听器?应在 EDT 上添加动作侦听器。此外,当它们因动作事件而被调用时,无论您用于添加动作侦听器的线程如何,都会在 EDT 上发生。
-
MainGUI gui = new MainGUI();创建一个新的主 gui,然后当您调用gui.setRfidEnabled();时,它位于新的主 gui 上,而不是现有的。
标签: java multithreading swing jframe jtextfield