2012-04-25 3 views
6

Основная идея - попытаться создать приложение, которое будет выглядеть как стандартный терминал типа Linux. Теперь я ограничен Java, и вот что я хочу.Приложение на основе текста на основе Java

  1. Главное окно (независимо JFrame) с верхним меню (ок это я знаю, как это сделать)
  2. Вся площадь под строкой меню для «консоли», чтобы пользователи могли взаимодействовать, набрав в командах (это у меня есть не знаю).

Есть ли какой-либо простой способ сделать такое. Это должно быть приложение для обработки текста и должно работать независимо от системы и автономно. Вся рабочая логика должна быть получена из пользовательского ввода.

Любые идеи?

+0

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

+0

это BeanShell кажется просто вещь, Я был после, но пример там, кажется, не работает должным образом. –

ответ

2

«Консоль» может быть реализована с использованием JTextPane. Всякий раз, когда окно имеет фокус, вы можете писать любое нажатие на текстовое поле и разбор, выполнять при каждом нажатии «Enter» (используйте KeyListener и реализуйте keyTyped).

+1

* «использовать KeyListener» * Не было бы привязки клавиш или ['DocumentListener'] (http://docs.oracle.com/javase/7/docs/api/javax/swing/event/DocumentListener.html) be лучше подходит для этого? Для простоты я предпочел другой подход неизвестным пользователем. –

+1

Возможно, да. Проблема с DocumentListener заключается в том, что вам нужно будет различать, был ли текст вставлен (/ обновлен документ) с помощью ввода пользователем или путем вывода из «программ», которые запускаются в результате команды. –

+1

Решение с отдельным полем ввода действительно не дает внешнего вида терминала linux, но я согласен, что это проще. –

4

Думаю, вам нужны два текстовых компонента, текстовая область и текстовое поле.

Если пользователь вводит текст в текстовое поле внизу и обращается к Ввод, текст перемещается в текстовую область, где она больше не редактируется. Затем выполняется обработка, в конечном итоге результат (или кратность) печатается в текстовой области, и может быть введена следующая строка.

Верхняя область может иметь JScrollPane. Так или иначе, буферизация должна обрабатываться.

Вот простой, полный и работоспособный пример:

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

Аналогично этому [пример] (http://stackoverflow.com/a/3245805/230513). – trashgod

+0

Да, спасибо, это здорово, и его можно настроить так, как я хочу. Просто я хотел вообще избегать команд GUI. Я обязательно воспользуюсь этим. –

Смежные вопросы