2016-12-11 3 views
0

Я работаю над приложением, которое считывает строки из документа и заменяет каждое заполнение данного слова другим словом (по пользовательскому вводу).Java JOptionPane из созданного потока - окно, не показывающее компоненты

Программа работает с тремя отдельными потоками, одна для чтения данных из файла в буфер, одна для изменения строк и одна для записи вывода.

Однако, если флажок отмечен как уведомляющий пользователь, тогда мне нужно спросить у пользователя, хочет ли он заменить подстроку при заданном «ударе». Теперь вот проблема, когда я пытаюсь использовать JOptionPane.showConfirmDialog (...) из потока изменений, тогда окно не содержит никакого содержимого (пустой белый ящик).

Я также попытался использовать SwingUtilities.InvokeLater (новый Runnable() {... logic ...}), который работал для показа подтверждения, но другие потоки продолжали работать в pararell (мне нужно, чтобы они остановились и ждать ввода пользователя).

/** 
* Checks the status of the string at each position in the buffer. If the status = Status.New and the String-object 
* matches to the string to replace then it will be replaced with the String-object replaceString. 
* <p> 
* If the Status of the object is anything other than Status.New then the thread will be blocked. 
* <p> 
* When done, the status of the modified object is changed to Status.Checked. 
*/ 
public synchronized void modify() { 
    try { 
     while (status[findPos] != Status.New) { 
      wait(); 
     } 

     String oldString = buffer[findPos]; 
     if (buffer[findPos].equals(findString)) { 
      buffer[findPos] = replace(findString, replaceString, start, findString.length()); 
     } 

     start += oldString.length() + 1; 
     status[findPos] = Status.Checked; 

     findPos = (findPos + 1) % maxSize; 

    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
    notify(); 

} 

/** 
* Replaces the strSource with strReplace and marks the word in the source-tab JTextPane. The start argument 
* represents the index at position to replace the substring, the size argument represents the substring's 
* length. 
* 
* TODO : if notifyUser -> ask for user prompt before replacing. 
* 
* @param strSource : String 
* @param strReplace : String 
* @param start  : int 
* @param size  : int 
* @return s : String 
*/ 
public String replace(String strSource, String strReplace, int start, int size) { 
    String s = strSource; 
    DefaultHighlighter.DefaultHighlightPainter highlightPainter = 
      new DefaultHighlighter.DefaultHighlightPainter(Color.YELLOW); 


    //Ask user if he wants to replace the substring at position 'start'. 
    if (notifyUser) { 
     int x= JOptionPane.showConfirmDialog(null, "TEST", "TEST", JOptionPane.YES_NO_OPTION); 
    } else { 
     try { 

      textPaneSource.getHighlighter().addHighlight(start, start + size, 
        highlightPainter); 


     } catch (BadLocationException e) { 
      e.printStackTrace(); 
     } 
     s = strReplace; 
     nbrReplacement++; 
    } 

    return s; 
} 
+0

для лучшей помощи рано, оставить [MCVE] или [Short, Self Contained, Correct Example] (http://www.sscce.org/). –

+0

Ваш вопрос кажется довольно широким: по существу: если вы хотите, чтобы код, который работает в differen t для «синхронизации» своего поведения; ну, тогда вам нужно написать код для этого. Другими словами: вся ваша конструкция/реализация должна строиться вокруг этой идеи ... и об этом много нужно объяснять; поскольку для этого было бы легко заняться часами дискуссий. Мое предложение: забудьте об элементах пользовательского интерфейса на данный момент. Изучите учебники и расскажите, как «синхронизировать» несколько потоков на некоторых работах. И тогда, когда вы овладели этим; вы смотрите на добавление материала пользовательского интерфейса. – GhostCat

+0

Спасибо, но синхронизация не проблема, я заставил программу работать одновременно и правильно. Я просто хочу получить пользовательский ввод от одного из потоков, который вызывает синхронизированный .modify(), который, в свою очередь, вызывает .replace (...), где я хочу, чтобы JOP отображался в первом if-statement. – 13120dde

ответ

0

Я думаю, что вам нужно ThreadLocal переменную, которая разделяется между нитями. затем вы должны проверить это в каждом потоке вы хотите приостановить его.

Смежные вопросы