我已经启动了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/
的addEventListener
public abstract void addEventListener(SerialPortEventListener lsnr) 抛出java.util.TooManyListenersException 注册SerialPortEventListener对象以侦听SerialEvents。可以使用notifyOnXXX调用表示对特定事件的兴趣。将使用描述事件的SerialEvent对象调用SerialPortEventListener的serialEvent方法。
我想知道如何使用它作为传递'SerialPortEventListener lsnr'作为上述代码中addEventListener的参数。
由于
答案 0 :(得分:1)
this
关键字是对正在执行代码的当前实例的引用。因此,由于this
是引用,因此您可以将其用作任何其他引用。没问题。
现在让我们来看看你的用法: -
new Communicator(this);
由于此语句在GUI
类的方法中使用,因此,this
引用当前正在执行代码的instance of GUI
。现在,通过将它传递给构造函数,您只需将当前实例的引用传递给它。并且它非常有效,因为Communicator
构造函数采用GUI
类型的引用: -
public Communicator(GUI window)
{
this.window = window;
}
现在让我们继续下一个声明:
serialPort.addEventListener(this);
在这里,您正在为serialPort
注册一个由EventListener
引用的this
。因为,这是在类Communicator
中使用的,它实现了SerialPortEventListener
,所以基本上你正在注册Communicator
实例,这只是SerialPortEventListener
。所以,你正在注册那个活动。
就您的其他代码而言:
serialPort.addEventListener(new SerialReader(in));
在这里,您刚刚使用了新的instance
而不是this
,因为您不在SerialReader
课程内。因此,您没有this
对任何SerialReader
实例的引用,因此您需要手动创建该类的对象。
所以,没有区别。因为,无论如何,您正在注册仅实现SerialPortEventListener
的类。
答案 1 :(得分:0)
this
是一个伪变量,意思是“调用此方法的对象”(或在构造函数中:'当前正在构造的对象')。我不知道你发布的代码有什么问题,因为它包含了许多明显与问题无关的代码,我不会开始猜测你的问题究竟在哪里。
答案 2 :(得分:0)
这里有很多消化要回答你原来的问题,我不确定这一切是否有关,但我们要特别解决这个问题。以下代码演示了如何使用this
来消除当前范围中的歧义:
public Communicator(GUI window)
{
this.window = window;
}
this
表示当前类的当前实例。因此,在您遇到混淆的第一个实例中,this
是Communicator
的实例,因此存在this.window
。在第二种情况下,this
是GUI
的一个实例,因此可以作为参数传递给Communicator
,因为它是它接受的内容。
在Communicator
的构造函数中,由于存在两个具有相同名称的东西,并且要在同一范围内使用,我们需要消除我们正在做的事情的歧义。我们这样说是“将外国window
事物分配给我们当地的,已知的,拥有的window
事物。”
想想一群拥有众多约翰的人,你只需喊出这个名字。谁会回应?如果你指出了什么,或者还有其他一些指标,比如右边的John会在他们看起来什么时候认出你? this
就是那个指标,它具有制造与另一个不同所需的特殊性。
否则想象一下试图将window
分配给window
的困惑。我们是指将本地版本分配给本地版本,参数的参数,本地版本的参数或参数的本地版本?