IllegalStateException: тот же поток, другой источник (GUI) - PullRequest
0 голосов
/ 21 октября 2018

Моя проблема в том, что я хочу добавить один и тот же ActionListener к 2 различным компонентам в моей программе с графическим интерфейсом.Один, когда пользователь нажимает Enter Введите JTextField, и второй, когда пользователь нажимает на JButton.Я использую IDE Netbeans.

Поэтому я создал Thread, t1, и в методе actionPerformed actionListener я просто поместил t1.start () .Затем я добавил объект actionListener в мой JTextField и мой JButton.Когда я запускаю программу, в первый раз, когда я либо нажимаю кнопку, либо нажимаю Enter , программа работает без сбоев.Но во второй раз, когда я нажимаю кнопку или нажимаю Enter , программа выдает IllegalStateException .Вот мой код:

    Thread t1 = new Thread(new Runnable() {
        @Override
        public void run() {
            //Do something
        }
     });
    public final ActionListener listener;

    public myClass () {    //Constructor 
        this.listener = new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                t1.start();
            }
        };
    InitComponents();
    JButton.addActionListener(listener);      //Adding listener object to JButton.
    JTextField.addActionListener(listener);   //Adding listener object to JTextField.
    }

Я думаю, что поток не "умер" с первого раза, когда я нажал или нажал Введите , хотя run () метод уже завершен.Я тестировал программу в разных точках, чтобы убедиться, что метод run () завершился.

Я могу заставить программу работать, если создаю поток в обоих JButtonActionPerformed( и JTextFieldActionPerformed () и запускайте их внутри самих этих методов. Но это избыточно, поскольку я пишу одни и те же действия, которые будут выполняться двумя разными методами.

Любая помощьо том, почему было сгенерировано исключение IllegalStateException, и о том, как создать единый ActionListener для обоих JComponents, использующих поток. Спасибо!

1 Ответ

0 голосов
/ 21 октября 2018

Как состояние JavaDocs ...

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

Броски:
IllegalThreadStateException - если поток уже был запущен.

Вы не можете start a Thread дважды.Вместо этого начните с Runnable и оборачивайте вокруг него новый Thread каждый раз, когда вы хотите запустить его

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...