0

我已经启动了 JAVA 并使用 RxTx 进行串行通信。

参考: http: //rxtx.qbang.org/wiki/index.php/Event_based_two_way_Communication http://henrypoon.wordpress.com/2011/01/01/serial-communication-in-java-with-example-program/

在第二个链接中,我无法破译“this”的用法:谁能解释一下:

Communicator.java

public class Communicator implements SerialPortEventListener
{
  GUI window = null;
   ..
   ..
 public Communicator(GUI window)
    {
        this.window = window;
    }

...
..
}

在 GUI.java 中

public class GUI extends javax.swing.JFrame {
Communicator communicator = null;
Communicator communicator = null;
    //KeybindingController object
    KeybindingController keybindingController = null;

    /** Creates new form GUI */
    public GUI() {
        initComponents();
        createObjects();
        communicator.searchForPorts();
        keybindingController.toggleControls();
        keybindingController.bindKeys();
    }

    private void createObjects()
    {
        **communicator = new Communicator(this);**
        keybindingController = new KeybindingController(this);
    }
...
..}

我很困惑如何使用它来创建 Communicator 类的对象,如上面的代码中突出显示的那样(出现communicator = new Communicator(this);

另一个困惑是: Communicator.java

public class Communicator implements SerialPortEventListener
{ 
...
...
 public void connect()
    {
        String selectedPort = (String)window.cboxPorts.getSelectedItem();
        selectedPortIdentifier = (CommPortIdentifier)portMap.get(selectedPort);

        CommPort commPort = null;

        try
        {
            //the method below returns an object of type CommPort
            commPort = selectedPortIdentifier.open("TigerControlPanel", TIMEOUT);
            //the CommPort object can be casted to a SerialPort object
            serialPort = (SerialPort)commPort;
....
...}


 public void initListener()
    {
        try
        {
            **serialPort.addEventListener(this);**
            serialPort.notifyOnDataAvailable(true);
        }
        catch (TooManyListenersException e)
        {
            logText = "Too many listeners. (" + e.toString() + ")";
            window.txtLog.setForeground(Color.red);
            window.txtLog.append(logText + "\n");
        }
    }
....
}

我再次对这里使用“this”感到困惑(serialPort.addEventListener(this);

我与 http://rxtx.qbang.org/wiki/index.php/Event_based_two_way_Communication上的代码进行了比较

它在那里暗示

...
InputStream in = serialPort.getInputStream();
**serialPort.addEventListener(new SerialReader(in));**
...

 public static class SerialReader implements SerialPortEventListener 
    {
        private InputStream in;
        private byte[] buffer = new byte[1024];

        public SerialReader ( InputStream in )
        {
            this.in = in;
        }

        public void serialEvent(**SerialPortEvent arg0**) {
            int data;

            try
            {
                int len = 0;
                while ( ( data = in.read()) > -1 )
                {
                    if ( data == '\n' ) {
                        break;
                    }
                    buffer[len++] = (byte) data;
                }
                System.out.print(new String(buffer,0,len));
            }
            catch ( IOException e )
            {
                e.printStackTrace();
                System.exit(-1);
            }             
        }

    }

addEventListener 的描述 http://docs.oracle.com/cd/E17802_01/products/products/javacomm/reference/api/

添加事件监听器

public abstract void addEventListener(SerialPortEventListener lsnr) throws java.util.TooManyListenersException 注册一个 SerialPortEventListener 对象以侦听 SerialEvents。可以使用 notifyOnXXX 调用来表达对特定事件的兴趣。将使用描述事件的 SerialEvent 对象调用 SerialPortEventListener 的 serialEvent 方法。

我想知道它的用法,因为它是如何将“SerialPortEventListener lsnr”作为参数传递给上述代码中的 addEventListener 的。

谢谢

4

3 回答 3

1

this关键字是对正在执行代码的当前实例的引用。因此,既然this是参考,您可以将其用作任何其他参考。没有问题。

现在让我们看一下您的用法:-

new Communicator(this);

由于这个语句是在类的方法内部使用的GUI,所以,this指的是instance of GUI当前正在执行的代码。现在,通过将它传递给构造函数,您只是将当前实例的引用传递给它。这是非常有效的,因为Communicator构造函数采用类型的引用GUI:-

public Communicator(GUI window)
{
    this.window = window;
}

现在让我们继续下一条语句:

serialPort.addEventListener(this);

在这里,您正在向.引用serialPort的. 因为,这是在类 - 中使用的,它实现了,所以基本上你正在注册一个实例,它只不过是一个. 因此,您正在注册该活动。EventListenerthisCommunicatorSerialPortEventListenerCommunicatorSerialPortEventListener

就您的其他代码而言:

serialPort.addEventListener(new SerialReader(in));

在这里,您刚刚使用了 newinstance而不是this,因为您不在SerialReader课堂上。因此,您没有this对任何SerialReader实例的引用,因此您需要手动创建该类的对象。

所以,没有区别。因为,在任何情况下,您都在注册SerialPortEventListener只实现的类。

于 2013-02-11T16:22:14.550 回答
0

this是一个伪变量,意思是“调用此方法的对象”(或在构造函数中:“当前正在构造的对象”)。我不知道您发布的代码有什么问题,因为它包含许多显然与问题无关的代码,我不会开始猜测您的问题到底出在哪里。

于 2013-02-11T16:14:18.197 回答
0

这里有很多要消化的东西来回答你原来的问题,我不确定这一切都相关,但让我们具体解决这个问题。以下代码演示了使用this来消除当前范围内的歧义:

public Communicator(GUI window)
{
    this.window = window;
}

this表示当前类的当前实例。因此,在您的第一个混淆实例中,this是一个实例,Communicator因此this.window存在。在第二种情况下this是 的一个实例GUI,因此可以作为参数传递给Communicator,因为这是它接受的。

在 for 的构造函数中Communicator,因为存在两个具有相同名称的事物,并且要在相同的范围内使用,所以我们需要明确我们正在做的事情。我们通过说“将外国window事物分配给我们当地的、已知的、拥有window的事物”来做到这一点。

想想一群人,有无数个约翰,而你只是喊着那个名字。谁会期待回应?如果你指了指点,或者有一些其他指标,比如当他们都看的时候,约翰认出了你,该怎么办?this是那个指标,给出了使某物与众不同所需的特异性。

否则想象一下尝试分配window到的混乱window。我们是指将本地版本分配给本地版本,将参数分配给参数,将参数分配给本地版本,还是将本地版本分配给参数?

于 2013-02-11T16:14:34.750 回答