2012-04-25 43 views
6

Ý tưởng chính là thử và tạo một ứng dụng có giao diện của một thiết bị đầu cuối kiểu Linux chuẩn. Bây giờ tôi bị giới hạn ở Java và đây là những gì tôi muốn.Ứng dụng dựa trên văn bản Java

  1. Main Window (độc lập JFrame) với menu trên cùng (ok này tôi biết làm thế nào để làm)
  2. Toàn bộ khu vực bên dưới thanh menu là dành cho "bàn giao" mà người dùng có thể tương tác bằng cách gõ các lệnh (I này có không có đầu mối về).

Có cách nào dễ dàng để thực hiện việc như vậy không. Đây phải là ứng dụng xử lý văn bản và sẽ chạy độc lập với hệ thống và độc lập. Tất cả logic công việc phải được lấy từ đầu vào của người dùng.

Bất kỳ ý tưởng nào?

+0

xin vui lòng xem http://stackoverflow.com/questions/1255373/create-a-command-console – krishnakumarp

+0

BeanShell này có vẻ là chỉ điều mà Tôi đã theo đuổi, nhưng ví dụ có vẻ như không hoạt động đúng. –

Trả lời

2

'Bảng điều khiển' có thể được triển khai bằng cách sử dụng JTextPane. Bất cứ khi nào cửa sổ có tiêu điểm, bạn có thể viết bất kỳ phím nào vào khung văn bản và phân tích cú pháp, thực hiện bất cứ khi nào 'Enter' được nhấn (sử dụng KeyListener và triển khai keyTyped).

+1

* "sử dụng một KeyListener" * Sẽ không ràng buộc chính hoặc ['DocumentListener'] (http://docs.oracle.com/javase/7/docs/api/javax/swing/event/DocumentListener.html) phù hợp hơn với điều này? Để đơn giản, tôi ưa thích cách tiếp cận khác của người dùng không xác định. –

+1

Có thể có. Vấn đề với DocumentListener là bạn sẽ phải phân biệt giữa liệu văn bản được chèn vào (/ tài liệu được cập nhật) bởi đầu vào của người dùng hay bởi đầu ra từ 'chương trình' được chạy như là kết quả của lệnh. –

+1

Giải pháp với trường nhập riêng biệt không thực sự cung cấp giao diện của thiết bị đầu cuối Linux nhưng tôi đồng ý rằng nó đơn giản hơn. –

4

Tôi đoán bạn cần hai thành phần văn bản, một vùng văn bản và một trường văn bản.

Nếu người dùng nhập văn bản vào trường văn bản ở dưới cùng và chạm Nhập, văn bản sẽ được chuyển vào vùng văn bản, nơi văn bản không thể chỉnh sửa được nữa. Sau đó quá trình xử lý diễn ra, cuối cùng một kết quả (hoặc bội số) được in đến vùng văn bản, và dòng tiếp theo có thể được nhập vào.

Khu vực phía trên có thể có JScrollPane. Bằng cách nào đó, bộ đệm phải được xử lý.

Đây là một đơn giản, đầy đủ và Runnable dụ:

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

Tương tự như [ví dụ này] (http://stackoverflow.com/a/3245805/230513). – trashgod

+0

Vâng, cảm ơn điều này thật tuyệt vời và có thể được điều chỉnh để nhìn theo cách tôi muốn. Nó chỉ là tôi muốn tránh các lệnh GUI hoàn toàn. Tôi chắc chắn sẽ sử dụng nó. –

Các vấn đề liên quan