从Java中的事件中访问全局对象
我的Java经验很少,我似乎找不到任何东西来解释如何解决我的问题;我已经试了好几个小时了 我正在使用Phidgets RFID Java库(http://www.phidgets.com/programming_resources.php)和JLayer,其目的是根据传感器范围内的RFID标签播放不同的mp3文件。一旦RFID标签不在范围内,游戏需要停止 mp3类:从Java中的事件中访问全局对象,java,jlayer,Java,Jlayer,我的Java经验很少,我似乎找不到任何东西来解释如何解决我的问题;我已经试了好几个小时了 我正在使用Phidgets RFID Java库(http://www.phidgets.com/programming_resources.php)和JLayer,其目的是根据传感器范围内的RFID标签播放不同的mp3文件。一旦RFID标签不在范围内,游戏需要停止 mp3类: // Import the JLayer classes import javazoom.jl.player.*; // Imp
// 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的面向对象。我查阅了构建器模式,但我现在不知道如何将其应用于这种情况
提前谢谢。我不确定具体问题是否清楚,除非根据总结。但根据我的猜测,似乎在访问内部类方法中的类中定义的对象时遇到了问题。
主要问题是不能访问非“final”字段,因为Java不知道字段的状态。如果字段为最终字段,则如果要访问匿名类方法中的局部变量,则应能够访问事件方法中的外部类字段,如下所示:
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();
}
}
}
请提出更具体的问题谢谢jaime,这正是我所需要的,并且完全解决了我的问题:)