例如,在下面的代码中,我想更改 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/