0

私のJavaの経験は最小限であり、問​​題を解決する方法を説明するものが見つからないようです。私は何時間もさまざまなことを試みてきました。

私はPhidg​​etsRFIDJavaライブラリ(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のオブジェクト指向に頭を悩ませているだけです。ビルダーパターンを調べましたが、今のところ、この状況にどのように適用するかがわかりません。

前もって感謝します。

4

2 に答える 2

0

要約による場合を除いて、特定の質問が明確であるかどうかはわかりません。しかし、私の推測によると、内部クラスメソッド内のクラスで定義されたオブジェクトへのアクセスに問題があるようです。主な問題は、Javaがフィールドの状態を認識していないため、「最終」ではないフィールドにアクセスできないことです。フィールドがfinalになっている場合は、イベントメソッドで外部クラスのフィールドにアクセスできるはずです。

于 2011-07-17T23:12:28.150 に答える
0

whitinからローカル変数にアクセスする場合は、ここにあるような匿名クラスのメソッドを使用します。

  rfid.addTagGainListener(new TagGainListener() {

            public void tagGained(TagGainEvent oe) {

ここで、new 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();
        }
    }
}
于 2011-07-18T00:51:01.127 に答える