2012-04-25 13 views
6

Główną ideą jest wypróbowanie aplikacji, która wyglądałaby jak zwykły terminal typu Linux. Teraz jestem ograniczony do Javy i tutaj jest to, czego chcę.Aplikacja tekstowa w języku Java

  1. Okno główne (niezależny JFrame) z górnego menu (ok to wiem, jak to zrobić)
  2. Cały obszar poniżej paska menu jest dla „konsola”, że użytkownicy mogą oddziaływać poprzez wpisanie komendy (to mam nie ma pojęcia o).

Czy istnieje łatwy sposób na zrobienie czegoś takiego. Powinna to być aplikacja do przetwarzania tekstu i powinna działać niezależnie od systemu. Cała logika pracy powinna pochodzić z danych wprowadzanych przez użytkownika.

Wszelkie pomysły?

+0

proszę zobaczyć http://stackoverflow.com/questions/1255373/create-a-command-console – krishnakumarp

+0

to BeanShell wydaje się być po prostu rzeczą, która Szukałem, ale ten przykład nie działa poprawnie. –

Odpowiedz

2

"Konsola" może być zaimplementowana przy użyciu JTextPane. Za każdym razem, gdy okno ma fokus, możesz napisać dowolne naciśnięcie klawisza do panelu tekstowego i parsować, wykonać po każdym naciśnięciu "Enter" (użyj KeyListener i implementuj keyTyped).

+1

* "użyj klucza KeyListener" * Czy nie wiązałoby się żadnych powiązań klawiszy lub ['DocumentListener'] (http://docs.oracle.com/javase/7/docs/api/javax/swing/event/DocumentListener.html) lepiej do tego pasuje? Dla uproszczenia wolałem inne podejście od nieznanego użytkownika. –

+1

Prawdopodobnie tak. Problem z DocumentListener polega na tym, że musiałbyś rozróżnić, czy tekst został wstawiony (/ zaktualizowany dokument) przez dane wejściowe użytkownika, czy też przez wyjście z "programów" uruchamianych w wyniku polecenia. –

+1

Rozwiązanie z osobnym polem wprowadzania nie wygląda tak, jak na terminalu linuxowym, ale zgadzam się, że jest prostsze. –

4

Sądzę, że potrzebujesz dwóch komponentów tekstowych, pola tekstowego i pola tekstowego.

Jeśli użytkownik wprowadzi tekst w polu tekstowym na dole i wyświetli Wpisz, tekst zostanie przeniesiony do obszaru tekstowego, gdzie nie będzie już można go edytować. Następnie przetwarzanie odbywa się, ostatecznie wynik (lub wielokrotności) są drukowane w obszarze tekstowym, a następnie można wprowadzić kolejną linię.

Górny obszar może mieć JScrollPane. W jakiś sposób należy obsłużyć buforowanie.

Oto proste, kompletne i runnable przykład:

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

Podobny do tego [przykład] (http://stackoverflow.com/a/3245805/230513). – trashgod

+0

Tak, dzięki temu jest świetny i można go dostroić tak, jak chcę. Po prostu chciałem całkowicie uniknąć poleceń GUI. Z pewnością skorzystam z tego. –