2012-04-25 17 views
6

La idea principal es intentar crear una aplicación que tenga el aspecto de un terminal estándar de tipo Linux. Ahora estoy limitado a Java y esto es lo que quiero.Aplicación basada en texto de Java

  1. ventana principal (JFrame independiente) con el menú superior (bueno esto lo saben cómo hacerlo)
  2. Toda el área por debajo de la barra de menú es para "consola" que los usuarios puedan interactuar escribiendo los comandos (esto tengo ninguna pista sobre).

¿Hay alguna manera fácil de hacer tal cosa. Esta debe ser una aplicación de procesamiento de texto y debe ejecutar independiente del sistema e independiente. Toda la lógica de trabajo debe derivarse de la entrada del usuario.

¿Alguna idea?

+0

consulte http://stackoverflow.com/questions/1255373/create-a-command-console – krishnakumarp

+0

este BeanShell parece ser cosa sólo que Estaba buscando, pero el ejemplo allí no parece funcionar correctamente. –

Respuesta

2

La 'consola' podría implementarse utilizando un JTextPane. Siempre que la ventana tenga foco, puede escribir cualquier tecla presionada en el panel de texto y analizar, ejecutar siempre que se presione 'Entrar' (use un KeyListener e implemente keyTyped).

+1

* "use un KeyListener" * No se deberían enlazar las teclas o un ['DocumentListener'] (http://docs.oracle.com/javase/7/docs/api/javax/swing/event/DocumentListener.html) más adecuado para esto? Por simplicidad, preferí el otro enfoque desconocido por el usuario. –

+1

Posiblemente sí. El problema con DocumentListener es que tendría que distinguir entre si el texto fue insertado (/ documento actualizado) por entrada de usuario o por salida de los 'programas' que se ejecutan como resultado del comando. –

+1

La solución con el campo de entrada separado realmente no da la apariencia de un terminal de Linux pero acepto que es más simple. –

4

Supongo que necesita dos componentes de texto, un área de texto y un campo de texto.

Si el usuario ingresa texto en el campo de texto en la parte inferior, y toca Ingrese, el texto se mueve al área de texto, donde ya no se puede editar. Luego se procesa, eventualmente se imprime un resultado (o múltiplos) en el área de texto, y se puede ingresar la siguiente línea.

El área superior podría tener un JScrollPane. De alguna manera, el almacenamiento en memoria intermedia debe ser manejado.

Aquí es un simple, completa y ejecutable ejemplo:

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.util.*; 
import javax.swing.plaf.ActionMapUIResource; 
/** 
    CmdPrompt 

    @author Stefan Wagner 
    @date Mi 25. Apr 17:27:19 CEST 2012 
    (c) GPLv3 
*/ 
public class CmdPrompt extends JFrame 
{ 
    private static final String progname = "CmdPrompt 0.1"; 

    private JTextField input; 
    private JTextArea history; 

    public CmdPrompt() 
    { 
     super (progname); 
     JPanel mainpanel = new JPanel(); 
     mainpanel.setLayout (new BorderLayout()); 
     this.getContentPane().add (mainpanel); 

     input = new JTextField (80); 
     history = new JTextArea(); 
     mainpanel.add (history, BorderLayout.CENTER); 
     mainpanel.add (input, BorderLayout.SOUTH); 

     ActionMap actionMap = new ActionMapUIResource(); 
     actionMap.put ("enter", new AbstractAction() { 
      @Override 
      public void actionPerformed (ActionEvent e) { 
       String cmd = input.getText(); 
       String sofar = history.getText(); 
       history.setText (sofar + "\n> " + cmd + "\n" + processCmd (cmd)); 
       input.setText (""); 
      } 
     }); 
     InputMap keyMap = new ComponentInputMap (input); 
     keyMap.put (KeyStroke.getKeyStroke (KeyEvent.VK_ENTER, 0), "enter"); 

     SwingUtilities.replaceUIActionMap (input, actionMap); 
     SwingUtilities.replaceUIInputMap (input, JComponent.WHEN_IN_FOCUSED_WINDOW, keyMap); 

     setSize (400, 400); 
     setLocation (100, 100); 
     setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 
     setVisible (true);   
    } 

    private void center() 
    { 
     Toolkit tk = Toolkit.getDefaultToolkit(); 
     Dimension screen = tk.getScreenSize(); 
     Dimension d = getSize(); 
     setLocation ((screen.width - d.width)/2, (screen.height - d.height)/2); 
    } 
    public static String processCmd (String cmd) 
    { 
     String arr [] = cmd.split (" "); 
     if ("rev".equals (arr [0])) { 
      return reverse (cmd.substring (4)); 
     } 
     else if ("upp".equals (arr [0])) { 
      return (cmd.substring (4)).toUpperCase(); 
     } 
     else if ("low".equals (arr [0])) { 
      return (cmd.substring (4)).toLowerCase(); 
     } 
     else if ("help".equals (arr [0])) { 
      return ("rev, upp, low, help"); 
     } 
     return "unknown command"; 
    } 
    public static String reverse (String cmd) 
    { 
     return (cmd.length() < 2) ? cmd : reverse (cmd.substring (1)) + cmd.charAt (0); 
    } 

    public static void main (final String args []) 
    { 
     Runnable runner = new Runnable() 
     { 
      public void run() 
      { 
       new CmdPrompt(); 
      } 
     }; 
     EventQueue.invokeLater (runner); 
    } 
} 
+0

Similar a este [ejemplo] (http://stackoverflow.com/a/3245805/230513). – trashgod

+0

Sí, gracias, esto es genial y se puede ajustar para que se vea como yo quiero. Es solo que quería evitar los comandos de GUI por completo. Seguramente usaré esto. –

Cuestiones relacionadas