【问题标题】:Accessing global objects from within events in Java [closed]从 Java 中的事件中访问全局对象 [关闭]
【发布时间】:2011-07-17 22:03:26
【问题描述】:

我的 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 的面向对象。我查找了构建器模式,但我现在无法掌握如何将其应用于这种情况。

提前致谢。

【问题讨论】:

  • 请提出更具体的问题

标签: java jlayer


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    如果你想通过匿名类的方法访问局部变量,就像这里的方法:

      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,这正是我所需要的,并且完全解决了我的问题 :)
    猜你喜欢
    • 2019-08-19
    • 1970-01-01
    • 2016-07-25
    • 1970-01-01
    • 2016-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多