0

SwingWorker に ServerSocketChannel 接続プロセスがあります。Swing アプリケーション自体では、2 つの JLabel が (1) String (接続ステータス) と (2) int (接続されているクライアントの数) で更新される必要があります。以下は、「Detect Clients」JButton が接続プロセスを実行する前のアプリケーションのスクリーンショットです。ただし、EDT で複数の Swing コンポーネントを更新するために publish() と process() を行う方法がわかりません。これを達成する方法について誰かがガイダンスを持っていますか?

スクリーンショット

List<V>が process() のパラメータなので、 としてみ<Object>まし<V>た。ただし、これは文字列/整数からオブジェクトへの変換、およびその逆の問題に遭遇するようです。

以下のデモ コードは、更新を公開する必要があるいくつかのポイントを示しています。

protected Void doInBackground() {
    try {
       // Omitted: obtain selector
       ServerSocketChannel ssc = ServerSocketChannel.open() // could fail, may need
       // to publish status
       ssc.socket().bind(serverAddress); // could fail, may need to publish status
       ssc.configureBlocking(false); // could fail, may need to publish status
       // Omitted: register ssc
       while (true) {
           int count = sel.select(1000); // may need to publish for # of clients
           // Omitted: rest of processing     
       }
    } catch (IOException e) {
        //handle error
    } 
}
4

2 に答える 2

4

ああ、今私はあなたの問題を理解しています。2 つの異なる情報を公開しようとしています。メソッドに渡される List には複数のprocess()呼び出しの結果が含まれる可能性があるため、異なる型の値を渡すとメソッド内で混乱することに注意してください。代わりに、渡したいすべての状態をカプセル化する単純なオブジェクトを作成し、そのクラスのインスタンスを常に公開する必要があります (これにより、キャストの問題もすべて解決されます)。例えば: publish()process()

public class ChannelStatus {
  public final boolean active;
  public final int numClients;
}

次に、現在のクライアント数と「アクティブ」ステータスで ChannelStatus インスタンスを常に公開します。

于 2012-09-15T17:25:23.933 に答える
1

結果タイプとしてStringを使用できます。たとえば、整数(クライアントの数)の場合は、次のようpublish(String.valueOf(integer))にします。process()

try {
 int numClients = Integer.parseInt(passedString);
 //all well, it's the client number
} catch(NumberFormatException ex) {
 //not a number, must be a connection status
}

または、2つの情報を適切なゲッターを使用して別のクラスにラップし、setNumClients, setConnStatus進行中にデータを入力して、そのクラスのオブジェクトを公開します。

PropertyChangeListenersあなたがここに関与したいと思うかもしれない予感があるので、私があなたを正しく理解していないかどうか教えてください。

于 2012-09-15T16:45:15.697 に答える