从第一个JFrame调用的方法在第二个中不执行任何操作

时间:2019-05-13 13:34:57

标签: java multithreading swing jframe jtextfield

我在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();
              }
          });
        }
}

1 个答案:

答案 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的一些示例:

在上述所有示例中都可以看到,它们都不需要另一个线程来处理这些动作,使用线程的那个线程仅用于执行动画,而不会对用户的点击做出反应。

推荐的教程:How to use Actions