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/

2番目のリンクでは、「これ」の使用法を解読できません:誰でも説明できますか:

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);

もう1つの混乱は次のとおりです 。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)throwsjava.util.TooManyListenersExceptionシリアルイベントをリッスンするSerialPortEventListenerオブジェクトを登録します。特定のイベントへの関心は、notifyOnXXX呼び出しを使用して表すことができます。SerialPortEventListenerのserialEventメソッドは、イベントを説明するSerialEventオブジェクトを使用して呼び出されます。

上記のコードでaddEventListenerへのパラメーターとして「SerialPortEventListenerlsnr」を渡す方法として、これの使用法を知りたいです。

ありがとう

4

3 に答える 3

1

thisキーワードは、コードが実行されている現在のインスタンスへの参照です。したがって、thisは参照であるため、他の参照として使用できます。それで問題ありません。

それでは、使用法を見てみましょう:-

new Communicator(this);

このステートメントはGUIクラスのメソッド内で使用されるため、thisinstance of GUI、現在コードを実行しているを参照します。これで、コンストラクターに渡すことで、現在のインスタンスの参照をコンストラクターに渡すだけです。そして、Communicatorコンストラクターは型の参照を取るので、それは非常に有効ですGUI:-

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

それでは、次のステートメントに進みましょう。

serialPort.addEventListener(this);

ここでは、によって参照されるをに登録していserialPortます。これは、を実装するクラス--内で使用されるため、基本的にはインスタンスに登録します。これは、に他なりません。つまり、あなたはそのイベントに登録しています。EventListenerthisCommunicatorSerialPortEventListenerCommunicatorSerialPortEventListener

他のコードに関する限り:

serialPort.addEventListener(new SerialReader(in));

ここでは、クラス内にいないため、instanceの代わりにnewを使用しました。したがって、インスタンスへの参照がないため、そのクラスのオブジェクトを手動で作成する必要があります。thisSerialReaderthisSerialReader

したがって、違いはありません。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存在します。2番目のケースthisはのインスタンスでGUIあるため、パラメータとして、に渡すことができます。これは、それがCommunicator受け入れるものです。

のコンストラクター内ではCommunicator、2つのものが同じ名前で存在し、同じスコープで使用されるため、実行していることを明確にする必要があります。そして、私たちは「外国のwindowものを私たちの地元の、知られている、所有されているものに割り当てる」と言うことによってそれを行いますwindow

たくさんのジョンがいる人々のグループを考えてみてください。あなたは単にその名前を叫んでいます。誰が応答するように見えますか?あなたが指摘した場合、または他の指標があった場合はどうなりますか?thisその指標であり、何かを別のものと区別するために必要な特異性を与えます。

それ以外の場合は、に割り当てようとすることの混乱を想像してwindowくださいwindow。ローカルバージョンをローカルバージョンに、パラメーターをパラメーターに、パラメーターをローカルバージョンに、またはローカルバージョンをパラメーターに割り当てるという意味ですか?

于 2013-02-11T16:14:34.750 に答える