检测整数的变化

发布于 2024-12-18 19:36:21 字数 3458 浏览 3 评论 0原文

有什么方法可以检测整数的变化吗?例如创建一个侦听器来侦听整数以检测其值及其变化。我知道这可以通过布尔值和一些技巧来实现,但我似乎无法将其适应 int 值。有谁知道如何做到这一点?我需要知道如何用 Java 语言执行此操作。下面是我在网上找到的允许布尔侦听器的代码。如何将其转换为整数侦听器?

import java.util.List;
import java.util.ArrayList;
import java.util.EventListener;
import java.util.EventObject;
import java.awt.EventQueue; 

//can u see this austin? can u see this i typed this at 9:33 my time
/**
 * This class uses the EventQueue to process its events, but you should only 
 * really do this if the changes you make have an impact on part of a GUI 
 * eg. adding a button to a JFrame.
 *
 * Otherwise, you should create your own event dispatch thread that can handle
 * change events
 */
public class test1 implements BooleanChangeDispatcher {

    public static void main(String[] args) {

        BooleanChangeListener listener = new BooleanChangeListener() { // add this to the class
            @Override
            public void stateChanged(BooleanChangeEvent event) {
                System.out.println("Detected change to: "
                    + event.getDispatcher().getFlag()
                    + " -- event: " + event);
            }
        };

        test1 test = new test1(false);
        test.addBooleanChangeListener(listener);

//        test.setFlag(false); // no change, no event dispatch
//        test.setFlag(true); // changed to true -- event dispatched

    }

    private boolean flag;
    private List<BooleanChangeListener> listeners;

    public test1(boolean initialFlagState) {
        flag = initialFlagState;
        listeners = new ArrayList<BooleanChangeListener>();
    }

    @Override   
    public void addBooleanChangeListener(BooleanChangeListener listener) {
        listeners.add(listener);
    }

    @Override
    public void setFlag(boolean flag) {
        if (this.flag != flag) {
            this.flag = flag;
            dispatchEvent();
        }
    }

    @Override
    public boolean getFlag() {
        return flag;
    }

    private void dispatchEvent() {
        final BooleanChangeEvent event = new BooleanChangeEvent(this);
        for (BooleanChangeListener l : listeners) {
            dispatchRunnableOnEventQueue(l, event);
        }
    }

    private void dispatchRunnableOnEventQueue(
                final BooleanChangeListener listener, 
                final BooleanChangeEvent event) {

        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                listener.stateChanged(event);
            }
        });
    }

}

interface BooleanChangeDispatcher {

    public void addBooleanChangeListener(BooleanChangeListener listener);
    public boolean getFlag();
    public void setFlag(boolean flag);

}

/**
 * Listener interface for classes interested in knowing about a boolean
 * flag change.
 */
interface BooleanChangeListener extends EventListener {

    public void stateChanged(BooleanChangeEvent event);

}

/** 
 * This class lets the listener know when the change occured and what 
 * object was changed.
 */
class BooleanChangeEvent extends EventObject {

    private final BooleanChangeDispatcher dispatcher;

    public BooleanChangeEvent(BooleanChangeDispatcher dispatcher) {
        super(dispatcher);
        this.dispatcher = dispatcher;
    }

    // type safe way to get source (as opposed to getSource of EventObject
    public BooleanChangeDispatcher getDispatcher() {
        return dispatcher;
    }
}

Is there any way to detect change in an integer? Such as creating a listener to listen to the integer to detect and change in value it has. I know this is possible with booleans with a few tricks but I cannot seem to adapt this to an int value. Does anyone have any idea how this could be done? I need to know how to do this in the Java language. Below is code that I found online that allows for a boolean listener. How can I convert this to an integer listener?

import java.util.List;
import java.util.ArrayList;
import java.util.EventListener;
import java.util.EventObject;
import java.awt.EventQueue; 

//can u see this austin? can u see this i typed this at 9:33 my time
/**
 * This class uses the EventQueue to process its events, but you should only 
 * really do this if the changes you make have an impact on part of a GUI 
 * eg. adding a button to a JFrame.
 *
 * Otherwise, you should create your own event dispatch thread that can handle
 * change events
 */
public class test1 implements BooleanChangeDispatcher {

    public static void main(String[] args) {

        BooleanChangeListener listener = new BooleanChangeListener() { // add this to the class
            @Override
            public void stateChanged(BooleanChangeEvent event) {
                System.out.println("Detected change to: "
                    + event.getDispatcher().getFlag()
                    + " -- event: " + event);
            }
        };

        test1 test = new test1(false);
        test.addBooleanChangeListener(listener);

//        test.setFlag(false); // no change, no event dispatch
//        test.setFlag(true); // changed to true -- event dispatched

    }

    private boolean flag;
    private List<BooleanChangeListener> listeners;

    public test1(boolean initialFlagState) {
        flag = initialFlagState;
        listeners = new ArrayList<BooleanChangeListener>();
    }

    @Override   
    public void addBooleanChangeListener(BooleanChangeListener listener) {
        listeners.add(listener);
    }

    @Override
    public void setFlag(boolean flag) {
        if (this.flag != flag) {
            this.flag = flag;
            dispatchEvent();
        }
    }

    @Override
    public boolean getFlag() {
        return flag;
    }

    private void dispatchEvent() {
        final BooleanChangeEvent event = new BooleanChangeEvent(this);
        for (BooleanChangeListener l : listeners) {
            dispatchRunnableOnEventQueue(l, event);
        }
    }

    private void dispatchRunnableOnEventQueue(
                final BooleanChangeListener listener, 
                final BooleanChangeEvent event) {

        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                listener.stateChanged(event);
            }
        });
    }

}

interface BooleanChangeDispatcher {

    public void addBooleanChangeListener(BooleanChangeListener listener);
    public boolean getFlag();
    public void setFlag(boolean flag);

}

/**
 * Listener interface for classes interested in knowing about a boolean
 * flag change.
 */
interface BooleanChangeListener extends EventListener {

    public void stateChanged(BooleanChangeEvent event);

}

/** 
 * This class lets the listener know when the change occured and what 
 * object was changed.
 */
class BooleanChangeEvent extends EventObject {

    private final BooleanChangeDispatcher dispatcher;

    public BooleanChangeEvent(BooleanChangeDispatcher dispatcher) {
        super(dispatcher);
        this.dispatcher = dispatcher;
    }

    // type safe way to get source (as opposed to getSource of EventObject
    public BooleanChangeDispatcher getDispatcher() {
        return dispatcher;
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

红颜悴 2024-12-25 19:36:21

我将创建一个能够注册侦听器的类。下面是一个模拟示例。它甚至可能按原样编译(假设您编写了相应的 VocalIntegerListener 接口存在并且以某种方式实现......这非常简单)。

class VocalInteger {

    private int value;
    private final Object lock = new Object();
    Set<VocalIntegerListener> listeners; // assume interface exists - it's easy


    public VocalInteger() {
        this(0);
    }

    public VocalInteger(int value) {
        this.value = value;
        listeners = new HashSet<VocalIntegerListener>();
    }

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        synchronized(lock) {
            int oldValue = this.value;
            this.value = value;
            for(VocalIntegerListener listener : listeners) {
                listener.fireChangedEvent(oldvalue, value); // assume exists
            }
        }
    }

    public void registerListener(VocalIntegerListener listener) {
        synchronized(lock) {
            listeners.add(listener);
        }
    }
}

I would create a class capable of registering listeners. Below is a mocked up example. It might even compile as is (assuming you write the corresponding VocalIntegerListener interface exists and is implemented somehow... it's pretty simple).

class VocalInteger {

    private int value;
    private final Object lock = new Object();
    Set<VocalIntegerListener> listeners; // assume interface exists - it's easy


    public VocalInteger() {
        this(0);
    }

    public VocalInteger(int value) {
        this.value = value;
        listeners = new HashSet<VocalIntegerListener>();
    }

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        synchronized(lock) {
            int oldValue = this.value;
            this.value = value;
            for(VocalIntegerListener listener : listeners) {
                listener.fireChangedEvent(oldvalue, value); // assume exists
            }
        }
    }

    public void registerListener(VocalIntegerListener listener) {
        synchronized(lock) {
            listeners.add(listener);
        }
    }
}
小兔几 2024-12-25 19:36:21

查看“Java Beans”和“绑定属性”,了解如何侦听属性更改事件的标准方法:

http://docs.oracle.com/javase/tutorial/javabeans/writing/properties.html

http://docs.oracle.com/javase/tutorial/javabeans/

Have a look at "Java Beans" and "bound properties" for the standard approach how to listen for property changed events:

http://docs.oracle.com/javase/tutorial/javabeans/writing/properties.html

http://docs.oracle.com/javase/tutorial/javabeans/

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文