2010-07-18 3 views
4

Во-первых, я довольно новичок в java, и я просто смотрю, чтобы узнать, как статические классы могут взаимодействовать с нестационарными классами и как получить статический класс для обновления текстового поля.String или Integer переменной Listener в 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) } 
} 

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

ответ

2

В 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); 
    } 
} 

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

+0

Мои процессы до сих пор требовали статической обработки. Я определил 200 статических переменных и 15 статических классов, которые есть только один экземпляр. Несколько экземпляров будут забивать вещи. В принципе, это приложение для последовательной связи. Я ценю помощь. –

+2

@ Adam Outler Я написал программное обеспечение для последовательной связи без этого множества статических переменных. Похоже, вы просто пишете процедурный код, это будет сложно, когда ваша программа станет большой. Принципы OO - отличный способ инкапсулировать и скрывать информацию из других частей программы. –

+0

Скорее всего, вы снова и снова работали с одной и той же информацией. Мое приложение собирает данные, которые используются для работы нескольких систем. RPM, время, температуры, скорости потока, уровни насыщения, каждая из которых является отдельной статической переменной, и важна только самая последняя информация. –

1

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

JavaFX действительно, и он очень хорошо взаимодействует с Java-кодом.

0

Вы должны дать своему классу свое имя (не 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.

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

+0

ничего себе .. это слишком много информации для меня, чтобы обрабатывать. Я не могу видеть форрест через деревья. У меня была простая проблема, и я написал очень простой пример, чтобы показать простую проблему. –

+0

@ Adam Outler - К сожалению, это довольно обычный подход для привязки к Java. Часто вместо того, чтобы объявлять свой собственный тип слушателя и писать свой собственный компонент, вы будете использовать предварительно определенные типы из JDK. Но они работают в основном таким образом. Я собирался написать что-то подобное в своем ответе, но у меня не было энергии. Вот почему я рекомендовал интерфейс JavaFX, где привязка - это то, что вы написали в своем вопросе. – erickson

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