1

たとえば、次のコードでは、JTextFieldを変更して、ポートimスキャンが開いているかどうかを表示したいのですが、これを行う方法がわかりません。多分私はいくつかのヘルパーメソッドが必要ですか?

public void actionPerformed(ActionEvent arg0) {
  console.setText("Starting check\n" +
    "Start = "+stopServTf.getText()+
    "\nStop ="+stopServTf.getText()+
    "\nPort Start ="+startPortTf.getText()+
    "\nPort Stop ="+stopPortTf.getText());
  PortScanner p= new PortScanner(Integer.parseInt(startPortTf.getText()),
    Integer.parseInt(stopPortTf.getText()),startServTf.getText());
}

および他のメソッド/コンストラクター

public   PortScanner(int portStart, int portStop ,String ip) {
  for (int i = portStart; i <= portStop; i++) {
    try {
      Socket ServerSok = new Socket(ip, i);
      setString(i);
      //System.out.println("Port in use: " + i);
      ServerSok.close();
    } catch (Exception e) {
    }
    setStrinN(i);
    System.out.println("Port not in use: " + i);
  }
}

public static String setString(int i) {
  return "Port in use: " +i;
}

public static String setStrinN(int i){
  return "Port not in use: "+i;
} 

に送りたいのでconsole.setText();

4

3 に答える 3

4

提案:

  • SwingWorkerによって提供されるものなど、Swing GUIに関しては、必ずバックグラウンドスレッドでポートスキャンを実行してください。
  • Swingコンポーネントを更新するときは、必ずSwingイベントスレッドであるEDTで更新してください。繰り返しになりますが、SwingWorkerには、これを自動化(公開/処理)する機能があるため、役立ちます。
  • GUIクラスに、外部クラスがテキストフィールドを更新できるようにするパブリックメソッドを指定します。public void consoleSetText(String text)
  • GUIクラスへの参照をヘルパークラスに渡して、ヘルパークラスが上記のメソッドを呼び出すことができるようにします。もちろん、SwingWorkerprocess(...)メソッドを使用して、Swingイベントスレッドでメソッドを呼び出します。

編集1
これは私が提案していることの例です:

class PortScannerGui {
   private JTextField startPortTf;
   private JTextField stopPortTf;
   private JTextField console;
   private JTextField stopServTf;
   private JTextField startServTf;

   // ... lots of code mising

   public void actionPerformed(ActionEvent arg0) {
      console.setText("Starting check\n" + "Start = " + stopServTf.getText()
            + "\nStop =" + stopServTf.getText() + "\nPort Start ="
            + startPortTf.getText() + "\nPort Stop =" + stopPortTf.getText());

      new SwingWorkerPortScannerWrapper(this, 
            Integer.parseInt(startPortTf.getText()), 
            Integer.parseInt(stopPortTf.getText()),
            startServTf.getText()).execute();
   }

   public void setConsoleText(String text) {
      console.setText(text);
   }
}

class SwingWorkerPortScannerWrapper extends SwingWorker<Void, Integer> {
   private PortScannerGui gui;
   private PortScanner portScanner;

   public SwingWorkerPortScannerWrapper(PortScannerGui gui, int portStart,
         int portStop, String ip) {
      this.gui = gui;
      portScanner = new PortScanner(portStart, portStop, ip);
   }

   @Override
   protected Void doInBackground() throws Exception {
      portScanner.addPropertyChangeListener(new PropertyChangeListener() {

         @Override
         public void propertyChange(PropertyChangeEvent evt) {
            if (PortScanner.PORT_IN_USE_NUMBER.equals(evt.getPropertyName())) {
               publish((Integer) evt.getNewValue());
            }
         }
      });

      portScanner.scan();
      return null;
   }

   @Override
   protected void process(List<Integer> chunks) {
      for (Integer chunk : chunks) {
         gui.setConsoleText("Port in use: " + chunk);
      }
   }
}

class PortScanner {
   public static final String PORT_IN_USE_NUMBER = "port in use number";
   public static final String STRIN_N = "strinN";
   private int portStart;
   private int portStop;
   private String ip;
   private int string;
   private PropertyChangeSupport propChangeSupport = new SwingPropertyChangeSupport(
         this);
   private int portInUseNumber;

   public PortScanner(int portStart, int portStop, String ip) {
      this.portStart = portStart;
      this.portStop = portStop;
      this.ip = ip;

   }

   public void addPropertyChangeListener(PropertyChangeListener listener) {
      propChangeSupport.addPropertyChangeListener(listener);
   }

   public void scan() {
      for (int i = portStart; i <= portStop; i++) {
         try {
            Socket ServerSok = new Socket(ip, i);

            setPortInUseNumber(i);
            // System.out.println("Port in use: " + i);

            ServerSok.close();
         } catch (UnknownHostException e) {
            e.printStackTrace();
         } catch (IOException e) {
            e.printStackTrace();
         }
         setStrinN(i);
         System.out.println("Port not in use: " + i);
      }
   }

   public void setStrinN(int i) {
      // TODO do something with this?
   }

   public void setPortInUseNumber(int i) {
      int oldValue = portInUseNumber;
      int newValue = i;
      portInUseNumber = i;
      propChangeSupport.firePropertyChange(PORT_IN_USE_NUMBER, oldValue,
            newValue);
   }

}
于 2012-05-27T13:36:47.140 に答える
2

JTextFieldインスタンスにアクセスできる必要があります。アクセスするには2つの方法があります。

  • PortScanner変数をローカル変数としてクラスに渡します
  • テキストフィールドを含むフレーム(またはテキストフィールド自体)への静的参照を用意して、どこからでもアクセスできるようにします。

最初の方法はカプセル化を維持するためより正確であり、2番目の方法はより簡単で単純ですが、それほど深刻に必要とされない場合にもフィールドを外部に公開します。これはOOP環境では不適切な設計選択です。

于 2012-05-27T13:38:11.970 に答える
1

を呼び出すとsetString(i);、その関数は破棄した文字列を返します(つまり、どこにも保存しません)。文字列を保存して後で取得する必要があります。返された文字列を使用して呼び出す場合は、コンストラクターconsole.setText()に渡す必要があります。consolePortScanner

public PortScanner(int portStart, int portStop, String ip, JTextArea console)

呼び出しをsetString(i);に変更します

console.setText(setString(i));

さらに(PortScannerコンストラクターが変更されたため)、

 PortScanner p= new PortScanner(Integer.parseInt(startPortTf.getText()),
   Integer.parseInt(stopPortTf.getText()),startServTf.getText()); 

actionPerformed()

于 2012-05-27T13:36:06.720 に答える