我正在制作纸牌游戏,当选择卡片时,按钮上的ImageIcon应该会改变。当我点击它们以便它们工作正常时,但是当我按顺序点击它们时,有时需要两次点击才能更新图像。如何解决此问题,以便在第一次点击时更新?另外,在旁注中,除了为每个按钮创建if语句之外,还有更有效的方法来更新按钮吗?这是我的代码:
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class Board extends JFrame implements ActionListener {
Deck deck = new Deck();
Card card;
JPanel buttonPanel = new JPanel();
JPanel menuPanel = new JPanel();
JButton cardOne = new JButton();
JButton cardTwo = new JButton();
JButton cardThree = new JButton();
JButton cardFour = new JButton();
JButton cardFive = new JButton();
JButton cardSix = new JButton();
JButton cardSeven = new JButton();
JButton[] buttons = {cardOne, cardTwo, cardThree, cardFour, cardFive, cardSix, cardSeven};
int winCount = 0;
int lossCount = 0;
JButton replace = new JButton("Replace");
JButton reset = new JButton("Reset");
JLabel cardsLeft = new JLabel("Cards left:" + deck.size());
JLabel winLossLabel = new JLabel("Win: " + winCount + "\tLoss: " + lossCount);
public Board() {
initGUI();
}
ArrayList<Card> boardArray = new ArrayList<>();
public void startGame() {
deck.shuffle();
Card card;
for(int i = 0 ; i <=6 ; i++) {
boardArray.add(card = deck.nextCard());
buttons[i].setIcon(card.cardImage);
}
System.out.println(deck.toString());
}
public void initGUI() {
setTitle("Elevens");
setLayout(new GridLayout(1,2));
buttonPanel.setLayout(new GridLayout(2,4));
menuPanel.setLayout(new GridLayout(4,1));
setResizable(false);
buttonPanel.add(cardOne);
buttonPanel.add(cardTwo);
buttonPanel.add(cardThree);
buttonPanel.add(cardFour);
buttonPanel.add(cardFive);
buttonPanel.add(cardSix);
buttonPanel.add(cardSeven);
menuPanel.add(replace);
menuPanel.add(reset);
menuPanel.add(cardsLeft);
menuPanel.add(winLossLabel);
add(buttonPanel);
add(menuPanel);
for(int i = 0; i < buttons.length; i++){
buttons[i].addActionListener(this);
}
replace.setSize(new Dimension (100,10));
pack();
setVisible(true);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(600,300);
}
ImageIcon selectedIcon;
Boolean selected = false;
String newPathString;
int buttonNumber;
public void getPath(int buttonNumber) {
String pathString = boardArray.get(buttonNumber).cardImage.toString();
String path = "/Users/AlecRodgers/Documents/workspace/Elevens Lab Midyear Exam/src/";
if(boardArray.get(buttonNumber).rank() == "Ace" || boardArray.get(buttonNumber).rank() == "Jack" || boardArray.get(buttonNumber).rank() == "Queen" || boardArray.get(buttonNumber).rank() == "King") {
newPathString = path + boardArray.get(buttonNumber).rank() + boardArray.get(buttonNumber).suit() + "S.GIF";
}else{
newPathString = path + Integer.toString(boardArray.get(buttonNumber).pointValue()) + boardArray.get(buttonNumber).suit() + "S.GIF";
}
selectedIcon = new ImageIcon(newPathString);
}
public void actionPerformed(ActionEvent e) {
if(e.getSource() == buttons) {
}
if(e.getSource() == cardOne) {
if(selected == false) {
getPath(0);
buttons[0].setIcon(selectedIcon);
selected = true;
}else{
selected = false;
buttons[0].setIcon(boardArray.get(0).cardImage);
}
}
if(e.getSource() == cardTwo) {
if(selected == false) {
getPath(1);
buttons[1].setIcon(selectedIcon);
selected = true;
}else{
selected = false;
buttons[1].setIcon(boardArray.get(1).cardImage);
}
}
if(e.getSource() == cardThree) {
if(selected == false) {
getPath(2);
buttons[2].setIcon(selectedIcon);
selected = true;
}else{
selected = false;
buttons[2].setIcon(boardArray.get(2).cardImage);
}
}
if(e.getSource() == cardFour) {
if(selected == false) {
getPath(3);
buttons[3].setIcon(selectedIcon);
selected = true;
}else{
selected = false;
buttons[3].setIcon(boardArray.get(3).cardImage);
}
}
if(e.getSource() == cardFive) {
if(selected == false) {
getPath(4);
buttons[4].setIcon(selectedIcon);
selected = true;
}else{
selected = false;
buttons[4].setIcon(boardArray.get(4).cardImage);
}
}
if(e.getSource() == cardSix) {
if(selected == false) {
getPath(5);
buttons[5].setIcon(selectedIcon);
selected = true;
}else{
selected = false;
buttons[5].setIcon(boardArray.get(5).cardImage);
}
}
if(e.getSource() == cardSeven) {
if(selected == false) {
getPath(6);
buttons[6].setIcon(selectedIcon);
selected = true;
}else{
selected = false;
buttons[6].setIcon(boardArray.get(6).cardImage);
}
}
}
}
答案 0 :(得分:0)
您可以为每个JButton添加不同的ActionListener,而不是共享同一个实例:
for (int i = 0; i < buttons.length; i++) {
final int index = i;
final JButton b = buttons[index];
b.addActionListener(new ActionListener() {
@Override
public void actionPerformed(final ActionEvent e) {
if (selected == false) {
getPath(index);
b.setIcon(selectedIcon);
selected = true;
} else {
selected = false;
b.setIcon(boardArray.get(index).cardImage);
}
}
});
}