2008-10-04 53 views
1

我用Java編寫一個遊戲,我希望用戶能夠從兩個命令行和我的GUI提供輸入。目前,我用這種方法來獲得輸入:
模擬用戶輸入java.util.Scanner的

static String getInput(){ 
     System.out.println("Your move:"); 
     Scanner sc = new Scanner(System.in); 
     return sc.nextLine(); 
    } 

我想繼續用這個,但讓到mousePressed事件模擬用戶實際在他們的打字輸入,以及。這不是一個解決方案的效率,但它在我的應用程序中是有意義的。所以問題是:如何模擬用戶從代碼端輸入System.in?

回答

1

這是可能的 - System.in最簡單的替代將是PipedInputStream。這必須連接到從另一個線程(本例中爲Swing線程)寫入的PipedOutputStream

public class GameInput { 

    private Scanner scanner; 

    /**CLI constructor*/ 
    public GameInput() { 
     scanner = new Scanner(System.in); 
    } 

    /**GUI constructor*/ 
    public GameInput(PipedOutputStream out) throws IOException { 
     InputStream in = new PipedInputStream(out); 
     scanner = new Scanner(in); 
    } 

    public String getInput() { 
     return scanner.nextLine(); 
    } 

    public static void main(String[] args) throws IOException { 
     GameInput gameInput; 

     PipedOutputStream output = new PipedOutputStream(); 
     final PrintWriter writer = new PrintWriter(output); 
     gameInput = new GameInput(output); 

     final JTextField textField = new JTextField(30); 
     final JButton button = new JButton("OK"); 
     button.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       String data = textField.getText(); 
       writer.println(data); 
       writer.flush(); 
      } 
     }); 

     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().setLayout(new FlowLayout()); 
     frame.getContentPane().add(textField); 
     frame.getContentPane().add(button); 
     frame.pack(); 
     frame.setVisible(true); 

     String data = gameInput.getInput(); 
     System.out.println("Input=" + data); 
     System.exit(0); 
    } 

} 

但是,重新考慮你的遊戲邏輯在GUI模式下完全切斷流可能會更好。

+0

謝謝!這正是我所期待的。你說得對,應該有更好的方式來處理用戶輸入,但我試圖找到一些沒有足夠空間來執行快速執行的錯誤。花了比我預期的更多的時間/精力......嗯,好吧。學過的知識。 – perimosocordiae 2008-10-05 09:04:11

0

我做了一次應用程序,可以通過命令行或使用GUI運行。
我這樣做的方式是定義這定義了以下方法的接口(名爲IODevice):

  • 公共字符串getInput();
  • public void showOutput(String output);

  • 我那麼有哪些實現了這個接口的兩個類 - 一個用於主機的終端(如你現在做的)和一個使用一個JTextArea(輸出)/ JOptionPane的(輸入)。

    也許你可以做同樣的事情 - 要更改使用的輸入設備,只需改變IODevice的實例。


    希望這是一些使用的。

    0

    說實話,在重新閱讀你的問題後,我並不確定你想要什麼。

    不管怎麼說,也許你需要檢查的方法java.lang.System.setIn(InputStream的中)。這將允許您更改用於從終端

    0

    (即從實際終端到你喜歡什麼千變萬化它)假設你有一個像給定的例子很多操作讀取輸入什麼的讀者,你可能會考慮接口的方法由Richie_W描述,但是每個操作做一個例程而不是通用的「輸入/輸出」方法。

    例如:

    public interface IGameInteraction 
    { 
        public String askForMove(String prompt); 
        public boolean askAreYouSure(String prompt); 
    } 
    

    你的命令行的實現是清楚的;現在,您的GUI實現可以爲每個邏輯操作使用適當的對話框,而不僅僅是一個文本區域,它只是命令行版本。

    而且這種情況很容易編寫單元測試反對,因爲在你的測試,你可以以任何方式存根出這些例程。