2

これが私が作っている Connect Four プログラムです。これまでのところ、空の (適格な) スロットにチェッカーを追加でき、毎回赤と黒を交互に使用できます。これは私の最初の swing プログラムであるため、私のコードは非常に非効率的である可能性があります。ただし、私の唯一の大きな問題は、空のスロットをクリックした後に GUI を更新できないことです。validate() を試しましたが、何もしていないようです。プログラムで使用されている画像へのリンクは以下にあります。助けてくれてどうもありがとう!

import java.awt.Container;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Scanner;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;

import javax.swing.*;

public class GameFrame extends JFrame {

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    frame = new GameFrame();
                    frame.setContentPane(new JLabel(new ImageIcon(getClass()
                            .getResource("675 x 588 Connect Four.png"))));
                    frame.addSlots();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */

    static GameFrame frame;
    private static Icon slotForButton;
    public static JButton slotButton;
    static private JButton[] slot = new JButton[42];
    static private String[] slotColor = new String[42];
    static boolean turn = true;
    static boolean legitClick;
    static String slotClicked;
    static int slotNum;
    static Container gamePane;

    public GameFrame() {
        setBounds(100, 100, 685, 622);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);
        super.setTitle("Connect Four by Joel Christophel");
    }

    void addSlots() {
        ButtonHandler bh = new ButtonHandler();
        gamePane = getContentPane();
        gamePane.setLayout(new GridLayout(6, 6));
        int counter = 0;

        for (JButton e : slot) {
            slot[counter] = makeSlot("white");
            slot[counter].setBorderPainted(false);
            slot[counter].setContentAreaFilled(false);
            slot[counter].setFocusPainted(false);
            slot[counter].setActionCommand(counter + "");
            slotColor[counter] = "white";

            slot[counter].addActionListener(bh);
            add(slot[counter]);

            counter++;
        }
    }

    static JButton makeSlot(String color) {

        if (color.equals("white")) {
            slotForButton = new ImageIcon(
                    GameFrame.class.getResource("Space.png"));
        }

        else if (color.equals("red")) {
            slotForButton = new ImageIcon(
                    GameFrame.class.getResource("Red Checker.png"));
        }

        else if (color.equals("black")) {
            slotForButton = new ImageIcon(
                    GameFrame.class.getResource("Black Checker.png"));
        }

        slotButton = new JButton(slotForButton);

        return slotButton;
    }

    private class ButtonHandler implements ActionListener {

        public void actionPerformed(ActionEvent e) {
            slotClicked = e.getActionCommand();

            GameFrame.legitClick(slotClicked);
        }

    }

    private static void changeTurn() {
        turn = !turn; // true is red's turn; false is black's
    }

    private static void legitClick(String slotClicked1) {
        legitClick = false;

        slotClicked = slotClicked1;
        Scanner numScan = new Scanner(slotClicked);
        slotNum = numScan.nextInt();

        try {
            if (!slotColor[slotNum + 7].equals("white")&&slotColor[slotNum].equals("white")) {
                legitClick = true;
            }
        }

        catch (ArrayIndexOutOfBoundsException t) {

            if (slotColor[slotNum].equals("white")) {
                legitClick = true;
            }
        }

        if (legitClick == true) {
            if (turn == true) {
                slot[slotNum] = makeSlot("red");
                slotColor[slotNum] = "red";
                System.out.println("Put " + slotColor[slotNum] + " checker     in slot number " + slotNum + ".");
            }

            else if (turn == false) {
                slot[slotNum] = makeSlot("black");
                slotColor[slotNum] = "black";
                System.out.println("Put " + slotColor[slotNum] + " checker      in slot number " + slotNum + ".");
            }

            gamePane.validate();
            GameFrame.changeTurn();
        }
        System.out.println(turn);
    }

}

http://i.stack.imgur.com/8cNB3.png 675 x 588 Connect Four.png

http://i.stack.imgur.com/6oX7A.pngブラックチェッカー.png

http://i.stack.imgur.com/cdF7u.png Red Checker.png

http://i.stack.imgur.com/JNT61.png Space.png

4

2 に答える 2

3

2つのこと、コードで間違っているように見えます。

  • 最初に、 legitClick()メソッド内で指定した条件を確認してください 。いつクリックしても、常に false (legitClick) が返されます。したがって、ビューに変更は表示されません。
  • の中に新しいJButtonmakeSlot()を作成しているように見えますが、これはまさにあなたが望むものではありません。新しい JButton を作成する代わりに、それぞれのJButtonのIconを変更するだけです。

makeSlot()メソッドとメソッド内のコードを少しlegitClick()変更しましたが、チェッカーの仕組みがわからないため、ロジックを実際に希望どおりに機能させるには自分でロジックを変更する必要があります :(

import java.awt.Container;
import java.awt.EventQueue;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Scanner;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;

import javax.swing.*;

public class GameFrame extends JFrame {

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    frame = new GameFrame();
                    frame.setContentPane(new JLabel(new ImageIcon(getClass()
                            .getResource("/image/675 x 588 Connect Four.png"))));
                    frame.addSlots();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */

    static GameFrame frame;
    private static Icon slotForButton;
    public static JButton slotButton;
    static private JButton[] slot = new JButton[42];
    static private String[] slotColor = new String[42];
    static boolean turn = true;
    static boolean legitClick;
    static String slotClicked;
    static int slotNum;
    static Container gamePane;

    public GameFrame() {
        setBounds(100, 100, 685, 622);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setResizable(false);
        super.setTitle("Connect Four by Joel Christophel");
    }

    void addSlots() {
        ButtonHandler bh = new ButtonHandler();
        gamePane = getContentPane();
        gamePane.setLayout(new GridLayout(6, 6));

        for (int counter = 0; counter < slot.length; counter++) {
            // Added by me.
            slot[counter] = new JButton();
            slot[counter].setIcon(makeSlot("white", counter));
            slot[counter].setBorderPainted(false);
            slot[counter].setContentAreaFilled(false);
            slot[counter].setFocusPainted(false);
            slot[counter].setActionCommand(counter + "");
            slotColor[counter] = "white";

            slot[counter].addActionListener(bh);
            add(slot[counter]);

            //counter++;
        }
    }

    static Icon makeSlot(String color, int index) {

        if (color.equals("white")) {
            slotForButton = new ImageIcon(
                    GameFrame.class.getResource("/image/Space.png"));
        }

        else if (color.equals("red")) {
            slotForButton = new ImageIcon(
                    GameFrame.class.getResource("/image/Red Checker.png"));
        }

        else if (color.equals("black")) {
            slotForButton = new ImageIcon(
                    GameFrame.class.getResource("/image/Black Checker.png"));
        }

        //slot[index].setIcon(slotForButton);

        return slotForButton;
    }

    private class ButtonHandler implements ActionListener {

        public void actionPerformed(ActionEvent e) {
            slotClicked = e.getActionCommand();

            GameFrame.legitClick(slotClicked);
        }

    }

    private static void changeTurn() {
        turn = !turn; // true is red's turn; false is black's
    }

    private static void legitClick(String slotClicked1) {
        legitClick = false;

        slotClicked = slotClicked1;
        Scanner numScan = new Scanner(slotClicked);
        slotNum = numScan.nextInt();

        try {
            if (slotColor[slotNum + 7].equals("white")&&slotColor[slotNum].equals("white")) {
                legitClick = true;
            }
        }

        catch (ArrayIndexOutOfBoundsException t) {

            if (slotColor[slotNum].equals("white")) {
                legitClick = true;
            }
        }

        /*
         * This variable is used to tell
         * makeSlot that the JButton at
         * this index is pressed. So
         * simply change the Icon for this
         * JButton, instead of adding a new 
         * JButton.
         */
        int index = Integer.parseInt(slotClicked1);

        if (legitClick == true) {
            if (turn == true) {
                slot[index].setIcon(makeSlot("red", index));
                slotColor[slotNum] = "red";
                System.out.println("Put " + slotColor[slotNum] + " checker     in slot number " + slotNum + ".");
            }

            else if (turn == false) {
                slot[index].setIcon(makeSlot("black", index));
                slotColor[slotNum] = "black";
                System.out.println("Put " + slotColor[slotNum] + " checker      in slot number " + slotNum + ".");
            }

            //gamePane.validate();
            GameFrame.changeTurn();
        }
        System.out.println(turn);
    }

}
于 2012-10-02T04:42:15.073 に答える
1

簡単な答えは、このコード行を後に追加することですgamePane.validate();

gamePane.repaint();

正解は、SwingWorkerの使い方を学ぶことです

于 2012-10-02T00:17:17.153 に答える