Как мне прочитать или изменить элементы управления Java на пользовательском интерфейсе из нескольких потоков? - PullRequest
0 голосов
/ 27 сентября 2018

Я напишу сводку кода, а затем объясню.

У меня есть кнопка STARTER , которая запускает процедуру и монитор прогресса для нее

// from a button
actionPerformed()
    // enable procedure control buttons pause and cancel at this point
    SomeProcedure ProcTh = new SomeProcedure(aTable)
    ProcTh.Start();
    ProcessLog LogTh = new ProcessLog(aTable, aProgressBar)
    LogTh.Start();
    // inside try catch:
    ProcTh.join();
    LogTh.join();

Это сводка вызванного потока процедуры:

class SomeProcedure extends Thread
    JTable aTable = null;
    // the executable part
    public void run()
        for (int i=0;i<aTable.getRowCount();i++)
            // process data in a row
            while (Paused &&! Canceled)
                wait(); // inside a try catch
            if (Canceled)
                i=aTable.getRowCount()-1; // maybe a break is better??
    // the constructor part initializes things
    public SomeProcedure (JTable T)
        aTable = T; 

Это сводка вызванного потока монитора:

class ProcessLog extends Thread
    JTable aTable = null;
    JProgressBar aBar = null;
    // the executable part
    public void run()
        while (sofarlong<totallong)
            aBar.setValue((int)(sofarlong/totallong));
            // also update values in aTable
    // the constructor part
        public ProgressLog (JTable T, JProgressBar B)
            aTable = T;
            aBar = B; 

У меня нет ERR компиляции, нокогда я нажимаю STARTER , он висит нажатым, а кнопки паузы и отмены не включаются.Я, вероятно, делаю что-то не так.Это лучший способ обновить элементы управления графическим интерфейсом из потоков в Java?Это лучший способ показать прогресс , достигнутый другим потоком?Я заметил, что не могу получить доступ к элементам управления графического интерфейса из run внутри потоков, поэтому я пропустил их при создании потоков.

SomeProcedure пишет на SoFarLong , в то время какэто таблица обработки rown, и ProcessLog будет только читать ее.SoFarLong - это общая переменная на уровне GUI, такая же, как SomeProcedure и ProcessLog, скажем, она называется GUI.java ---

Как всегда, любая помощь или ориентация действительно приветствуются.

1 Ответ

0 голосов
/ 27 сентября 2018

Вызов Thread.join() будет блокироваться, пока поток не закончится.Вызывая это в вашем обработчике кнопок, ваш обработчик кнопок не возвращается, пока процесс не завершится.

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