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

时间:2011-07-17 22:03:26

标签: java jlayer

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

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

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

其他一切发生的课程:

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

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

提前致谢。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

如果你想从匿名类的方法中访问本地变量,就像在这里一样:

  rfid.addTagGainListener(new TagGainListener() {

            public void tagGained(TagGainEvent oe) {

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

你需要声明变量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();
        }
    }
}