【问题标题】:Create a Local Terminal Emulator App in JavaFX在 JavaFX 中创建本地终端仿真器应用程序
【发布时间】:2021-04-16 03:47:33
【问题描述】:

我将如何在 javafx 中的 textarea 类型的应用程序中创建本地终端。提前谢谢!

try {
            String[] comm = new String[] {"/bin/bash", "-c", "open -a Terminal \"`pwd`\""};
            Runtime.getRuntime().exec(comm);
        } 
        
        catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

【问题讨论】:

    标签: java javafx terminal local


    【解决方案1】:

    这是一个艰难的开始。

    一个关键组件是使用Process

    Process process = Runtime.getRuntime().exec("command-here")
    

    另一个关键组件是读取进程返回数据。

    BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
    String line = "";
    while ((line = reader.readLine()) != null) 
    {
        System.out.println(line);
        
    }  
    

    我们将使用Task 及其消息属性打印到我们的TextArea,而不是仅仅打印行。

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import javafx.application.Application;
    import javafx.concurrent.Task;
    import javafx.scene.Scene;
    import javafx.scene.control.TextArea;
    import javafx.scene.input.KeyCode;
    import javafx.scene.layout.StackPane;
    import javafx.stage.Stage;
    
    
    /**
     * JavaFX App
     */
    public class App extends Application 
    {   
        TextArea textArea = new TextArea("ping www.google.com");
        
        @Override
        public void start(Stage stage) 
        {
            textArea.setOnKeyPressed((t) -> {
                try 
                {
                    if(t.getCode() == KeyCode.ENTER)
                    {
                        String[] splitText = textArea.getText().split("\n");
                        Process process = Runtime.getRuntime().exec(splitText[splitText.length -1]);
                        Task<Void> task = printResults(process);
                        task.messageProperty().addListener((obs, oldText, newText)->{
                            textArea.appendText(newText + "\n");
                        });
                        task.setOnSucceeded((workerStateEvent) -> {
                            textArea.setEditable(true);
                        });
                        Thread thread = new Thread(task);
                        thread.setDaemon(true);
                        thread.start();
                    }
                } catch (IOException ex) 
                {
                    Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex);
                }
            });
            
            var scene = new Scene(new StackPane(textArea), 640, 480);
            stage.setScene(scene);
            stage.show();
        }
    
        public static void main(String[] args) 
        {
            launch();
        }
    
        Task<Void> printResults(Process process)
        {
            textArea.setEditable(false);
            Task<Void> task = new Task<Void>() 
            {
                @Override protected Void call(){
                    try 
                    {
                        BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
                        String line = "";
                        while ((line = reader.readLine()) != null) 
                        {
                            updateMessage(line);
                        }   
                    } 
                    catch (IOException ex) 
                    {
                        Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex);
                    }
    
                    return null;
                }
            };
                
            return task ;
        }   
    }
    

    【讨论】:

    • 谢谢,我现在明白了主要概念了。
    猜你喜欢
    • 2010-12-28
    • 2012-09-04
    • 2012-07-22
    • 2015-11-10
    • 1970-01-01
    • 2011-08-29
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多