2012-04-25 2 views
6

기본 아이디어는 표준 Linux 유형 터미널의 모양과 느낌을 갖는 응용 프로그램을 만드는 것입니다. 이제 나는 자바로 제한되어 있으며, 내가 원하는 것은 여기있다.Java 텍스트 기반 응용 프로그램

  1. 메인 창 상단 메뉴 (독립 JFrame의)는 메뉴 바 아래
  2. 전체 영역은 사용자가 I이 있습니다 (명령을 입력하여 상호 작용할 수 있음을 "콘솔"입니다 (확인이 나는 어떻게 해야할지) 아무런 단서 없음).

그런 일을하기에 쉬운 방법이 있습니까? 텍스트 처리 응용 프로그램이어야하며 시스템 독립적 및 독립 실행 형이어야합니다. 모든 작업 로직은 사용자 입력에서 파생되어야합니다.

아이디어가 있으십니까?

+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의 문제점은 텍스트가 사용자 입력에 의해 삽입되었는지 (/ 문서가 업데이트되었는지) 또는 명령의 결과로 실행되는 '프로그램'의 출력으로 구별해야 하는지를 알아야한다는 것입니다. –

+1

별도의 입력 필드가있는 솔루션은 리눅스 터미널의 룩앤필을 제공하지 않지만 간단합니다. –

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 명령을 모두 피하고 싶었습니다. 나는 반드시 이것을 사용할 것이다. –