1

基本的に、JButton の 1 つをクリックするたびに、ロックアップします。調べてみると、無限ループが原因かもしれないことがわかりましたが、どこにも見当たりません。

新鮮な目はとても重宝します!

とにかく、宣言されているJButtonは次のとおりです。

public static JButton textYes = new JButton("Yes");
public static JButton textNo = new JButton("No");

ここに私の main() メソッドがあります:

public static void main(String[] args) throws IOException {
    Greed gui = new Greed();
    gui.launchFrame();
    redirectSystemStreams();

    Container contentPane = f.getContentPane();
    contentPane.add(new Greed());

    Scanner is = new Scanner(System.in);
    System.out.println("Welcome to Greed...");
        //do {
    System.out.println("Would you like to play? (yes/no)");
    area = "menu";
    menu = is.next();
}

Start() メソッドは次のとおりです。

public static void start(String menu) {
            switch (menu) {
                case "yes":
                    jTextArea1.setText(null);
                    diceOne = 0;
                    diceTwo = 0;
                    diceThree = 0;
                    diceFour = 0;
                    diceFive = 0;
                    System.out.println("Rolling...");
                    Game();

                    break;
                case "no":
                    System.out.println("Goodbye...");
                    System.exit(0);

                    break;
                default:
                    invalidInput();

                    break;
            }
}

JButton リスナーを使用した actionPerformed() メソッドは次のとおりです。

public void actionPerformed(ActionEvent e) {
    //jTextArea1.setText(null);
    if (box1.isSelected()) {
        System.out.println("1 is selected");
        willRerollDiceOne = true;
    }
    else {
        //System.out.println("1 not selected");
        willRerollDiceOne = false;
    }
    if (box2.isSelected()) {
        System.out.println("2 is selected");
        willRerollDiceTwo = true;
    }
    else {
        //System.out.println("2 not selected");
        willRerollDiceTwo = false;
    }
    if (box3.isSelected()) {
        System.out.println("3 is selected");
        willRerollDiceThree = true;
    }
    else {
        //System.out.println("3 not selected");
        willRerollDiceThree = false;
    }
    if (box4.isSelected()) {
        System.out.println("4 is selected");
        willRerollDiceFour = true;
    }
    else {
        //System.out.println("4 not selected");
        willRerollDiceFour = false;
    }
    if (box5.isSelected()) {
        System.out.println("5 is selected");
        willRerollDiceFive = true;
    }
    else {
        //System.out.println("5 not selected");
        willRerollDiceFive = false;
    }

    if ("menu".equals(area)) {
        if(e.getSource() == textYes){
            start("yes");
        }
        if(e.getSource() == textNo){
            start("no");
        }
    }
    if ("choiceReroll".equals(area)) {
        if(e.getSource() == textYes){
            choiceReroll = "yes";
        }
        if(e.getSource() == textNo){
            choiceReroll = "no";
        }
    }
}

私はそれが何らかの形でJButtonsに接続されていると考えています。

さらにコードを表示する必要がある場合はお知らせください。

とにかく、どんな助けも大歓迎です!

ご協力いただき、ありがとうございました。

編集: 申し訳ありませんが、JBUttons にアタッチされているリスナーを表示するのを忘れていました:

textYes.addActionListener(this);
textNo.addActionListener(this);

編集:また、ここに Game() メソッドがあります:

public static void Game() {
    rollDiceOne();
    rollDiceTwo();
    rollDiceThree();
    rollDiceFour();
    rollDiceFive();

    displayDiceValues();
    f.validate();
    f.repaint();

    choiceRerollDice();
}

そして rollDice# メソッド:

public static void rollDiceOne() {
    diceOne = 1 + (int)(Math.random()*6);
}
public static void rollDiceTwo() {
    diceTwo = 1 + (int)(Math.random()*6);
}
public static void rollDiceThree() {
    diceThree = 1 + (int)(Math.random()*6);
}
public static void rollDiceFour() {
    diceFour = 1 + (int)(Math.random()*6);
}
public static void rollDiceFive() {
    diceFive = 1 + (int)(Math.random()*6);
}
4

3 に答える 3

2

choiceRerollDiceがスキャナーを使用してユーザーからの入力を読み取っているため、イベント ディスパッチ スレッドがブロックされ、再描画が妨げられていると思われます。

CLI パラダイムと GUI パラダイムを混在させているため、やはり疑問が生じますが、なぜですか?

グラフィカル インターフェイスを使用する場合は、CLI スタイルの入力 (つまりScanner) を使用しないでください。代わりに、ボタンやテキスト フィールドなど、利用可能なグラフィカル コントロールを使用する必要があります。

于 2013-06-20T21:42:03.903 に答える
1

ボタンにリスナーをアタッチしていないように見えますが、代わりに System.in から読み取ろうとしています。その場合、プログラムはハングし、System.in からの入力を待ちます。

持つ代わりに

Scanner is = new Scanner(System.in);
...
area = "menu";
menu = is.next();

ボタンで actionListeners を使用します。

textYes.addActionListener(/*Your Action Listener*/);
...

編集 - ActionListeners がアタッチされていても、入力ストリームから読み取ろうとして Scanner 行にハングアップします。これらの行を削除すると修正されます。

于 2013-06-20T19:50:19.670 に答える