首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >方法从第一个JFrame调用,在第二个方法中不执行任何操作

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

Stack Overflow用户
提问于 2019-05-13 13:34:57
回答 1查看 86关注 0票数 0

我将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:

代码语言:javascript
复制
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类:

代码语言:javascript
复制
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类:

代码语言:javascript
复制
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();
              }
          });
        }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-13 15:46:58

如@matt在上面的评论中所述

每次单击manual按钮时,都会创建一个new MainGUI()

您需要在构造函数或ActionListener中创建一个实例,并询问是否已经有它的实例(即Singleton)并使用它。

如果决定使用第一个变量,则将gui声明为全局变量:

代码语言:javascript
复制
MainGUI gui = new MainGUI();

在您的ActionListener上,它更改为:

代码语言:javascript
复制
@Override
public void actionPerformed(ActionEvent e) {
    System.out.println(currentThread());
    gui.setRfidEnabled();
    //frame.dispose();
}

那么您就有了它的一个实例。

同样,正如@Sergiy所述,您并不需要所有这些线程

下面是一些关于如何使用ActionListeners的示例

正如您在上述所有示例中所看到的,它们都不需要另一个线程来处理操作,使用线程的线程只用于执行动画,而不是响应用户的单击。

推荐教程:如何使用动作

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56113513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档