2012-04-25 83 views
6

主要想法是尝试创建一个具有标准Linux类型终端的外观和感觉的应用程序。现在我仅限于Java,这是我想要的。基于Java文本的应用程序

  1. 主窗口(独立的JFrame)与顶级菜单(OK这个我知道该怎么做)的菜单栏下方
  2. 整个区域的“控制台”使用户可以通过在命令中输入交互(这个我有没有线索)。

有没有做这样的事的任何容易够方式。这应该是一个文本处理应用程序,应该运行系统无关和独立。所有的工作逻辑应该来自用户输入。

任何想法?

+0

请参阅http://stackoverflow.com/questions/1255373/create-a-command-console – krishnakumarp 2012-04-25 11:40:14

+0

这BeanShell的似乎只是东西我在之后,但那里的例子似乎没有正常工作。 – 2012-04-25 18:51:46

回答

2

的“控制台”可以使用JTextPane来实现。只要窗口有焦点,您可以将任何按键写入文本窗格并进行解析,只要按下“Enter”键即可执行(使用KeyListener并实现keyTyped)。

+1

*“使用KeyListener”*不会键绑定或[[DocumentListener]](http://docs.oracle.com/javase/7/docs/api/javax/swing/event/DocumentListener.html)更适合这个?为了简单起见,我更喜欢用户未知的其他方法。 – 2012-04-25 11:28:49

+1

可能是的。 DocumentListener的问题在于,您必须区分是通过用户输入插入文本(/文档更新)还是通过作为命令结果运行的“程序”的输出来插入文本。 – 2012-04-25 11:49:00

+1

带有单独输入字段的解决方案并不真正给出linux终端的外观和感觉,但我同意它更简单。 – 2012-04-25 11:50:27

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 2012-04-25 15:13:06

+0

是的,非常感谢,这很棒,可以按照我想要的方式进行调整。这只是我想完全避免GUI命令。我一定会用这个。 – 2012-04-25 18:38:35

相关问题