2009-08-10 79 views
9

Tôi có một câu hỏi không bình thường: Làm cách nào để tạo "Bảng điều khiển" bằng Swing?Tạo Bảng điều khiển "Lệnh"

Điều tôi muốn có là bảng điều khiển nơi người dùng nhập lệnh, nhấn enter và đầu ra từ lệnh được hiển thị bên dưới. Tôi không muốn cho phép người dùng thay đổi "dấu nhắc" và đầu ra cũ hơn. Tôi đang nghĩ về một cái gì đó giống như Windows CMD.EXE.

Tôi đã xem câu hỏi this, tuy nhiên nó không trả lời được câu hỏi của tôi.

+0

Bạn có ý nghĩa gì đó giống như không gian làm việc của BeanShell không? – Kryten

+0

Tại sao bạn sử dụng Swing? Có gì sai khi chỉ tạo ứng dụng bảng điều khiển Java trực tiếp? – Juliet

+0

Đây là câu trả lời hay hơn tôi nghĩ. :-) – Jay

Trả lời

0

Bạn có thể thực hiện các lệnh tùy ý bằng Plexus bằng Commandline. Nó xử lý việc thoát khỏi các đối số, thực thi môi trường cụ thể, và cho phép bạn đính kèm người tiêu dùng vào stdout và stderr, để bạn tập trung vào việc xử lý.

Đây là liên kết đến another answe r Tôi đã cung cấp, cho biết cách bạn có thể thiết lập Commandline và xử lý đầu ra.

2

Nếu tôi hiểu chính xác câu hỏi của bạn, bạn đang tìm cách thực hiện các lệnh cụ thể cho ứng dụng của mình. Lời khuyên của tôi sẽ là, nếu đây là trường hợp thực tế, để sử dụng hai textareas, một là một dòng duy nhất và một trong đó chiếm phần còn lại của không gian. Thêm một số trình xử lý sự kiện nhấn phím vào trình xử lý sự kiện nhỏ, có thể chỉnh sửa được và thực hiện một trình xử lý khác chỉ đọc. Nếu bạn phải có một vùng văn bản duy nhất, bạn có thể làm cho nó chỉ đọc và sau đó thêm một vài trình xử lý nhấn phím để xử lý các ký tự nhập liệu và bấm lên/xuống.

Hy vọng tôi đã hiểu chính xác câu hỏi của bạn, chúc bạn may mắn.

0

Tôi sẽ không thử các phím tắt (như groovy/beanshell) trừ khi chúng khớp chính xác với nhu cầu của bạn. Cố gắng làm cho một công cụ cấp cao làm những gì bạn muốn khi nó không phải là những gì nó đã làm có thể là điều khó chịu nhất về lập trình. Cần phải khá dễ dàng để lấy một vùng văn bản và "Biến nó thành của riêng bạn", nhưng sẽ dễ dàng hơn nhiều khi làm người khác đề xuất và sử dụng điều khiển văn bản một dòng kết hợp với khu vực hiển thị nhiều dòng .

Trong cả hai trường hợp bạn muốn kiểm soát chặt chẽ trên toàn bộ hệ thống, chặn và lọc một số tổ hợp phím, hãy tắt đầu vào cho khu vực "Hiển thị" nếu bạn quyết định thực hiện điều đó, buộc nhấp chuột vào khu vực hiển thị của bạn để gửi tập trung vào lĩnh vực đầu vào của bạn, ...

Nếu bạn làm điều duy nhất, bạn sẽ muốn đảm bảo đầu vào luôn ở cuối hộp và bạn kiểm soát định vị con trỏ của chúng (bạn có thể không ' t muốn họ có thể thực hiện bất kỳ đầu vào nào cho bất kỳ dòng nào ngoại trừ dòng cuối cùng).

Tôi đề nghị bạn không cho rằng một điều khiển duy nhất chỉ hoạt động mà không sửa đổi, mong đợi thực hiện công việc legwork và mọi thứ sẽ ổn.

1

Hãy thử mã này:

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.util.*; 

/** 
* 
* @author Alistair 
*/ 
public class Console extends JPanel implements KeyListener { 

    private static final long serialVersionUID = -4538532229007904362L; 
    private JLabel keyLabel; 
    private String prompt = ""; 
    public boolean ReadOnly = false; 
    private ConsoleVector vec = new ConsoleVector(); 
    private ConsoleListener con = null; 
    private String oldTxt = ""; 
    private Vector history = new Vector(); 
    private int history_index = -1; 
    private boolean history_mode = false; 

    public Console() { 
     super(); 
     setSize(300, 200); 
     setLayout(new FlowLayout(FlowLayout.CENTER)); 
     keyLabel = new JLabel(""); 
     setFocusable(true); 
     keyLabel.setFocusable(true); 
     keyLabel.addKeyListener(this); 
     addKeyListener(this); 
     add(keyLabel); 
     setVisible(true); 
    } 

    public void registerConsoleListener(ConsoleListener c) { 
     this.con = c; 
    } 

    public String getPrompt() { 
     return this.prompt; 
    } 

    public void setPrompt(String s) { 
     this.prompt = s; 
    } 

    private void backspace() { 
     if (!this.vec.isEmpty()) { 
      this.vec.remove(this.vec.size() - 1); 
      this.print(); 
     } 
    } 

    @SuppressWarnings("unchecked") 
    private void enter() { 
     String com = this.vec.toString(); 
     String return$ = ""; 
     if (this.con != null) { 
      return$ = this.con.receiveCommand(com); 
     } 

     this.history.add(com); 
     this.vec.clear(); 
     if (!return$.equals("")) { 
      return$ = return$ + "<br>"; 
     } 
     // <HTML> </HTML> 
     String h = this.keyLabel.getText().substring(6, this.keyLabel.getText().length() - 7); 
     this.oldTxt = h.substring(0, h.length() - 1) + "<BR>" + return$; 
     this.keyLabel.setText("<HTML>" + this.oldTxt + this.prompt + "_</HTML>"); 
    } 

    private void print() { 
     this.keyLabel.setText("<HTML>" + this.oldTxt + this.prompt + this.vec.toString() + "_</HTML>"); 
     this.repaint(); 
    } 

    @SuppressWarnings("unchecked") 
    private void print(String s) { 
     this.vec.add(s); 
     this.print(); 
    } 

    @Override 
    public void keyTyped(KeyEvent e) { 
    } 

    @Override 
    public void keyPressed(KeyEvent e) { 
    } 

    @Override 
    public void keyReleased(KeyEvent e) { 
     this.handleKey(e); 
    } 

    private void history(int dir) { 
     if (this.history.isEmpty()) { 
      return; 
     } 
     if (dir == 1) { 
      this.history_mode = true; 
      this.history_index++; 
      if (this.history_index > this.history.size() - 1) { 
       this.history_index = 0; 
      } 
      // System.out.println(this.history_index); 
      this.vec.clear(); 
      String p = (String) this.history.get(this.history_index); 
      this.vec.fromString(p.split("")); 

     } else if (dir == 2) { 
      this.history_index--; 
      if (this.history_index < 0) { 
       this.history_index = this.history.size() - 1; 
      } 
      // System.out.println(this.history_index); 
      this.vec.clear(); 
      String p = (String) this.history.get(this.history_index); 
      this.vec.fromString(p.split("")); 
     } 

     print(); 
    } 

    private void handleKey(KeyEvent e) { 

     if (!this.ReadOnly) { 
      if (e.getKeyCode() == 38 | e.getKeyCode() == 40) { 
       if (e.getKeyCode() == 38) { 
        history(1); 
       } else if (e.getKeyCode() == 40 & this.history_mode != false) { 
        history(2); 
       } 
      } else { 
       this.history_index = -1; 
       this.history_mode = false; 
       if (e.getKeyCode() == 13 | e.getKeyCode() == 10) { 
        enter(); 
       } else if (e.getKeyCode() == 8) { 
        this.backspace(); 
       } else { 
        if (e.getKeyChar() != KeyEvent.CHAR_UNDEFINED) { 
         this.print(String.valueOf(e.getKeyChar())); 
        } 
       } 
      } 
     } 
    } 
} 


class ConsoleVector extends Vector { 

    private static final long serialVersionUID = -5527403654365278223L; 

    @SuppressWarnings("unchecked") 
    public void fromString(String[] p) { 
     for (int i = 0; i < p.length; i++) { 
      this.add(p[i]); 
     } 
    } 

    public ConsoleVector() { 
     super(); 
    } 

    @Override 
    public String toString() { 
     StringBuffer s = new StringBuffer(); 
     for (int i = 0; i < this.size(); i++) { 
      s.append(this.get(i)); 
     } 
     return s.toString(); 
    } 
} 

public interface ConsoleListener { 
    public String receiveCommand(String command); 
} 

Nó sử dụng một JPanel như bảng điều khiển và một JLabel như giao diện điều khiển. Các lệnh được truyền cho một đối tượng CommandListener và giá trị trả về được in ra bàn điều khiển.

8

BeanShell cung cấp một JConsole, một dòng lệnh đầu vào giao diện điều khiển với các tính năng sau:

  • một con trỏ nhấp nháy
  • lịch sử lệnh
  • cắt/sao chép/dán bao gồm lựa chọn với tổ hợp phím CTRL + phím mũi tên
  • hoàn thành lệnh
  • Nhập ký tự Unicode
  • đầu ra văn bản màu
  • ... và tất cả đều được bao bọc trong ngăn cuộn.
  • lọ

Các BeanShell có sẵn từ http://www.beanshell.org/download.html và nguồn có sẵn thông qua SVN từ svn co http://ikayzo.org/svn/beanshell

Để biết thêm về JConsole thấy http://www.beanshell.org/manual/jconsole.html

Dưới đây là một ví dụ của việc sử dụng JConsole BeanShell trong ứng dụng của bạn:

import java.awt.Color; 
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.Reader; 

import javax.swing.JFrame; 

import bsh.util.GUIConsoleInterface; 
import bsh.util.JConsole; 

/** 
* Example of using the BeanShell project's JConsole in 
* your own application. 
* 
* JConsole is a command line input console that has support 
* for command history, cut/copy/paste, a blinking cursor, 
* command completion, Unicode character input, coloured text 
* output and comes wrapped in a scroll pane. 
* 
* For more info, see http://www.beanshell.org/manual/jconsole.html 
* 
* @author tukushan 
*/ 
public class JConsoleExample { 

    public static void main(String[] args) { 

     //define a frame and add a console to it 
     JFrame frame = new JFrame("JConsole example"); 

     JConsole console = new JConsole(); 

     frame.getContentPane().add(console); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(600,400); 

     frame.setVisible(true); 

     inputLoop(console, "JCE (type 'quit' to exit): "); 

     System.exit(0); 
    } 

    /** 
    * Print prompt and echos commands entered via the JConsole 
    * 
    * @param console a GUIConsoleInterface which in addition to 
    *   basic input and output also provides coloured text 
    *   output and name completion 
    * @param prompt text to display before each input line 
    */ 
    private static void inputLoop(GUIConsoleInterface console, String prompt) { 
     Reader input = console.getIn(); 
     BufferedReader bufInput = new BufferedReader(input); 

     String newline = System.getProperty("line.separator"); 

     console.print(prompt, Color.BLUE); 

     String line; 
     try { 
      while ((line = bufInput.readLine()) != null) { 
       console.print("You typed: " + line + newline, Color.ORANGE); 

       // try to sync up the console 
       //System.out.flush(); 
       //System.err.flush(); 
       //Thread.yield(); // this helps a little 

       if (line.equals("quit")) break; 
       console.print(prompt, Color.BLUE); 
      } 
      bufInput.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 
} 

NB: JConsole trả về ";" nếu bạn nhấn Enter một mình.

+0

Điều này không phù hợp với tôi. Tôi đang sử dụng 'bsh-2.0b4.jar'. Nhập 'quit' và nhấn enter sẽ không làm gì ngoài việc đưa con trỏ tới dòng mới. Màu nền là màu trắng. Màu chữ có màu đen. Tôi không bao giờ thấy 'Bạn đã gõ:'. –

0

Nếu bạn muốn

một cái gì đó như Windows CMD.EXE.

sử dụng cmd.exe. Tất cả những gì bạn in bằng cách sử dụng System.out.println("") sẽ xuất hiện ở đó. Những gì bạn phải làm là tạo một tập tin .bat nơi tập tin biên dịch của bạn là.

echo off 
cls 
java -jar fileName.jar 
Các vấn đề liên quan