Метод, вызываемый из первого JFrame, ничего не делает во втором - PullRequest
0 голосов
/ 13 мая 2019

Я установил JTextField "rfid" в setEnabled(false) в классе MainGUI и создал метод setRfidEnabled, чтобы иметь возможность включать текстовое поле из другого класса с именем CardLayout.Когда я пытаюсь вызвать его из CardLayout через обработчик событий кнопки, он ничего не делает, я имею в виду текстовое поле, потому что System.out.print("LOL"); работает нормально.MainGUI содержит JFrame и с помощью кнопки вызывает другой JFrame в классе CardLayout.

Когда я инициализирую класс 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 Ответ

1 голос
/ 13 мая 2019

Как указано в комментариях выше @ 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:

Как вы можете видеть во всех приведенных выше примерах,ни одному из них не требовался другой поток для обработки действий, тот, который использует поток, предназначен только для выполнения анимации и не реагирует на щелчки пользователя.

Рекомендуемое руководство: Как использовать действия

...