1

How would I go about creating a local terminal in textarea type of app in javafx. Thank you in advance!

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

1 Answer 1

1

Here is a rough start.

One key component is to use Process.

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

Another key component is to read the process return data.

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

Instead of just printing the line, we will use Task and its message property to print to our 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 ;
    }   
}

enter image description here

1
  • 1
    Thank you, I now understand the principal concept. Commented Apr 16, 2021 at 5:11

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.