-1

したがって、私のプログラムは 2 つのクラスで構成されます。 1. JFrame を拡張する GUI を処理するメイン クラス。2. API を使用してサーバーから要求されたデータを要求および処理する MyClass には、さらに要求を処理する API クラスのインスタンスが必要です。(実行可能なクラスであり、API からラッパーを実装します)

したがって、メインクラス内で (Runnable Processor = new MyClass()) のように MyClass を単純にインスタンス化し、それを使用してスレッドを作成し、実行するとします。MyClass または API クラス メソッドのメソッドにアクセスできません (接続キラー メソッドに特に関心があります)。Processor.API.eDisconnect() のようにアクセスしようとしています。それはうまくいきません。

MyClass の Arraylist を作成し、MyClass のインスタンスをリストに追加します。Thread myThread = new Thread(List.get(0)) のようなスレッドを作成します。List.get(0).API.eDisconnect() のような API クラスのメソッドにアクセスできます。

では、なぜ 2 番目の方法が機能するのでしょうか。クラスインスタンスが独立変数であるか、リストにあるという唯一の違い。

どのような問題が発生する可能性がありますか? それを行うより良い方法はありますか?

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package basket;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;

/**
 *
 * @author ivan
 */
public class Basket extends JFrame implements ActionListener{
    protected List<TwsHandler> TWS = new ArrayList<>();
    public static void main(String[] args) 
    {
       Basket main = new Basket();
       main.Launch();
    }
    public void Launch()
    {
        TWS.add(new TwsHandler());
        BorderLayout MainLayout = new BorderLayout();
        JButton Start = new JButton("Start");
        Start.addActionListener(this);
        Start.setActionCommand("Start");
        JButton Stop = new JButton("Stop");
        Stop.addActionListener(this);
        Stop.setActionCommand("Stop");
        this.setLayout(MainLayout);
        this.add(Start , BorderLayout.SOUTH);
        this.add(Stop , BorderLayout.WEST);
        this.addWindowListener(new WindowAdapter()
        {
            @Override
            public void windowClosing(WindowEvent e){System.exit(0);}
        });
        this.setTitle("Option basket robot");
        this.setBounds(100, 100, 800, 600);
        this.setVisible(true);

    }
    @Override
    public void actionPerformed(ActionEvent e) 
    {
        switch (e.getActionCommand()) {
            case "Start":
                Thread Processor = new Thread(TWS.get(0));
                Processor.start();
                break;
            case "Stop":
                System.out.println(TWS.get(0).Eclient.isConnected());
                break;

        }
    }
}
4

1 に答える 1

1

唯一の違いは、最初のケースではMyClassインスタンスを として参照しているRunnableのに対し、2 番目のケースでは(目的を果たさない をMyClass介して) として参照していることです。ArrayList

それ以外の

Runnable processor = new MyClass();

使用する

MyClass processor = new MyClass();

MyClassメソッドを呼び出せるようにしたいからです。

于 2012-11-29T17:41:09.460 に答える