JButtonからコンソールに入力を渡す

statsButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e){

              //Return the string "stats" to gameLoop() as cmd
            }
        }); 

public void gameLoop(){
        Scanner lineScanner = new Scanner(System.in);
        cmd = "";

        System.out.print(getBoard().printBoard(false));

        while (!cmd.equals("quit")) {
            System.out.print(">");
            Scanner wordScanner = new Scanner(lineScanner.nextLine());

        if (wordScanner.hasNext()) {
            cmd = wordScanner.next();
            if (cmd.equals("board")) {
                System.out.print(getBoard().printBoard(false));
                } else if (cmd.equals("ships")) {
            System.out.print(getBoard().printBoard(true));
                } else if (cmd.equals("help")) {
                    printHelp();    
                } else if (cmd.equals("stats")) {
                    printStats();
                } else if (cmd.equals("fire")) {
            if(fire(wordScanner)) { 
            printStats();
            cmd = "quit";
                    }
                } else if (cmd.equals("quit")) {    
                } else if (!cmd.equals("")) {
                    System.out.println(ILLEGAL_COMMAND);
                }
            }

        }
    }

私がしようとしているのは、ユーザーがstatsButtonをクリックすると、gameLoopのString cmdが "stats"に変更されるということです。 statsButtonとgameLoop()は2つの異なるクラスにあります。誰でも私にそれをする方法を教えてくれますか? (私はpipedreader/pipedwriterを試みた)と私はちょうどそれを得るように見えることはできません。

*私は基本的に、元のコンソールアプリケーションを変更せずに、自分のコンソールアプリケーションをGUIアプリケーションにすることを試みています。

編集:私が試したこと

Class textBased 
PipedInputStream in = new PipedInputStream()

public void gameLoop(){
    try{
        in.connect(GUIclass.out);

    Scanner lineScanner = new Scanner(in);`

Class GUIclass  
    PipedOutputStream out = new PipedOutputStream();
    PrintWriter writer;

  public GUIclass(){
    final PrintWriter writer = new PrintWriter(out);
    statsButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e){

              writer.println("stats");
             }
          }); 

それは私が書いてみたものですが、うまくいかないようです。

2
追加された 著者 mKorbel,

4 答え

について

私は基本的に、元のコンソールアプリケーションを変更せずにコンソールアプリケーションをGUIアプリケーションにするつもりです... "

私のアドバイスは簡単です:「やめないで」。

2つのアプリケーションは完全に異なる構造を持ち、1つは線形であり、もう1つはイベント駆動型であり、お互いに直接変換できません。最初から新しいGUIプログラムを作る方がいいです。 GUI以外のアプリケーションに、構造化されたオブジェクト指向のクラスがいくつか含まれている場合は、GUIの「モデル」またはロジックセクションでこれらのクラスを使用しますが、1つのタイプのプログラムフローを直接変換しようとはしません他のアプリケーションに適用されます。

Edit
Based on your posted requirements:

"あなたは、あなたの戦艦ゲームをあなたのGUIインターフェイスでプレイすることができるはずです。また、プロジェクト1のために書いたテキストベースのフロントエンドは、まだ"動作 "し、再生可能でなければなりません。

私が間違っている場合は私を訂正してください。しかし、ここにはいくつかのクラスが含まれていることを賭けています。そのうちの1つだけが「テキストベースのフロントエンド」です。その場合は、上記のようにフロントエンド以外のクラスをGUIのモデルとして使用しますが、GUIに関連するテキストベースのフロントエンドを使用せず、GUIでエミュレートしないでください。

4
追加された
私はそれをやっていないことを理解している、私はまたそれをやっていないことに慣れている。しかし、この場合、私はそうする必要があるという仕様書に記載されています。
追加された 著者 rlhh,
"あなたは、あなたの戦艦ゲームをあなたのGUIインターフェイスでプレイすることができるはずです。さらに、プロジェクト1のために書いたテキストベースのフロントエンドは、まだ"仕事 "で遊べるはずです。
追加された 著者 rlhh,
私はいくつかのクラスを持っており、すべての出力は1つのクラスで処理されます。しかし、別のものを作成するのではなく、GUIからの入力をコンソールに渡すように指示されています。
追加された 著者 rlhh,
あなたのBattleshipクラスがストリームインターフェイスを使用するように構築されている場合、最初のタスクはクラス間のストリームインターフェイスを持つBattleshipオブジェクトを作成する新しいクラスを作成することです。あなたのBattleshipクラスをこのモードで動作させることができない場合は、インストラクターにお尋ねください。
追加された 著者 rlhh,
@ user1043625:仕様をそのまま表示できますか?
追加された 著者 Hovercraft Full Of Eels,
@ user1043625:上記の私の答えへの更新をご覧ください。また、あなたのプロフィールを編集して、あまり一般的でないフォーラム名を与えてください。うまくいけば私よりも優れています。 :)
追加された 著者 Hovercraft Full Of Eels,
@ user1043625:あなたが受け取った指示であれば、GUIからコンソールに入力を渡すように指示されていませんでした。それは、GUIを使ってゲームをプレイすることです。これは、利用可能なクラスを使用することを意味し、コンソールゲームはまだ再生可能でなければなりません。つまり、非コンソールクラスをコンソールインタフェースを再生できないように変更しないでください。それは大きな違いです。私はまだ私の答えで述べているものに立っている。
追加された 著者 Hovercraft Full Of Eels,

コンソールアプリケーションにボタンのActionListenerをインスタンス化し、それをUIに渡します。アクションイベントが発生すると、リスナーはコンソールアプリケーションにイベントが発生したことを通知します。 ActionListenerのメソッドは、何をすべきかを指示します。

3
追加された
私は本当にそれを得ていない、あなたはいくつかの簡単な例で説明できますか?また、私はそれが私がしていない元のクラスを変更すると思う。
追加された 著者 rlhh,
"あなたは、あなたの戦艦ゲームをあなたのGUIインターフェイスでプレイすることができるはずです。さらに、プロジェクト1のために書いたテキストベースのフロントエンドは、まだ"仕事 "で遊べるはずです。
追加された 著者 rlhh,
"するべきではない" - どうしてですか?
追加された 著者 duffymo,
テキストベースのUIとGUIのUIは別々にする必要があります。私はあなたが2つの間で選択できるはずだと仮定します。それはオリジナルの変更を意味します。あなたの教授がやっていることは、プレゼンテーションからゲームロジックを完全に分離することです。あなたのゲームのロジックは、必要なものを渡す必要があります。それはそれがそれを取得しているテキストかGUIのUIかどうかを知る必要はありません。
追加された 著者 duffymo,

ホバークラフトのコメントに同意します(返信に変更)。

しかし、一般的にこのような問題については、私はあなたのgameLoop()のメソッドシグネチャを変更するでしょう。私は使うだろう:

public void gameLoop(Reader reader)

次に、必要に応じてさまざまなタイプのリーダーをループに渡すことができます。

コンソールの場合は、次のようなことがあります。

gameloop( new InputStreamReader( System.in ) );

GUIの場合は、次のようなことができます。

gameLoop ( new StringReader("some text") );

編集:

メソッドのシグネチャを変更せずに、System.inをActionListenerで取得したStringからリダイレクトできます。

public class Test
{
    public static void main(String args[]) throws Exception
    {
        String text = "some text";
        System.setIn( new ByteArrayInputStream( text.getBytes() ) );
       //gameloop(); 
        Scanner lineScanner = new Scanner(System.in);
        System.out.println( lineScanner.nextLine() );
    }
}
3
追加された
私が試したことをあなたに示すために、上記のものを追加しました。私にとってはうまくいきません。私が間違っていることを確信していない。
追加された 著者 rlhh,
@ user1043625、私はあなたの委員会を理解していません。なぜ私はその作業コード以来の提案を試してみませんか?私はPipedStreamの使用を提案していないので、あなたのコードに何が間違っているのか分かりません。
追加された 著者 camickr,

このようなものがあれば:

class B {
 public void gameLoop(){
  ..
 }
}

そして

class A{

  statsButton.addActionListener(new ActionListener() {
            ...
        }); 
}

最終的にAのBへの参照を宣言することができます。その場合、内部クラス ActionListener に表示されます。

class A{
  final B b = ...; //final variable is visible in inner class
  statsButton.addActionListener(new ActionListener() {
            b.gameLoop();
             ...
        }); 
}
1
追加された
私はあなたが書いたものに似た何かを持っています。しかし、問題は、ボタンをクリックしたときにString cmdをどのように変更するのですか? b.gameLoop()。cmdはうまくいかず、とにかくそれをやるべきだとは思わない。
追加された 著者 rlhh,