单击第二个按钮时 JavaFX 场景冻结
JavaFX scene freezes when second Button is clicked
我有一个带有三个按钮的 FXML JavaFX 场景。
按钮1:Telnet,在JavaFX场景的TextArea输入command1+输出Telnet会话
按钮2:Telnet,在JavaFX场景的TextArea输入command2+输出Telnet会话
按钮3:Telnet,在JavaFX场景的TextArea输入command3+输出Telnet会话
问题是单击一个按钮后,单击第二个按钮时 JavaFX 场景冻结。
我已经将 Telnet 会话的输出重定向到控制台,但结果相同。
这是控制台中的最后输出:
(110)oxea> #ý
(110)oxea> 是提示,#ý 显然是最后发送的字符。
如果我从一个按钮中删除了 Telnet 操作,那么在我单击另一个具有 Telnet 操作的按钮后单击该按钮就没有问题了。
如果我编译程序也会出现同样的问题。
我也尝试过以下操作:编译后,我同时运行程序两次,正如我所料:在第一个程序中单击一个按钮后,第二个程序在单击按钮时立即冻结。
没有抛出异常,我找不到任何描述和修复此问题的主题。
FXMLController:
@FXML private Text buttonPressed;
@FXML private Button button1;
@FXML private Button button2;
@FXML public TextArea actionConsole;
@FXML
private void initialize() {
button1.setOnAction((event) -> {
buttonPressed.setText("");
buttonPressed.setText("button1 pressed");
actionConsole.clear();
TelnetSRV t1 = new TelnetSRV("0.0.0.0", "user", "password", "ls -l");
});
button2.setOnAction((event) -> {
buttonPressed.setText("");
buttonPressed.setText("button1 pressed");
actionConsole.clear();
TelnetSRV t2 = new TelnetSRV("0.0.0.0", "user", "password", "df -h");
因此,当点击一个按钮时,会显示一个文本,清除TextArea actionConsoel,并执行TelnetSRV。这在第一次点击时有效,但在第二次点击时程序冻结。
几乎肯定会在 TelnetSRV class 中发现错误,因为当 运行 另一个 class 有两个 TelnetSRV 时,这也会在第一个 TelnetSRV 之后冻结。
TelnetSRV:
public class TelnetSRV {
private TelnetClient tc = new TelnetClient();
private InputStream in;
private PrintStream out;
private String prompt = "(110)oxea>";
public TelnetSRV(String server, String user, String password, String command) {
try {
tc.connect(server, 23);
in = tc.getInputStream();
out = new PrintStream(tc.getOutputStream());
readUntil("login: ");
write(user);
readUntil("Password: ");
write(user);
readUntil(prompt + " ");
write(command);
readUntil(prompt + " ");
tc.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
public String readUntil(String pattern) {
try {
char lastChar = pattern.charAt(pattern.length() - 1);
StringBuffer sb = new StringBuffer();
boolean found = false;
char ch = (char) in.read();
while (true) {
System.out.print(ch);
sb.append(ch);
if (ch == lastChar) {
if (sb.toString().endsWith(pattern)) {
return sb.toString();
}
}
ch = (char) in.read();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void write(String value) {
try {
out.println(value);
out.flush();
System.out.println(value);
} catch (Exception e) {
e.printStackTrace();
}
}
}
我的 Telnet 跟踪让我觉得我的代码没问题,所以我开始在 TelnetClient 上搜索错误报告。
然后我发现问题是由我使用的 Apache common-net 库引起的。
我用commons-net-3.6替换了commons-net-3.0.1,现在两个telnet会话运行没有任何问题。
谢谢
我有一个带有三个按钮的 FXML JavaFX 场景。
按钮1:Telnet,在JavaFX场景的TextArea输入command1+输出Telnet会话
按钮2:Telnet,在JavaFX场景的TextArea输入command2+输出Telnet会话
按钮3:Telnet,在JavaFX场景的TextArea输入command3+输出Telnet会话
问题是单击一个按钮后,单击第二个按钮时 JavaFX 场景冻结。
我已经将 Telnet 会话的输出重定向到控制台,但结果相同。 这是控制台中的最后输出:
(110)oxea> #ý
(110)oxea> 是提示,#ý 显然是最后发送的字符。
如果我从一个按钮中删除了 Telnet 操作,那么在我单击另一个具有 Telnet 操作的按钮后单击该按钮就没有问题了。
如果我编译程序也会出现同样的问题。
我也尝试过以下操作:编译后,我同时运行程序两次,正如我所料:在第一个程序中单击一个按钮后,第二个程序在单击按钮时立即冻结。
没有抛出异常,我找不到任何描述和修复此问题的主题。
FXMLController:
@FXML private Text buttonPressed;
@FXML private Button button1;
@FXML private Button button2;
@FXML public TextArea actionConsole;
@FXML
private void initialize() {
button1.setOnAction((event) -> {
buttonPressed.setText("");
buttonPressed.setText("button1 pressed");
actionConsole.clear();
TelnetSRV t1 = new TelnetSRV("0.0.0.0", "user", "password", "ls -l");
});
button2.setOnAction((event) -> {
buttonPressed.setText("");
buttonPressed.setText("button1 pressed");
actionConsole.clear();
TelnetSRV t2 = new TelnetSRV("0.0.0.0", "user", "password", "df -h");
因此,当点击一个按钮时,会显示一个文本,清除TextArea actionConsoel,并执行TelnetSRV。这在第一次点击时有效,但在第二次点击时程序冻结。
几乎肯定会在 TelnetSRV class 中发现错误,因为当 运行 另一个 class 有两个 TelnetSRV 时,这也会在第一个 TelnetSRV 之后冻结。
TelnetSRV:
public class TelnetSRV {
private TelnetClient tc = new TelnetClient();
private InputStream in;
private PrintStream out;
private String prompt = "(110)oxea>";
public TelnetSRV(String server, String user, String password, String command) {
try {
tc.connect(server, 23);
in = tc.getInputStream();
out = new PrintStream(tc.getOutputStream());
readUntil("login: ");
write(user);
readUntil("Password: ");
write(user);
readUntil(prompt + " ");
write(command);
readUntil(prompt + " ");
tc.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
public String readUntil(String pattern) {
try {
char lastChar = pattern.charAt(pattern.length() - 1);
StringBuffer sb = new StringBuffer();
boolean found = false;
char ch = (char) in.read();
while (true) {
System.out.print(ch);
sb.append(ch);
if (ch == lastChar) {
if (sb.toString().endsWith(pattern)) {
return sb.toString();
}
}
ch = (char) in.read();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void write(String value) {
try {
out.println(value);
out.flush();
System.out.println(value);
} catch (Exception e) {
e.printStackTrace();
}
}
}
我的 Telnet 跟踪让我觉得我的代码没问题,所以我开始在 TelnetClient 上搜索错误报告。
然后我发现问题是由我使用的 Apache common-net 库引起的。
我用commons-net-3.6替换了commons-net-3.0.1,现在两个telnet会话运行没有任何问题。
谢谢