2012-04-25 12 views
6

主なアイデアは、標準のLinuxタイプの端末のルックアンドフィールを持つアプリケーションを作成してみることです。今私はJavaに限定されており、ここで私が望むものがあります。Javaテキストベースのアプリケーション

  1. 上部のメニューとメインウィンドウ(独立したJFrame)(OK、これは私が行う方法を知って)メニューバー以下
  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)はできませんこれにはより適していますか?簡単にするために、私はユーザが知らない他のアプローチを好んだ。 –

+1

可能です。 DocumentListenerの問題は、テキストがユーザー入力によって挿入された(/ドキュメントが更新された)のか、コマンドの結果として実行される 'programs'の出力から区別する必要があるということです。 –

+1

別の入力フィールドを持つソリューションは、実際にはLinux端末のルックアンドフィールを与えるわけではありませんが、よりシンプルです。 –

4

2つのテキストコンポーネント、テキストエリアとテキストフィールドが必要ですね。

ユーザが下部のテキストフィールドにテキストを入力してと入力すると、と入力すると、テキストはテキストエリアに移動され、テキストエリアには編集できなくなります。次に処理が行われ、最終的に結果(または複数)がテキスト領域に印刷され、次の行に入力することができます。

上部領域は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

この[example](http://stackoverflow.com/a/3245805/230513)と同様です。 – trashgod

+0

ええ、ありがとう、これは素晴らしいですし、私が望む方法を見て調整することができます。私はGUIコマンドを完全に避けたかったのです。私は確かにこれを使用します。 –

関連する問題