2015-03-18 4 views
0

Я создаю приложение GUI, и в фоновом режиме я хочу запустить дополнительную задачу. Я вставлю код, чтобы предотвратить вставку беспорядка кода, который был сгенерирован Swing, я оставлю некоторые части, предположим, что window.java работает по назначению.Передача объектов в другой поток

window.java:

public class window { 
frame = new JFrame(); 
JLabel lbl1 = new JLabel("Start Counter"); 
frame.add(lbl1); 

Thread counter = new Thread(new counter()); 
    counter.start(); 
} 

counter.java

public class regCheck extends window implements Runnable 
{ 

public void run() 
{ 
    int i = 0; 
    while (true) 
    { 
     window.lbl1.setText(i); 
     try {Thread.sleep(1000);} 
      catch (InterruptedException e) {e.printStackTrace();} 
     i++; 
    } 
} 
} 

, что я хочу, чтобы этот пример сделать, это создать ярлык в окне и сосчитать вверх, пока программа не будет закрыта. Простой ответ здесь заключается в том, чтобы сказать «пройти в Джлабель», но на самом деле у меня есть несколько вещей, которые мне нужно изменить не только на этикетке.

строка "window.lbl1.setText (i);" здесь не работает, это просто для иллюстрации того, чего я хочу достичь.

ответ

1

это на самом деле архитектурный вопрос, вы можете передать какие-либо аргументы в другой поток и этот поток, конечно, может изменить различные ярлыки, но я предпочитаю другой вариант:

  1. у вас есть окно, которое имеет свои объекты/управление и может манипулировать им
  2. у вас есть отдельный поток, который увеличивает счетчик

это отдельный поток должен уведомить главный объект окна об изменениях и объекте окна должны изменить это элементы управления, соответственно, для текста примера изменения в одном или нескольких элементов управления

один простой вариант должен иметь интерфейс, как ICounterHandler с одним методом

void onCounterChanged(int newCounterValue); 

счетчика нити должны принимать ICounterHandler в конструктор, сохранить его и вызывать этот метод, когда это необходимо, предпочтительнее асинхронного

конечно есть много других вариантов, но вы можете начать с этого.

+0

Прошу прощения за то, что мои знания на самом деле очень просты в Java на данный момент. , поэтому вместо доступа через counter.java, я создаю метод в окне.java, который обновит это значение с помощью аргумента, а затем вызовет метод из counter.java Я создаю окно в методе «initialize», и поэтому все мои объявления элементов находятся в инициализации, поэтому я застрял с аналогичным проблема получения объектов из одного метода в этот новый метод, который я вызову с помощью counter.java – penfold1992

+0

, проблема в том, что метод инициализации моего окна содержит весь код для окна ... так что из класса счетчика следующий код вызывает issue window a = новое окно; Это запускает несколько экземпляров главного окна, которое не является тем, что я хочу, особенно потому, что в настоящее время это нецелесообразно, когда я не могу передать панель задач от инициализации до нового метода – penfold1992

2

Используйте шаблон MVC. Создайте модель, у которой есть счетчик с методом setValue(), который вызывает уведомление слушателя. Вы можете расширить java.util.Observable, чтобы сделать это проще. Добавьте метод getValue() для получения нового счета. Сделайте синхронизацию сеттера и геттера безопасным потоком.

Теперь вашему потоку можно передать экземпляр модели и вызвать setValue(), чтобы обновить значение в его методе run().

Наконец, ваше представление может быть передано одним и тем же экземпляром модели и добавить к нему слушателя. Чтобы упростить просмотр, вы можете реализовать java.util.Observer. В ответном вызове update() в представлении вызовите номер модели getValue() и используйте возврат в качестве аргумента для setText(). Поскольку обновление прослушивателя не вызывается из потока диспетчера событий AWT, вы должны позвонить setText() с использованием javax.swing.SwingUtilities.invokeLater(), чтобы соответствовать требованиям безопасности потока Swing.

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