繁体   English   中英

单击第二个Button时JavaFX场景冻结

[英]JavaFX scene freezes when second Button is clicked

我有一个带有三个按钮的FXML JavaFX Scene。

按钮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类中发现该错误,因为在运行带有两个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公共网络库引起的。

我用commons-net-3.6替换了commons-net-3.0.1 ,现在两个telnet会话都可以正常运行了。

谢谢

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM