web-dev-qa-db-ja.com

Javaアプリケーションでコンソール/ターミナルウィンドウを開くようにするにはどうすればよいですか?

ダブルクリックしたときにコマンドラインを開く実行可能な.jarを作成する方法はありますか?

テキストベースのアドベンチャーゲームを作っています。現在のところ、それは部屋のある迷路です。結局、それははるかに大きく、より深くなるだろうが、今のところ、私は基本的な構造を取り下げたいだけだ。とにかく、これを機能させるために、System.out.printfコマンドとJava.util.Scannerから出力と入力を取得しています。これまでのところすべて問題なく機能していますが、コマンドラインからプログラムを実行する方法がわからない、または単に実行したくない他の人に送信しようとすると、問題が発生することに気づきました。

11
CaldwellYSR

フルコントロールが必要な場合は、Swingに現在の機能を実行するコンソールウィンドウを実装できます。

上記のウィンドウ(ヘッドレスの場合)を開けない場合、またはユーザーがコマンドラインでウィンドウを要求した場合は、デフォルトで現在の動作に設定します。

私は自分で答えを探しているときにこれを見つけ、結局このビットを書きました:

/**
 * This opens a command line and runs some other class in the jar
 * @author Brandon Barajas
 */
import Java.io.*;
import Java.awt.GraphicsEnvironment;
import Java.net.URISyntaxException;
public class Main{
    public static void main (String [] args) throws IOException, InterruptedException, URISyntaxException{
        Console console = System.console();
        if(console == null && !GraphicsEnvironment.isHeadless()){
            String filename = Main.class.getProtectionDomain().getCodeSource().getLocation().toString().substring(6);
            Runtime.getRuntime().exec(new String[]{"cmd","/c","start","cmd","/k","Java -jar \"" + filename + "\""});
        }else{
            THEMAINCLASSNAMEGOESHERE.main(new String[0]);
            System.out.println("Program has ended, please type 'exit' to close the console");
        }
    }
}

私の回答がまだ関連性があるかどうかはわかりませんが、o /に保持されているコメントで自由に使用してください

私が考えることができる唯一の欠点は、プログラムの完了後、cmdウィンドウが開いたままになることです。

使用法:このクラスをメインクラスと同じパッケージに配置し、メインクラスとして設定します。開いていない場合はコマンドプロンプトウィンドウを開き、開いている場合はメインクラスを起動します。 jarファイルの名前/場所は自動です。 Windows用に設計されていますが、別のシステムで使用する場合は、私にメッセージを送ってください。修正します。 (私はOS検出を行うことができますが、私は怠惰でこれを作っているので、ウィンドウを使用する教授にダブルクリックのjarファイルを提出できます)。

16
Brandon Barajas

Jarをダブルクリックすると、OSで関連付けられているアプリケーションで開きます。デフォルトでは、javaw [.exe]は通常jarファイルに関連付けられています。これは、ターミナルウィンドウなしで実行されるバイナリです。ダブルクリックでターミナルを表示するには、Java [.exe]バイナリをjarファイルに関連付ける必要があります。

4
Ryan Stewart

または、ターミナルを開く.sh .batを提供して、その中でJavaを呼び出すことができます。

2
YMomb

これが私の解決策です。@ Brandon Barajasのコードを使用して変更しました。それ自体でプログラムを起動するバッチファイルを作成します。

public static void main(String[] args){
    Console console = System.console();
    if(console == null && !GraphicsEnvironment.isHeadless()) {
        String filename = YOURMAINCALSS.class.getProtectionDomain().getCodeSource().getLocation().toString().substring(6);
        try {
            File batch = new File("Launcher.bat");
            if(!batch.exists()){
                batch.createNewFile();
                PrintWriter writer = new PrintWriter(batch);
                writer.println("@echo off");
                writer.println("Java -jar "+filename);
                writer.println("exit");
                writer.flush();
            }
            Runtime.getRuntime().exec("cmd /c start \"\" "+batch.getPath());
        } catch(IOException e) {
            e.printStackTrace();
        }
    } else {
        //your program code...
    }
}

必要に応じて、"exit"印刷の前にwriter.println( "pause");を追加して、プログラムの終了後もウィンドウを開いたままにできます。次に、ウィンドウを閉じるために[〜#〜] enter [〜#〜]を押す必要があります。

1
Frezze98 bolalo

.jarがJava.exeで実行されている限り、コマンドラインウィンドウは常に表示されます。 javaw.exeで実行すると、これを防ぐことができます。

さらに読むために: http://download.Oracle.com/javase/1.4.2/docs/tooldocs/windows/Java.html

1
Simiil

このプログラムを使用できます。このプログラムは、JARプログラムのコンソールを作成します(JARプログラムをダブルクリックして実行する場合)。

import Java.io.*;
import javax.swing.*;
import javax.swing.event.*;
import Java.awt.*;
import Java.awt.event.*;
import Java.util.*;
import javax.swing.text.*;
import javax.swing.border.*;

class InitComponents {

    public static JFrame setupJFrameAndGet(String title, int width, int height) {
        JFrame tmpJF = new JFrame(title);
        tmpJF.setSize(width, height);
        tmpJF.setLocationRelativeTo(null);
        tmpJF.setLayout(null);
        tmpJF.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        return tmpJF;
    } // end of setupJFrameAndGet

    public static JTextArea setupJTextAreaAndGet(String text, int rows, int columns, boolean setEditableFlag, boolean setLineWrapFlag, boolean setWrapStyleWordFlag, boolean setBoundsFlag, int xpos, int ypos, int width, int height) {
        JTextArea tmpJTA = new JTextArea(text, rows, columns);
        tmpJTA.setEditable(setEditableFlag);
        tmpJTA.setLineWrap(setLineWrapFlag);
        tmpJTA.setWrapStyleWord(setWrapStyleWordFlag);
        if (setBoundsFlag == true) {
            tmpJTA.setBounds(xpos, ypos, width, height);
        }
        return tmpJTA;
    } // end of setupJTextAreaAndGet

    public static JScrollPane setupScrollableJTextAreaAndGet(JTextArea jta, int xpos, int ypos, int width, int height) {
        JScrollPane tmpJSP = new JScrollPane(jta);
        tmpJSP.setBounds(xpos, ypos, width, height);
        return tmpJSP;
    } // end of setupScrollableJTextAreaAndGet

    public static JMenuBar setupJMenuBarAndGet() {
        JMenuBar tmpJMB = new JMenuBar();
        return tmpJMB;
    } // end of setupJMenuBarAndGet

    public static JMenu setupJMenuAndGet(String text) {
        JMenu tmpJM = new JMenu(text);
        return tmpJM;
    } // end of setupJMenuAndGet

    public static JMenuItem setupJMenuItemAndGet(String text) {
        JMenuItem tmpJMI = new JMenuItem(text);
        return tmpJMI;
    } // end of setupJMenuItemAndGet

}// end of InitComponents

public class ConsoleForJARPrograms implements KeyListener, ActionListener {

    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    int screenWidth = screenSize.width;
    int screenHeight = screenSize.height;

    String title = null;
    String text = null;

    JFrame jf = null;
    JTextArea jta = null;
    JScrollPane jsp = null;
    JMenuBar jmb = null;
    JMenu jm = null;
    JMenuItem jmi = null;

    int initialCaretPosition = 0;
    int currentCaretPosition = 0;
    boolean inputAvailable = false;

    // key codes
    int BACKSPACE = 8;
    int ENTER = 10;
    int PG_UP = 33; // do nothing for this key pressed
    int PG_DN = 34; // do nothing for this key pressed
    int END = 35;
    int HOME = 36;
    int LEFT_ARROW = 37;
    int UP_ARROW = 38; // do nothing for this key pressed
    //int RIGHT_ARROW = 39; // handled by JTextArea
    int DOWN_ARROW = 40; // do nothing for this key pressed

    int CTRL = 128;
    int A = 65; // disable ctrl-a
    int H = 72; // handle ctrl-h
    //int DELETE = 127; // handled by JTextArea

    public void actionPerformed(ActionEvent ae) {
        int cCurrPos = jta.getCaretPosition();
        jta.selectAll();
        jta.copy();
        jta.select(cCurrPos, cCurrPos);
    } // end of actionPerformed

    public void keyTyped(KeyEvent ke) {
    } // end of keyTyped

    public void keyReleased(KeyEvent ke) {
    } // end of keyReleased

    public void keyPressed(KeyEvent ke) {
        int keyCode = ke.getKeyCode();
        if ((keyCode == PG_UP) || (keyCode == PG_DN) || (keyCode == UP_ARROW) || (keyCode == DOWN_ARROW) || ((keyCode == A) && (ke.getModifiersEx() == CTRL))) {
            ke.consume();
        } else if ((keyCode == LEFT_ARROW) || (keyCode == BACKSPACE) || ((keyCode == H) && (ke.getModifiersEx() == CTRL))) {
            synchronized(this) {
                if (jta.getCaretPosition() <= initialCaretPosition) {
                    ke.consume();
                }
            } // end of synchronized block
        } else if (keyCode == HOME) {
            synchronized(this) {
                jta.setCaretPosition(initialCaretPosition);
                ke.consume();
            } // end of synchronized block
        } else if (keyCode == END) {
            synchronized(this) {
                jta.setCaretPosition(jta.getDocument().getLength());
                ke.consume();
            } // end of synchronized block
        } else if (keyCode == ENTER) {
            jta.setCaretPosition(jta.getDocument().getLength());
            synchronized(this) {
                currentCaretPosition = jta.getCaretPosition();

                // If character at initial caret position is newline then it means that the user has
                // pressed enter without enetring any other character. Also, the code gets called here
                // as soon as enter is pressed which means that the caret position (jta.getCaretPosition())
                // of the document will be incremented by 1 by the system after this code returns.
                // This means that if at initial caret position, the character is newline, then we must ignore
                // this enter and increment initial caret position by 1 and do not set inputAvailable to true.
                try {
                    String charAtInitialCaretPosition = jta.getText(initialCaretPosition, 1);
                    if ((charAtInitialCaretPosition.equals("\n")) == true) {
                        initialCaretPosition++;
                    }
                } catch (Exception e) {
                }
                /*
                debug: start
                try {
                    System.out.println("keyPressed (1): initial = " + initialCaretPosition + ", current = " + currentCaretPosition + ", System current = " + jta.getDocument().getLength());
                    String initialString = jta.getText(initialCaretPosition, 1);
                    String currentString = jta.getText(currentCaretPosition, 1);
                    System.out.println("char at initial = " + initialString + ", char at current = " + currentString);
                    if ((initialString.equals("\n")) == true) {
                        System.out.println("char at initial is newline");
                    }
                    if ((currentString.equals("\n")) == true) {
                        System.out.println("char at current is newline");
                    }
                } catch (Exception e) {
                }
                debug:end
                */

                if ((currentCaretPosition - initialCaretPosition) > 0) {
                    inputAvailable = true;
                    notifyAll();
                }
            } // end of synchronized block
        } // end of if else if
    } // end of keyPressed

    String getInputFromJTextArea(JTextArea jta) {
        int len = 0;
        String inputFromUser = "";
        while (true) {
            synchronized(this) {
                if (inputAvailable == true) {
                    len = currentCaretPosition - initialCaretPosition;

                    try {
                        inputFromUser = jta.getText(initialCaretPosition, len);
                        initialCaretPosition = currentCaretPosition;
                    } catch (Exception e) {
                        inputFromUser = "";
                        return inputFromUser;
                    } // end of outer try catch

                    /*
                    The following lines of code are not needed now.
                    if ((len == 1) && (inputFromUser.equals("\n")) == true) {
                        try {
                            wait();
                            continue;
                        } catch (Exception e) {
                        } // end of try catch
                    } else if (Character.compare(inputFromUser.charAt(0), '\n') == 0) { // matched
                        // remove first character from inputFromUser
                        inputFromUser = inputFromUser.substring(1);
                    }
                    */
                    inputAvailable = false;
                    return inputFromUser;
                } else {
                    try {
                        wait();
                        continue;
                    } catch (Exception e) {
                    } // end of try catch
                } // end of if else inputAvailable
            } // end of synchronized block
        } // end of while true
    } // end of getInoutFromJtextArea

    void outputToJTextArea(JTextArea jta, String text) {
        jta.append(text);
        jta.setCaretPosition(jta.getDocument().getLength());
        synchronized(this) {
            initialCaretPosition = jta.getCaretPosition();
        }
    } // end of outputToJTextArea

    void begin() {
        while (true) {
            outputToJTextArea(jta, "Enter some input (press enter after inputting): ");
            String input = getInputFromJTextArea(jta);
            outputToJTextArea(jta, "User input was: " + input + "\n\n");
        }
    } // end of begin

    void configureJTextAreaForInputOutput(JTextArea jta) {
        jta.addKeyListener(this);

        // remove all mouse listeners
        for (MouseListener listener : jta.getMouseListeners()) {
            //outputToJTextArea(jta, "\nRemoving mouse listener\n");
            jta.removeMouseListener(listener);
        }

        // remove all mouse motion listeners
        for (MouseMotionListener listener : jta.getMouseMotionListeners()) {
            //outputToJTextArea(jta, "\nRemoving mouse motion listener\n");
            jta.removeMouseMotionListener(listener);
        }

        // remove all mouse wheel listeners
        for (MouseWheelListener listener : jta.getMouseWheelListeners()) {
            //outputToJTextArea(jta, "\nRemoving mouse wheel listener\n");
            jta.removeMouseWheelListener(listener);
        }
    } // end of configureJTextAreaForInputOutput

    void createAndShowGUI() {
        title = "Console";
        jf = InitComponents.setupJFrameAndGet(title, screenWidth - 150, screenHeight - 100);

        jta = InitComponents.setupJTextAreaAndGet("", 1000, 100, true, true, true, false, 0, 0, 0, 0);
        configureJTextAreaForInputOutput(jta);

        jsp = InitComponents.setupScrollableJTextAreaAndGet(jta, 10, 10, screenWidth - 180, screenHeight - 180);
        jsp.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
        jsp.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        jf.add(jsp);
        //jf.setLocation(screenWidth / 5, screenHeight / 6);

        jmb = InitComponents.setupJMenuBarAndGet();
        jm = InitComponents.setupJMenuAndGet("Copy All to Clipboard");
        jm.setBorder(BorderFactory.createLineBorder(Color.green, 2));
        jmi = InitComponents.setupJMenuItemAndGet("Copy All to Clipboard");
        jm.add(jmi);
        jmb.add(jm);
        jmi.addActionListener(this);
        jf.setJMenuBar(jmb);

        jf.setVisible(true);
    } // end of createAndShowGUI

    public static void main(String[] args) {
        ConsoleForJARPrograms cfjp = new ConsoleForJARPrograms();
        cfjp.createAndShowGUI();
        cfjp.begin();
    } // end of main

} // end of ConsoleForJARPrograms

よろしく、アミット

1
Amit

これを実行する1つの方法は、コマンド「Java -jar filePath/yourfile.jar」(「」なし)で.batファイルを作成することです。必ずファイルパスを含めてください。そうしないと、ファイルが見つかりません。質問はすでに回答されていますが、これは簡単な方法です。

0
MK-ULTRA

私の最も簡単な方法は、jarファイルの簡単なショートカットを書くことだと思います。例えばEclipse(ほとんどのIDEと同様)は、必要なすべてのライブラリなどを含むjarファイルをエクスポートできるため、「Java -jar filePath/file.jar」(filePath:./bin/fileなど)のようなショートカットコマンドを設定するだけで済みます。 .jar)

0
khaos

SwingまたはAwtを使用して、TextPaneを使用して独自のウィンドウを作成できます。唯一の問題は、cmdのように入力して使用する方法です。しかし、あなたはいつでもアラートとすべてでこれを行うことができます...

他の方法では、バッチファイルから直接実行され、コンソールに表示されます。

また、ゲームをバッチで直接作成することも検討する必要があります...これは悪い言語ではなく、すべてのWindowsオペレーティングシステムに存在します。

(希望は役に立ちました(私が新しいからです)、そして私の英語はそれほど悪くありませんでした...)

  1. Launch4jを使用し、基本タブでexe名を出力ファイルに指定してから、jarファイルをjarタブにロードします。
  2. [ヘッダー]タブに移動し、[コンソール]を選択します。
  3. 次に、JREタブに移動し、JREバージョンを指定します(例:1.8.0)。
  4. 次に、ビルドラッパーボタン(設定アイコンの種類)をクリックします。
  5. ランダムな名前を付けて[保存]をクリックするだけで、xamlファイルを保存するように求められます。
  6. 最後に.exeが作成され、今すぐ実行できます。
0
codemyway

別の方法を見つけました...たとえば、パッケージbarにクラスfooを持つプロジェクトmyprojectの場合:

Java -cp myproject.jar; bar.foo
0
nethrandir