[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/