Строковая или целочисленная переменная Listener в Java? - PullRequest
4 голосов
/ 18 июля 2010

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

Я продолжаю искать информацию, но ничего не могу найти. Мне нужен слушатель переменной. вот что-то вроде того, что я пытаюсь сделать:

public class Class1{

public static int X;
public static void Process(){
   for (true){
        X = X + 1;
    }
}

Тогда у меня есть другой класс, где я хочу связать переменную с текстовым полем

Public class Class2{
  ****** On Class1.X.changeValue { Form.jLabel1.setText(Class1.X) }
}

Надеюсь, мне было ясно, что я пытаюсь сделать. Я пытаюсь привязать метку к переменной.

Ответы [ 4 ]

3 голосов
/ 20 января 2011

Вы можете использовать Шаблон Observer Design

2 голосов
/ 18 июля 2010

В Java нет конкретного языка для прослушивания переменных. То, что вам нужно будет сделать, это когда ваш код изменит переменную, а затем обновит JLabel.
У вас могут быть слушатели на кнопках и других виджетах пользовательского интерфейса, и они могут обновить JLabel.
Один из способов реализовать это заключается в следующем. Знаете ли вы о добытчиков и сеттеров? Это методы, которые выполняют получение и установку переменных экземпляра.

private int x;

public int getX()
{
    return x;
}

public void setX(int anX)
{
    x = anX;
    updateLabel("This is x:" + anX)
}

public void process()
{
    while(true)
    {
        int anX = getX();
        setX(anX + 1);
    }
}

Вы должны действительно постараться свести к минимуму использование статики, насколько это возможно. Они склонны поощрять «Глобальные переменные»

1 голос
/ 18 июля 2010

Вы должны дать своему классу правильное имя (не Class1), чтобы ваше намерение стало ясным. Может быть, вы хотите иметь счетчик?:

package so3274211;

import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

public class Counter {
  private int value = 0;
  private final List<Listener> listeners = new CopyOnWriteArrayList<Listener>();

  private void fireAfterValueChanged() {
    for (Listener listener : listeners) {
      listener.afterValueChanged(this);
    }
  }

  public int getValue() {
    return value;
  }

  public void increment() {
    value++;
    fireAfterValueChanged();
  }

  public void addListener(Listener listener) {
    listeners.add(listener);
  }

  public void removeListener(Listener listener) {
    listeners.remove(listener);
  }

  public interface Listener {
    void afterValueChanged(Counter counter);
  }

}

В обычном коде Java вы не можете напрямую слушать переменную. Но если вы поместите эту переменную в простой объект с надлежащими методами модификации (в данном случае increase()), вы можете вызвать слушателей из этого метода.

Чтобы вызвать слушателя, нужно как-то его зарегистрировать. Обычно это реализуется с помощью простого List<Listener>, и интерфейс к нему состоит из двух методов addListener(Listener) и removeListener(Listener). Вы можете найти эту модель везде в AWT и Swing.

Я определил интерфейс Listener внутри класса Counter, потому что этот интерфейс не имеет большого значения вне этого класса, и я не хотел его называть CounterListener. Таким образом, будет меньше .java файлов, летающих вокруг.

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

package so3274211;

public class Main {

  public static void main(String[] args) {
    Counter c = new Counter();
    c.increment();
    c.addListener(new Counter.Listener() {
      @Override
      public void afterValueChanged(Counter counter) {
        System.out.println(counter.getValue());
      }
    });
    c.increment();
  }

}

Сначала я создал счетчик, а затем добавил к нему слушателя. Выражение new Counter.Listener() { ... } является определением анонимного класса, которое также часто встречается в программировании на Java.

Так что, если вы серьезно относитесь к программированию GUI, вам необходимо изучить эти концепции и методы реализации (инкапсуляция переменной в классе, добавление кода слушателя, определение слушателя, вызов слушателя из кода, который изменяет переменную).

1 голос
/ 18 июля 2010

Сама Java не поддерживает привязку как функцию языка.

JavaFX поддерживает, и, конечно, очень гладко взаимодействует с кодом Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...