代码之家  ›  专栏  ›  技术社区  ›  Adam Outler

java中的字符串或整数变量侦听器?

  •  4
  • Adam Outler  · 技术社区  · 14 年前

    我一直在寻找信息,但什么也找不到。我需要一个变量侦听器。下面是我想做的:

    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 回复  |  直到 14 年前
        1
  •  2
  •   Romain Hippeau    14 年前

    在Java中,没有特定于语言的方法让侦听器处理变量。您需要做的是,当代码更改变量时,让它同时更新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);
        }
    }
    

        2
  •  3
  •   wizztjh    14 年前
        3
  •  1
  •   erickson    14 年前

    Java本身不支持将绑定作为一种语言特性。

    JavaFX确实如此,当然,它与Java代码的接口非常流畅。

        4
  •  1
  •   Roland Illig    14 年前

    你应该给你的班级起一个恰当的名字(而不是 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);
      }
    
    }
    

    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() { ... } 是一个匿名类定义,它也经常出现在javagui编程中。

    因此,如果您对GUI编程很认真,那么无论如何都需要学习这些概念和实现技术(在类中封装变量、添加侦听器代码、定义侦听器、从修改变量的代码调用侦听器)。