Установить текст на Jlabel на главной форме из темы
У меня есть Java-приложение, в котором я вызываю потоки для выполнения некоторых вещей:
public class ThreadTest implements Runnable {
private final int functionNumber;
public static mainForm main = new mainForm();
private final int time2start;
public static YourClass obj = new YourClass();
public ThreadTest(int functionNumber, int time2start, YourClass obj){
this.functionNumber = functionNumber;
this.time2start = time2start;
}
@Override
public void run(){
try{Thread.sleep(time2start);}catch(Exception ex){}//Time Delay before executing methods
switch(functionNumber){
case 1:
obj.runFirst();
break;
case 2:
obj.runSecond();
main.appendText("Something");
break;
case 3:
{
try {
obj.runThird();
} catch (IOException ex) {
Logger.getLogger(ThreadTest.class.getName()).log(Level.SEVERE, null, ex);
}
}
break;
И это метод в моей основной форме с графическим интерфейсом Swing, на котором я хочу добавить текст из потока:
void appendText(String text){
generalStatus.setText(text);
}
Как это достигается? Я думаю, мне нужно использовать перекрасить или что-то?
1 ответ
Обновление компонента GUI (JLabel) из другого потока, кроме потока Swing, не может быть выполнено напрямую. Но вы можете использовать синхронизированный поток с потоком Swing, используя SwingUtilities.invokeLater. Компоненты графического интерфейса могут быть обновлены внутри потока, как это,
void appendText(String text) {
final String Text=text;
SwingUtilities.invokeLater(new Runnable() {
public void run() {
generalStatus.setText(Text);
}
});
}
Всякий раз, когда вы хотите обновить компоненты GUI в любом другом потоке, кроме потока Swing, вы должны использовать этот механизм.