从Java中的事件中访问全局对象

时间:2022-09-25 12:24:19

My Java experience is minimal, and I can't seem to find anything that explains to me how to solve my problem; I've been trying different things for hours.

我的Java经验很少,我似乎无法找到任何解释我如何解决问题的东西;几个小时我一直在尝试不同的事情。

I'm using the Phidgets RFID Java library (http://www.phidgets.com/programming_resources.php) and JLayer, with the aim of playing different mp3 files depending on which RFID tag is within range of the sensor. Playing needs to stop as soon as the RFID tag is no longer in range.

我正在使用Phidg​​ets RFID Java库(http://www.phidgets.com/programming_resources.php)和JLayer,目的是根据传感器范围内的哪个RFID标签播放不同的mp3文件。一旦RFID标签不再在范围内,播放就需要停止。

The mp3 class:

mp3类:

// Import the JLayer classes
import javazoom.jl.player.*;

// Import the Java classes
import java.io.*;

public class mp3 {

    private Player player;
    private InputStream is;

    /** Creates a new instance of MP3Player */
    public mp3() 
    {
        //
    }

    public void play( String filename )
    {
        try
        {
            // Create an InputStream to the file
            is = new FileInputStream( filename );
        }
        catch( Exception e )
        {
            e.printStackTrace();
        }

        try
        {
            player = new Player( is );
            PlayerThread pt = new PlayerThread();
            pt.start();
        }
        catch( Exception e )
        {
            e.printStackTrace();
        }
    }

    public void stop()
    {
        player.close();
    }

    class PlayerThread extends Thread
    {
        public void run()
        {
            try
            {
                player.play();
            }
            catch( Exception e )
            {
                e.printStackTrace();
            }
        }
    }
}

And class where everything else happens:

和其他一切发生的课程:

import com.phidgets.*;
import com.phidgets.event.*;

public class ParrotDJ
{        

    public static final void main(String args[]) throws Exception {

            RFIDPhidget rfid;

            mp3 song = new mp3();

    System.out.println(Phidget.getLibraryVersion());

    rfid = new RFIDPhidget();
    rfid.addAttachListener(new AttachListener() {
        public void attached(AttachEvent ae)
        {
            try
            {
                ((RFIDPhidget)ae.getSource()).setAntennaOn(true);
                ((RFIDPhidget)ae.getSource()).setLEDOn(true);
            }
            catch (PhidgetException ex) { }
            System.out.println("attachment of " + ae);
        }
    });
    rfid.addDetachListener(new DetachListener() {
        public void detached(DetachEvent ae) {
            System.out.println("detachment of " + ae);
        }
    });
    rfid.addErrorListener(new ErrorListener() {
        public void error(ErrorEvent ee) {
            System.out.println("error event for " + ee);
        }
    });

    rfid.addTagGainListener(new TagGainListener()
    {

        public void tagGained(TagGainEvent oe)
        {
            //System.out.println(oe);
                            if(oe.getValue().equals("0107ee6ed5") || oe.getValue().equals("0107ee75d5"))
                            {
                                System.out.println("Amanda Palmer - Leeds United");
                                song.play("leedsunited.mp3");

                            }else if(oe.getValue().equals("0107ee82c7") || oe.getValue().equals("0107ee89f0"))
                            {
                                System.out.println("Paolo Nutini - 10/10");
                                song.play("1010.mp3");

                            }else if(oe.getValue().equals("0107ee8644") || oe.getValue().equals("0107ee6ff2"))
                            {
                                System.out.println("Mozart - Eine Kleine Nachtmusik");
                                song.play("einekleinenachtmusik.mp3");
                            }
        }

    });
    rfid.addTagLossListener(new TagLossListener()
    {
        public void tagLost(TagLossEvent oe)
        {
            //System.out.println(oe);
                            System.out.println("Stop");
                            song.stop();

        }
    });
    rfid.addOutputChangeListener(new OutputChangeListener()
    {
        public void outputChanged(OutputChangeEvent oe)
        {
            System.out.println(oe);
        }
    });

    rfid.openAny();
    System.out.println("waiting for RFID attachment...");
    rfid.waitForAttachment(1000);

    System.out.println("Serial: " + rfid.getSerialNumber());
    System.out.println("Outputs: " + rfid.getOutputCount());

    System.out.println("Outputting events.  Input to stop.");
    System.in.read();
    System.out.print("closing...");
    rfid.close();
    rfid = null;
    System.out.println(" ok");
    if (false) {
        System.out.println("wait for finalization...");
        System.gc();
    }
}
}

I imagine there's a logical solution, I'm just struggling to get my head around event-driven stuff, and Java's object orientation. I looked up builder patterns, but I can't grasp how to apply that to this situation right now.

我想这是一个合乎逻辑的解决方案,我只是在努力让我的头脑能够解决事件驱动的问题,以及Java的面向对象。我查找了构建器模式,但我现在无法掌握如何将其应用于这种情况。

Thanks in advance.

提前致谢。

2 个解决方案

#1


0  

I am not sure if the specific question is clear except as per the summary. But based on my guess, it looks like you are having issues accessing the object defined in the class within inner class methods. The main issue is the fields not being "final" cannot be accessed as Java does not know the state of the field. If the fields were made final, you should be able to access the outer class fields in event methods

除了摘要之外,我不确定具体问题是否清楚。但根据我的猜测,看起来你在访问内部类方法中类中定义的对象时遇到了问题。主要问题是不能访问“最终”的字段,因为Java不知道该字段的状态。如果字段是最终的,您应该能够访问事件方法中的外部类字段

#2


0  

If you want to access a local variable from whitin a method of an anonymous class as the one in here:

如果要从匿名类的方法中访问本地变量,请执行以下操作:

  rfid.addTagGainListener(new TagGainListener() {

            public void tagGained(TagGainEvent oe) {

where new TagGainListener() {} creates an anonymous class.

新的TagGainListener(){}创建一个匿名类。

You'll need to declare that variable final, and you won't have any problem as long as you don't want to modify it. So the modified code would be:

您需要声明该变量final,并且只要您不想修改它就不会有任何问题。所以修改后的代码将是:

import com.phidgets.*;
import com.phidgets.event.*;

public class ParrotDJ {

    public static final void main(String args[]) throws Exception {

        RFIDPhidget rfid;

        //  you need to make it final to access to it from anonymous classes as there rfid.addTagGainListener(new TagGainListener() {
        final mp3 song = new mp3();

        System.out.println(Phidget.getLibraryVersion());

        rfid = new RFIDPhidget();

        rfid.addAttachListener(new AttachListener() {
            public void attached(AttachEvent ae) {
                try {
                    ((RFIDPhidget) ae.getSource()).setAntennaOn(true);
                    ((RFIDPhidget) ae.getSource()).setLEDOn(true);
                } catch (PhidgetException ex) {
                }
                System.out.println("attachment of " + ae);
            }
        });

        rfid.addDetachListener(new DetachListener() {
            public void detached(DetachEvent ae) {
                System.out.println("detachment of " + ae);
            }
        });

        rfid.addErrorListener(new ErrorListener() {
            public void error(ErrorEvent ee) {
                System.out.println("error event for " + ee);
            }
        });

        rfid.addTagGainListener(new TagGainListener() {

            public void tagGained(TagGainEvent oe) {
                //System.out.println(oe);
                if (oe.getValue().equals("0107ee6ed5") || oe.getValue().equals("0107ee75d5")) {
                    System.out.println("Amanda Palmer - Leeds United");
                    song.play("leedsunited.mp3");

                } else if (oe.getValue().equals("0107ee82c7") || oe.getValue().equals("0107ee89f0")) {
                    System.out.println("Paolo Nutini - 10/10");
                    song.play("1010.mp3");

                } else if (oe.getValue().equals("0107ee8644") || oe.getValue().equals("0107ee6ff2")) {
                    System.out.println("Mozart - Eine Kleine Nachtmusik");
                    song.play("einekleinenachtmusik.mp3");
                }
            }

        });
        rfid.addTagLossListener(new TagLossListener() {
            public void tagLost(TagLossEvent oe) {
                //System.out.println(oe);
                System.out.println("Stop");
                song.stop();

            }
        });
        rfid.addOutputChangeListener(new OutputChangeListener() {
            public void outputChanged(OutputChangeEvent oe) {
                System.out.println(oe);
            }
        });

        rfid.openAny();
        System.out.println("waiting for RFID attachment...");
        rfid.waitForAttachment(1000);

        System.out.println("Serial: " + rfid.getSerialNumber());
        System.out.println("Outputs: " + rfid.getOutputCount());

        System.out.println("Outputting events.  Input to stop.");
        System.in.read();
        System.out.print("closing...");
        rfid.close();
        rfid = null;
        System.out.println(" ok");
        if (false) {
            System.out.println("wait for finalization...");
            System.gc();
        }
    }
}

#1


0  

I am not sure if the specific question is clear except as per the summary. But based on my guess, it looks like you are having issues accessing the object defined in the class within inner class methods. The main issue is the fields not being "final" cannot be accessed as Java does not know the state of the field. If the fields were made final, you should be able to access the outer class fields in event methods

除了摘要之外,我不确定具体问题是否清楚。但根据我的猜测,看起来你在访问内部类方法中类中定义的对象时遇到了问题。主要问题是不能访问“最终”的字段,因为Java不知道该字段的状态。如果字段是最终的,您应该能够访问事件方法中的外部类字段

#2


0  

If you want to access a local variable from whitin a method of an anonymous class as the one in here:

如果要从匿名类的方法中访问本地变量,请执行以下操作:

  rfid.addTagGainListener(new TagGainListener() {

            public void tagGained(TagGainEvent oe) {

where new TagGainListener() {} creates an anonymous class.

新的TagGainListener(){}创建一个匿名类。

You'll need to declare that variable final, and you won't have any problem as long as you don't want to modify it. So the modified code would be:

您需要声明该变量final,并且只要您不想修改它就不会有任何问题。所以修改后的代码将是:

import com.phidgets.*;
import com.phidgets.event.*;

public class ParrotDJ {

    public static final void main(String args[]) throws Exception {

        RFIDPhidget rfid;

        //  you need to make it final to access to it from anonymous classes as there rfid.addTagGainListener(new TagGainListener() {
        final mp3 song = new mp3();

        System.out.println(Phidget.getLibraryVersion());

        rfid = new RFIDPhidget();

        rfid.addAttachListener(new AttachListener() {
            public void attached(AttachEvent ae) {
                try {
                    ((RFIDPhidget) ae.getSource()).setAntennaOn(true);
                    ((RFIDPhidget) ae.getSource()).setLEDOn(true);
                } catch (PhidgetException ex) {
                }
                System.out.println("attachment of " + ae);
            }
        });

        rfid.addDetachListener(new DetachListener() {
            public void detached(DetachEvent ae) {
                System.out.println("detachment of " + ae);
            }
        });

        rfid.addErrorListener(new ErrorListener() {
            public void error(ErrorEvent ee) {
                System.out.println("error event for " + ee);
            }
        });

        rfid.addTagGainListener(new TagGainListener() {

            public void tagGained(TagGainEvent oe) {
                //System.out.println(oe);
                if (oe.getValue().equals("0107ee6ed5") || oe.getValue().equals("0107ee75d5")) {
                    System.out.println("Amanda Palmer - Leeds United");
                    song.play("leedsunited.mp3");

                } else if (oe.getValue().equals("0107ee82c7") || oe.getValue().equals("0107ee89f0")) {
                    System.out.println("Paolo Nutini - 10/10");
                    song.play("1010.mp3");

                } else if (oe.getValue().equals("0107ee8644") || oe.getValue().equals("0107ee6ff2")) {
                    System.out.println("Mozart - Eine Kleine Nachtmusik");
                    song.play("einekleinenachtmusik.mp3");
                }
            }

        });
        rfid.addTagLossListener(new TagLossListener() {
            public void tagLost(TagLossEvent oe) {
                //System.out.println(oe);
                System.out.println("Stop");
                song.stop();

            }
        });
        rfid.addOutputChangeListener(new OutputChangeListener() {
            public void outputChanged(OutputChangeEvent oe) {
                System.out.println(oe);
            }
        });

        rfid.openAny();
        System.out.println("waiting for RFID attachment...");
        rfid.waitForAttachment(1000);

        System.out.println("Serial: " + rfid.getSerialNumber());
        System.out.println("Outputs: " + rfid.getOutputCount());

        System.out.println("Outputting events.  Input to stop.");
        System.in.read();
        System.out.print("closing...");
        rfid.close();
        rfid = null;
        System.out.println(" ok");
        if (false) {
            System.out.println("wait for finalization...");
            System.gc();
        }
    }
}