java - 如何从助手类将 String 发送到 JTextField?

标签 java swing concurrency jtextfield

例如,在下面的代码中,我想更改 JTextField 以显示即时扫描端口是否打开,但我不知道如何去做。也许我需要一些辅助方法?

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();

最佳答案

建议:

  • 请务必在与 Swing GUI 相关的后台线程中进行端口扫描,例如由 SwingWorker 提供的线程。
  • 更新任何 Swing 组件时,请确保在 Swing 事件线程 EDT 上执行此操作。同样,SwingWorker 会有所帮助,因为它具有自动执行此操作(发布/处理)的工具。
  • 为您的 GUI 类提供一个允许外部类更新其文本字段的公共(public)方法,例如 public void consoleSetText(String text)
  • 将 GUI 类的引用传递给帮助类,以便帮助类可以调用上述方法。它当然会调用 Swing 事件线程上的方法,使用 SwingWorker process(...) 方法。

编辑 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);
   }

}

关于java - 如何从助手类将 String 发送到 JTextField?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10774331/

相关文章:

Java : BigDecimal - Print the number has input

java - 仅显示标题栏,不显示 JFrame

java - JTable - 复选框添加 Action 监听器

java - 如何在同一程序中多次创建线程的新实例

c - 如何防止通过原子比较和交换实现的并发lifo堆栈中的损坏

java - 获取对象状态

Java:在最后一分钟实现 Hit() 和 getNumHits()

java - 需要将 AssetInputStream 转换为 FileInputStream

java - 我可以在 Java BoxLayout 中混合水平和垂直框吗?

c++ - 并发中的右值引用