これが私が作っている 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