GUI有时需要两次点击才能更新?

时间:2015-01-17 22:11:39

标签: java swing user-interface

我正在制作纸牌游戏,当选择卡片时,按钮上的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);
            }

        }


    }

}

1 个答案:

答案 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);
                }
            }
        });
}