2009-08-10 5 views
9

Mam niecodzienne pytanie: Jak utworzyć "Konsolę poleceń" za pomocą Swing?Utwórz konsolę "Polecenie"

Co chcę mieć to konsola, w której użytkownicy wpisują komendy, naciśnij klawisz Enter, a wynik polecenia zostanie wyświetlony w obszarze. Nie chcę pozwolić użytkownikowi na zmianę "polecenia" i starszych wyników. Myślę o systemie Windows CMD.EXE.

Spojrzałem na pytanie this, jednak nie odpowiada na moje pytanie.

+0

Masz na myśli coś w rodzaju Workspace BeanShell? – Kryten

+0

Dlaczego używałbyś Swinga? Co jest nie tak z samym tworzeniem aplikacji konsolowej Java bezpośrednio? – Juliet

+0

To jest lepsza odpowiedź niż ta, o której myślałem. :-) – Jay

Odpowiedz

0

Możesz wykonywać dowolne polecenia ze splotem za pomocą linii poleceń. Obsługuje ucieczkę od argumentów, wykonanie specyficzne dla środowiska i umożliwia przyłączenie klientów do standardowego wyjścia i stderra, co pozwala skupić się na obsłudze.

Oto link do another answe r podałem, pokazujący, jak ustawić wiersz poleceń i obsługiwać wyjście.

2

Jeśli dobrze rozumiem twoje pytanie, szukasz poleceń specyficznych dla twojej aplikacji. Moja rada byłaby, jeśli tak rzeczywiście jest, używać dwóch tekstów, jednej, która zajmuje całą resztę przestrzeni. Dodaj kilka programów obsługi zdarzeń klawiaturowych do małych, które można edytować, a drugie do odczytu. Jeśli musisz mieć pojedynczy obszar tekstowy, możesz ustawić go jako tylko do odczytu, a następnie dodać kilka procedur obsługi klawiszy, aby obsłużyć wprowadzanie znaków i klawisze strzałek w górę/w dół.

Mam nadzieję, że dobrze zrozumiałem twoje pytanie, powodzenia.

0

Nie próbowałbym skrótów (jak groovy/fasola), chyba że dokładnie pasują do twoich potrzeb. Próba uczynienia narzędzia wysokiego poziomu robieniem tego, co chcesz, kiedy nie jest to, co już robi, może być najbardziej frustrującą rzeczą w programowaniu.

Powinny być dość łatwe do zrobienia obszaru tekstowego i "Make it your own", ale byłoby to o wiele łatwiej zrobić, jak ktoś inny zasugerował i używać jednolinijkowego sterowania tekstem w połączeniu z wieloliniowym obszarem wyświetlania .

W obu przypadkach chcesz zachować całkiem ścisłą kontrolę nad całym systemem, przechwytywać i filtrować niektóre naciśnięcia klawiszy, wyłączać wprowadzanie danych do obszaru "Ekran", jeśli zdecydujesz się na to, wymusić kliknięcie obszaru wyświetlania, aby wysłać skup się na swoim polu wprowadzania ...

Jeśli robisz rzeczy z pojedynczym pudełkiem, upewnij się, że dane wejściowe znajdują się zawsze na samym dole i że kontrolujesz ich pozycjonowanie kursorem (prawdopodobnie nie • chcą, aby były w stanie wykonać dowolne dane wejściowe do dowolnej linii z wyjątkiem ostatniej linii).

Proponuję, aby nie zakładać, że pojedyncza kontrola będzie działała bez modyfikacji, spodziewaj się, że wykonasz legwork i wszystko będzie dobrze.

1

Spróbuj kod:

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); 
} 

Używa JPanel jako panelu i JLabel jako konsoli. Polecenia są przekazywane do obiektu CommandListener, a zwrócona wartość jest drukowana na konsoli.

8

BeanShell zapewnia JConsole, konsoli do linii poleceń z następujących cech:

  • migający kursor
  • historii poleceń
  • wytnij/kopiuj/wklej w tym wybór z klawiszy strzałek Ctrl +
  • zakończenie polecenia
  • Wprowadzanie znaków Unicode
  • kolorowy tekst wyjściowy
  • ... i wszystko jest zapakowane w okienko przewijania.

BeanShell słoje są dostępne od http://www.beanshell.org/download.html i źródło jest dostępne za pośrednictwem SVN z svn co http://ikayzo.org/svn/beanshell

uzyskać więcej informacji na temat JConsole zobaczyć http://www.beanshell.org/manual/jconsole.html

Oto przykład użycia BeanShell za JConsole w aplikacji:

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 zwraca ";" jeśli naciśniesz Enter samodzielnie.

+0

To nie działa dla mnie. Używam 'bsh-2.0b4.jar'. Wpisanie 'quit' i wciśnięcie Enter nie powoduje niczego, tylko przesunięcie kursora do nowej linii. Kolor tła jest biały. Kolory liter są czarne. Nigdy nie widzę "Napisałeś:". –

0

Jeśli chcesz

coś jak Windows CMD.EXE.

użyj cmd.exe. Wszystko, co wydrukujesz przy użyciu System.out.println("") pojawi się tam. Trzeba tylko utworzyć plik .bat, w którym znajduje się skompilowany plik.

echo off 
cls 
java -jar fileName.jar