Я разрабатываю пользовательский веб-искатель на основе cli на Java. Поскольку для отображения результата нужен удобный графический интерфейс, я должен добавить к нему качающийся кадр, включающий некоторые деревья, метки, таблицы и т. Д. Этот графический интерфейс является одним из его переключателей и должен быть запущен на всякий случай, когда пользователь вызывает его. Таким образом, я должен запустить этот интерфейс в новом потоке, чтобы при необходимости приложения могли выполнять другие задачи и обновлять компоненты внутри фрейма GUI. Мой класс GUI некоторые вещи, как:Используйте качели в другой теме
public class Frame extends JFrame {
......
public static JLabel urlLabel;
......
public static void run() {
urlLabel = new JLabel();
urlLabel.setText("Test Url");
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new Frame().setVisible(true);
}
});
}
.....
}
И я раскошелиться его от моего основного класса, как это:
.....
if(cmd.gui){
Frame.run();
Frame.urlLabel.setText("New Url");
}
......
К сожалению, текст метки не меняется. Я уже тестировал repaint()
, revalidate()
и другие подобные функции, но ничего не получилось. Я проверил getText()
, чтобы убедиться, что можно получить доступ к urlLabel
из основного класса, и он сработал (я мог получить текст метки).
Мне было интересно, как я могу разобраться в этой проблеме? (В принципе, мне нужно запустить качающуюся раму в другой нити и управлять ее компонентами из основной резьбы)
Заранее спасибо.
Вам просто нужно использовать выделенный качающийся поток, чтобы изменить элементы интерфейса, как вы уже делали с 'SwingUtilities.invokeLater', каждый раз! Или, может быть, я понимаю вашу проблему неправильно? – xander
@xander Я уже это сделал. Качание начинается в новом выделенном потоке, и мне нужно обновить/изменить его компоненты. Как я уже сказал, это пользовательский веб-искатель, и мне нужно добавить новые собранные данные в графический интерфейс, пока приложение сканирует веб-сайт. –
@SinaYazdanmehr Также помните, что Swing не является потокобезопасным, и все обновления пользовательского интерфейса ДОЛЖНЫ быть сделаны из контекста Диспетчерского потока событий. Вы также не должны полагаться на 'static' как метод передачи перекрестных объектов, это просто боль в коде. Вместо этого вы должны поделиться моделью между пользовательским интерфейсом и другими частями кода. Пользовательский интерфейс может использовать шаблон наблюдателя для получения обновлений при изменении модели и обеспечения ее обновления из EDT с помощью 'invokeLater'. Обычно вы используете 'SwingWorker', который будет управлять частью« не-UI », но через который можно было бы уведомить UI – MadProgrammer