-2

重複の可能性:
GUIを使用したJavaハングマンゲーム、数値のインクリメント/デクリメントに関する問題

ですから、問題は、私がスイングを吸うことです。キーリスナーを操作する方法がわかりません。キーリスナーは、キーを何度も聞き始めます(2番目のゲームの後に2つのキー、3番目のゲームの後に3つのキーなど)。イベントディスパッチスレッドを適切に操作する方法がわからない、またはそれを使用する必要がある場合でも、勝ち/負けのカウントが誤って増加します。さらに、フレームにキーボード入力をリッスンさせたい場合は、ウィンドウでフォーカスを要求しますが、フレームにキーボード入力を読み取らせたくない場合は、フォーカスを解除する方法がわかりません。どんな助けでも大歓迎です。この質問をするのは今回が2回目ですが、今回はプログラムと問題をもう少しわかりやすくしたことを願っています。編集:ゲームが動作するようになり、ログファイルを書き込むbufferedwriterも追加されました。申し訳ありませんが、リトアニア語であるため、コードの一部の名前を英語に変更するには怠惰でした。

import java.io.*;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.*;

public class Hangman {

    static int won = 0;
    static int lost = 0;
    static String key = "";
    static String word = null;
    static int no = 0;
    static StringBuffer toguess;
    static KeyboardFocusManager manager;
    static Runnable hangman;
    static ArrayList<String> tried;
    static int gamecount = 0;

    @SuppressWarnings("resource")
    public static void main(String[] args) throws IOException {
        FileWriter filewriter = new FileWriter("rezultatai.txt", true);
        final BufferedWriter writer = new BufferedWriter(filewriter);
        final DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        final Date date = new Date();
        hangman = new Runnable() {

            public void run() {
                final JFrame frame = new JFrame();
                frame.setLayout(new GridLayout(4, 1));
                final JLabel label = new JLabel();
                label.setFont(new Font("Serif", Font.BOLD, 48));
                label.setForeground(Color.GREEN);
                label.setText("Kaledines kartuves");
                final JPanel panel1 = new JPanel();
                final JPanel panel2 = new JPanel();
                final JPanel panel3 = new JPanel();
                final JPanel panel4 = new JPanel();
                final JLabel label3 = new JLabel();
                panel1.add(label);
                panel4.add(label3);
                final JLabel label2 = new JLabel();
                frame.setVisible(true);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                final JButton button = new JButton("Pradeti");
                panel2.add(button);
                frame.add(panel1);
                frame.add(panel2);
                frame.add(panel3);
                frame.setSize(800, 600);
                button.addActionListener(new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        gamecount = gamecount + 1;
                        no = 0;
                        label3.setText("6 tries left");
                        frame.add(panel4);
                        frame.setFocusable(true);
                        frame.requestFocusInWindow();
                        label2.setText("won " + won + ", lost " + lost);
                        panel3.add(label2);
                        button.setText("Sekantis");
                        BufferedReader reader = null;
                        try {
                            reader = new BufferedReader(new FileReader("hangeng.txt"));
                        } catch (FileNotFoundException e1) {
                            e1.printStackTrace();
                        }
                        int lineno = (int) (Math.random() * 167);
                        for (int i = 0; i < lineno; i++) {
                            try {
                                reader.readLine();
                            } catch (IOException e1) {
                                e1.printStackTrace();
                            }
                        }
                        word = null;
                        try {
                            word = reader.readLine().replace(" ", "");
                        } catch (IOException e1) {
                            e1.printStackTrace();
                        }
                        String missing = "";
                        for (int u = 0; u < (word.length() - 2); u++) {
                            missing = missing + "*";
                        }
                        final String guess = word.charAt(0) + missing
                                + word.charAt((word.length() - 1));
                        toguess = new StringBuffer(guess);
                        label.setText(toguess.toString());
                        tried = new ArrayList<String>();
                    }
                });
                frame.addKeyListener(new KeyListener() {

                    @Override
                    public void keyPressed(KeyEvent e) {
                    }

                    @Override
                    public void keyReleased(KeyEvent e) {
                    }

                    @Override
                    public void keyTyped(KeyEvent e) {
                        if ((no == 6) && (!(toguess.toString().equals(word)))) {
                            frame.setFocusable(false);
                            button.requestFocusInWindow();
                            label.setText("Deja, bet zodis buvo " + word);
                            lost = lost + 1;
                        }
                        key = String.valueOf(e.getKeyChar());
                        String guessing = key;
                        Boolean k = false;
                        if ((no < 6)) {
                            k = false;
                            if (!(tried.contains(guessing))) {
                                tried.add(guessing);
                                for (int length = 1; length < (word.length()
                                        - 1); length++) {
                                    if (guessing.equals(word.substring(length,
                                            (length + 1)))) {
                                        toguess.replace(length, (length + 1),
                                                String.valueOf(word.charAt(length)));
                                        k = true;
                                    }
                                }
                                if (k == false) {
                                    no = no + 1;
                                }
                            }
                            label.setText(toguess.toString());
                            if (toguess.toString().equals(word)) {
                                label.setText("Teisingai! Zodis buvo " + word);
                                frame.setFocusable(false);
                                button.requestFocusInWindow();
                                no = 6;
                                won = won + 1;
                            }
                        }
                        label3.setText((6 - no) + " tries left");
                    }
                });
                frame.addWindowListener(new java.awt.event.WindowAdapter() {

                    @Override
                    public void windowClosing(java.awt.event.WindowEvent windowEvent) {
                        try {
                            writer.write(System.getProperty("line.separator")
                                    + dateFormat.format(date)
                                    + System.getProperty("line.separator")
                                    + (gamecount - 1) + " games played, "
                                    + lost + " lost " + won + " won");
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        try {
                            writer.flush();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        try {
                            writer.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                });
            }
        };
        hangman.run();
    }
}
4

1 に答える 1

3

正しい軌道に乗るためのヒント:

  1. actionPerformed()メソッドのフレームにキー リスナーを追加しています。これは、ボタンがクリックされるたびに、新しいキー リスナーがフレームに追加されることを意味します。キー リスナーは、フレームの初期化時に 1 回だけ追加する必要があります。

  2. キーの押下をリッスンしたくない場合は、keyTypedIgnoredフラグを true に設定できます。キー リスナーでは、このフラグが true の場合、イベントを無視します。false に設定されている場合は、何かを実行します。

  3. EDT に関しては、はい、すべてのスイング操作は EDT で行う必要があります。Runnable は、 Swing チュートリアルSwingUtilities.invokeLater(runnable)で説明されているように、を使用して呼び出す必要があります。

最後に、おそらく最も重要なアドバイスは、1 つの巨大な方法ですべてを実行しないことです。特定のタスクを実行するオブジェクトとメソッドのコードを分離します。コードを読みやすくするために、いくつかの空白行を追加します。コードを適切にインデントします。

于 2012-12-25T20:01:21.197 に答える