2012-04-25 12 views
6

L'idea principale è provare e creare un'applicazione che abbia l'aspetto di un terminale di tipo Linux standard. Ora sono limitato a Java e qui è quello che voglio.Applicazione basata su testo Java

  1. Finestra principale (JFrame indipendente) con menu superiore (ok questo lo so come fare)
  2. tutta l'area al di sotto della barra dei menu è per "console" che gli utenti potessero interagire digitando i comandi (questo ho nessun indizio su).

C'è un modo abbastanza semplice per fare una cosa del genere. Questa dovrebbe essere un'app di elaborazione del testo e dovrebbe essere indipendente dal sistema e autonoma. Tutta la logica di lavoro dovrebbe essere derivata dall'input dell'utente.

Qualche idea?

+0

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

+0

questo BeanShell sembra essere solo cosa che Io cercavo, ma l'esempio non sembra funzionare correttamente. –

risposta

2

La "console" potrebbe essere implementata utilizzando un JTextPane. Ogni volta che la finestra è attiva, è possibile scrivere qualsiasi pressione di tasto nel riquadro di testo e analizzare, eseguire ogni volta che si preme "Invio" (utilizzare KeyListener e implementare keyTyped).

+1

* "usa un KeyListener" * Non sarebbe possibile creare associazioni di tasti o ['DocumentListener'] (http://docs.oracle.com/javase/7/docs/api/javax/swing/event/DocumentListener.html) più adatto a questo? Per la semplicità, ho preferito l'altro approccio sconosciuto all'utente. –

+1

Forse sì. Il problema con DocumentListener è che dovresti distinguere tra se il testo è stato inserito (/ documento aggiornato) dall'input dell'utente o dall'output dai 'programmi' che vengono eseguiti come risultato del comando. –

+1

La soluzione con il campo di input separato non fornisce realmente l'aspetto di un terminale Linux, ma sono d'accordo sul fatto che sia più semplice. –

4

Suppongo che siano necessari due componenti di testo, un'area di testo e un campo di testo.

Se l'utente immette il testo nel campo di testo in basso e tocca Immettere, il testo viene spostato nell'area di testo, dove non è più modificabile. Quindi l'elaborazione ha luogo, eventualmente un risultato (o multipli) viene stampato nell'area di testo, e la riga successiva può essere inserita.

L'area superiore potrebbe avere un JScrollPane. In qualche modo, il buffering deve essere gestito.

Ecco un semplice, completo ed eseguibile esempio:

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

Simile a questo [esempio] (http://stackoverflow.com/a/3245805/230513). – trashgod

+0

Sì, grazie è fantastico e può essere regolato per apparire nel modo che voglio. È solo che volevo evitare del tutto i comandi della GUI. Userò sicuramente questo. –