Search code examples
javajlayer

Accessing global objects from within events in Java


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.

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.

The mp3 class:

// 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.

Thanks in advance.


Solution

  • 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