Ho voluto provare a scrivere un esempio di codice per la sola parte di input, che è (come ho detto prima) la più semplice. Ecco il codice:

codice:
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class GraphicalConsole {
    private final PipedInputStream stdinPipedInput;
    private final PipedOutputStream stdinPipedOutput;
    private final PrintStream stdinStream;
    private ConFrame frame;

    public GraphicalConsole() throws IOException {
        stdinPipedInput = new PipedInputStream();
        stdinPipedOutput = new PipedOutputStream(stdinPipedInput);
        stdinStream = new PrintStream(stdinPipedOutput, true);   // autoFlush

        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                frame = new ConFrame();
                frame.setVisible(true);
            }
        });
    }

    public InputStream getIn() {
        return stdinPipedInput;
    }

    public void close() {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                frame.dispose();
            }
        });
    }

    private class ConFrame extends JFrame implements ActionListener {
        private JTextField inputTextField;

        public ConFrame() {
            super("Console");

            setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            setSize(400, 250);
            setLocationRelativeTo(null);

            inputTextField = new JTextField();
            inputTextField.addActionListener(this);

            getContentPane().add(inputTextField, BorderLayout.SOUTH);
        }

        public void actionPerformed(ActionEvent e) {
            String text = inputTextField.getText();
            inputTextField.setText("");

            stdinStream.println(text);
        }
    }
}

e poi un sorgente di test:

codice:
import java.io.*;
import java.util.*;

public class GraphicalConsoleTest {
    public static void main(String[] args) {
        GraphicalConsole graphicalConsole;

        try {
            graphicalConsole = new GraphicalConsole();
        } catch (IOException e) {
            System.err.println(e);
            return;
        }

        System.setIn(graphicalConsole.getIn());

        Scanner sc = new Scanner(System.in);

        String line;

        do {
            line = sc.nextLine();
            System.out.println("in: " + line);
        } while (!line.equals("exit"));

        graphicalConsole.close();
    }
}

Prendetelo in generale come esempio da cui partire, non è perfetto e si può sicuramente migliorare su diversi aspetti.