Я работаю над приложением, которое считывает строки из документа и заменяет каждое заполнение данного слова другим словом (по пользовательскому вводу).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;
}
для лучшей помощи рано, оставить [MCVE] или [Short, Self Contained, Correct Example] (http://www.sscce.org/). –
Ваш вопрос кажется довольно широким: по существу: если вы хотите, чтобы код, который работает в differen t для «синхронизации» своего поведения; ну, тогда вам нужно написать код для этого. Другими словами: вся ваша конструкция/реализация должна строиться вокруг этой идеи ... и об этом много нужно объяснять; поскольку для этого было бы легко заняться часами дискуссий. Мое предложение: забудьте об элементах пользовательского интерфейса на данный момент. Изучите учебники и расскажите, как «синхронизировать» несколько потоков на некоторых работах. И тогда, когда вы овладели этим; вы смотрите на добавление материала пользовательского интерфейса. – GhostCat
Спасибо, но синхронизация не проблема, я заставил программу работать одновременно и правильно. Я просто хочу получить пользовательский ввод от одного из потоков, который вызывает синхронизированный .modify(), который, в свою очередь, вызывает .replace (...), где я хочу, чтобы JOP отображался в первом if-statement. – 13120dde