[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends:00061] スレッドから、スレッド作成元クラスを参照する方法?



こんにちは。くろたろうです。
またわからないことが出来てしまいました。
どうかお知恵をお貸しください・・m(__)m

(ポートスキャナを作っています)
ネットワークプログラムの練習用に開発しています。もちろん
、自分のマシン以外には使用しません^^;

(つまづいている所)
下記(1)のクラスPortScannerから、下記(2)のクラスScannerを
スレッドとして実行させています。その際、(2)のスレッドで
の実行結果を、(1)のテキストエリアやラベルに反映させたい
のです。が、

(問題点)
解決策として、(1)のJLabelやJTextAreaをクラスフィールドに
して、(2)から参照することで動作はするのですが、できれば
、JLabelやJTextAreaはpublicやstaticにはしたくありません
。なんとかスレッドの生成元オブジェクトを、生成されたスレ
ッドから参照する、もしくはスレッドの生成元オブジェクトを
生成されたスレッドに渡す方法はないでしょうか?

(試みたこと)
<a>(2)のコンストラクタをオーバーロードして(1)のオブジェ
クトを渡すこと
→コンストラクタをオーバーロードすると、スレッドとして認
識してくれなくなりました^^;
<b>(1)にアクセセッサメソッドを作成する
→アクセッサメソッド・・・作ってはみたものの、(1)のオブ
ジェクトを(2)に渡す手段がありませんでした(TT

文章が下手で、わたりづらく、恐縮なんですが・・どうか、よ
ろしくお願いします。

※えんどうさん、①はJISにないので使用しないほうが良いと
のご指摘、有難うございました。今後、参考にさせて頂きます
。

(1)PortScannerクラス
// ポートスキャナ ver1.0

import java.net.*;
import java.io.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

public class PortScanner extends JFrame{
	//Field
	private JButton startButton;
	private JButton stopButton;
	private JLabel label;
	private JTextArea textArea;
	private JScrollPane scrollPane;
	private JPanel panel;
	//Constructor
	public PortScanner(){
		super("PortScanner");
		label = new JLabel("PortNumber:  ");
		textArea = new JTextArea("(List of Active
Server)\n",10,20);
		scrollPane = new JScrollPane(textArea);
		panel = new JPanel(new GridLayout(2,1));
		startButton = new JButton("START");
		stopButton = new JButton("STOP");
		panel.add(startButton);
		panel.add(stopButton);
		//EventHandler
		startButton.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent ae){
				Scanner s = new Scanner(this);
				s.start();
			}
		});
		stopButton.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent ae){
				System.exit(0);
			}
		});
		//Show Components
		this.getContentPane().add(label,BorderLayout.NORTH);
	
this.getContentPane().add(scrollPane,BorderLayout.CENTER);
		this.getContentPane().add(panel,BorderLayout.SOUTH);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		this.pack();
		this.show();
	}
	//Accessor Method
	public void setLabel(String no){
		label.setText(no);
	}
	public void setTextArea(String str){
		textArea.append(str);
	}
	//MainMethod
	public static void main(String[] args){
		PortScanner ps = new PortScanner();
	}
}
(2)Scannerクラス
import java.net.*;
import java.io.*;

public class Scanner implements Runnable{
	//Method
	public void run(){
			String host = "localhost";
			try{
				InetAddress adress = InetAddress.getByName(host);
				for(int i=1;i<65536;i++){
					Socket socket = null;
					try{
						socket = new Socket(host,i);
						ps.setTextArea("There is a server on Port No." + i
+"\n");
						ps.setLabel("PortNumber: " + i + "/65535");
					}catch(IOException ioe){
						ps.setLabel("PortNumber: " + i + "/65535");
						//このポートではサーバーは稼動していない
					}finally{
						try{
							if(socket != null){
								socket.close();
							}
						}catch(IOException ioe){
							//サーバの稼動していないホストとの接続は
							//失敗しているので閉じる必要なし
						}
					}
				}
			}catch(UnknownHostException uhe){
				System.err.println(uhe);
			}
	}
}

__________________________________________________
Do You Yahoo!?
Yahoo! BB is Broadband by Yahoo!
http://bb.yahoo.co.jp/