更改JButton的图标

时间:2014-04-03 23:16:01

标签: java image swing jbutton imageicon

所以我试图创建一个使用可能的插槽作为按钮的tic tac toe游戏。在游戏开始时,按钮被设置为空白图像作为其图标。单击按钮时,我尝试将按钮图标更改为相应的图像(x或o),但是单击按钮时图像不会更改?我哪里错了?

package game;

import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.URL;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants  ;

public class TicTacToe extends JFrame {

private static final String TITLE = "Tic Tac Toe";
private static final int width = 600;
private static final int height = 800;

private Container content;
private JButton exitbutton;
private JButton initbutton;
private JButton[] spaces = new JButton[9];
private CellButtonHandler[] cellHandler = new CellButtonHandler[9];
private InitButtonHandler inithandler;
private ExitButtonHandler exithandler;
private JLabel turn;
private URL base;
private Image o, x, blank;
private Font myfont = new Font("Times New Roman", Font.BOLD, 78);
private ImageIcon icon = new ImageIcon("data/blankButton.png");
private ImageIcon iconx = new ImageIcon("data/x.png");
private ImageIcon icono = new ImageIcon("data/o.gif");

private boolean gameover;
private boolean turnX;

public TicTacToe() {
    setTitle(TITLE);
    setSize(width, height);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setVisible(true);

    content = getContentPane();
    content.setBackground(Color.black);

    content.setLayout(new GridLayout(4, 3));

    for (int i = 0; i < spaces.length; i++) {
        spaces[i] = new JButton();
        cellHandler[i] = new CellButtonHandler();
        spaces[i].addActionListener(cellHandler[i]);
    }

    exitbutton = new JButton("Exit");
    exithandler = new ExitButtonHandler();
    exitbutton.addActionListener(exithandler);
    initbutton = new JButton("Clear");
    inithandler = new InitButtonHandler();
    initbutton.addActionListener(inithandler);

    turn = new JLabel("X's turn", SwingConstants.CENTER);
    turn.setForeground(Color.white);

    for (int i = 0; i < spaces.length; i++) {
        spaces[i].setBackground(Color.white);
        content.add(spaces[i]);
    }

    content.add(initbutton);
    content.add(turn);
    content.add(exitbutton);

    init();
}

public void init() {
    turnX = true;
    gameover = false;
    spaces[0].setIcon(icon);
    spaces[1].setIcon(icon);
    spaces[2].setIcon(icon);
    spaces[3].setIcon(icon);
    spaces[4].setIcon(icon);
    spaces[5].setIcon(icon);
    spaces[6].setIcon(icon);
    spaces[7].setIcon(icon);
    spaces[8].setIcon(icon);

    turn.setText("X's turn");

    setVisible(true);

}

public static void main(String[] args) {
    TicTacToe game = new TicTacToe();
}

private class CellButtonHandler implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        if (gameover) {
            return;
        }

        JButton pressed = (JButton) (e.getSource());

        if (pressed.getIcon().equals(icono) || pressed.getIcon().equals(iconx)) {
            return;
        }

        if (turnX) {
            pressed.setIcon(iconx);
        } else {
            pressed.setIcon(icono);
        }

        if (checkwinnerO()) {
            gameover = true;
            turn.setText("O Wins!");
            } 

        if(checkwinnerX()){
            gameover = true;
            turn.setText("X Wins!");
        }
    }
}

private class ExitButtonHandler implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        System.exit(0);
    }
}

private class InitButtonHandler implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        init();
    }
}

public boolean checkwinnerO() {
    if (spaces[0].getIcon().equals(icono)
            && spaces[1].getIcon().equals(icono) && spaces[2].getIcon().equals(icono)) {
        return true;
    } else if (spaces[3].getIcon().equals(icono)
            && spaces[4].getIcon().equals(icono) && spaces[5].getIcon().equals(icono)) {
        return true;
    } else if (spaces[6].getIcon().equals(icono)
            && spaces[7].getIcon().equals(icono) && spaces[8].getIcon().equals(icono)) {
        return true;
    } else if (spaces[0].getIcon().equals(icono)
            && spaces[3].getIcon().equals(icono) && spaces[6].getIcon().equals(icono)) {
        return true;
    } else if (spaces[1].getIcon().equals(icono)
            && spaces[4].getIcon().equals(icono) && spaces[7].getIcon().equals(icono)) {
        return true;
    } else if (spaces[2].getIcon().equals(icono)
            && spaces[5].getIcon().equals(icono) && spaces[8].getIcon().equals(icono)) {
        return true;
    } else if (spaces[0].getIcon().equals(icono)
            && spaces[4].getIcon().equals(icono) && spaces[8].getIcon().equals(icono)) {
        return true;
    } else if (spaces[2].getIcon().equals(icono)
            && spaces[4].getIcon().equals(icono) && spaces[6].getIcon().equals(icono)) {
        return true;
    } else 

        return false;
}

public boolean checkwinnerX() {
    if (spaces[0].getIcon().equals(iconx)
            && spaces[1].getIcon().equals(iconx) && spaces[2].getIcon().equals(iconx)) {
        return true;
    } else if (spaces[3].getIcon().equals(iconx)
            && spaces[4].getIcon().equals(iconx) && spaces[5].getIcon().equals(iconx)) {
        return true;
    } else if (spaces[6].getIcon().equals(iconx)
            && spaces[7].getIcon().equals(iconx) && spaces[8].getIcon().equals(iconx)) {
        return true;
    } else if (spaces[0].getIcon().equals(iconx)
            && spaces[3].getIcon().equals(iconx) && spaces[6].getIcon().equals(iconx)) {
        return true;
    } else if (spaces[1].getIcon().equals(iconx)
            && spaces[4].getIcon().equals(iconx) && spaces[7].getIcon().equals(iconx)) {
        return true;
    } else if (spaces[2].getIcon().equals(iconx)
            && spaces[5].getIcon().equals(iconx) && spaces[8].getIcon().equals(iconx)) {
        return true;
    } else if (spaces[0].getIcon().equals(iconx)
            && spaces[4].getIcon().equals(iconx) && spaces[8].getIcon().equals(iconx)) {
        return true;
    } else if (spaces[2].getIcon().equals(iconx)
            && spaces[4].getIcon().equals(iconx) && spaces[6].getIcon().equals(iconx)) {
        return true;
    } else 

        return false;

}
}
  1. 初始化图像图标。
  2. 我的init方法将每个按钮图标设置为空白图像。
  3. 我的CellHandlerMethod处理单击时空白图像和图像(x或o)之间的变化。

1 个答案:

答案 0 :(得分:4)

这个输出肯定显示了游戏逻辑的问题。

Tic Tac Toe

请注意,当单击(/)按钮时, 会从红色方块(表示空白&#39;)更改为绿色圆圈。但它永远不会从玩家X翻转到玩家Y(反之亦然)。

至于为什么你没有看到 任何 更改,我只能总结三件事之一:

  1. 图像不在您认为的位置。
  2. 图片没有按照您的想法命名。 (E.G。x.png != X.png || x.PNG
  3. 图像未使用Java理解的内部格式。请尝试直接在JOptionPane
  4. 中显示它们

    提示

    请勿使用ImageIcon加载图片,但不会提供反馈。而是使用提供大量有用反馈的ImageIO.read(..)

    来源

    这是使用的略微改变的来源。它热链接到3个图像(以便代码的用户可以看到它工作或失败)。

    import java.awt.*;
    import java.awt.event.*;
    import java.net.URL;
    import javax.swing.*;
    
    public class TicTacToe extends JFrame {
    
    private static final String TITLE = "Tic Tac Toe";
    private static final int width = 600;
    private static final int height = 800;
    
    private Container content;
    private JButton exitbutton;
    private JButton initbutton;
    private JButton[] spaces = new JButton[9];
    private CellButtonHandler[] cellHandler = new CellButtonHandler[9];
    private InitButtonHandler inithandler;
    private ExitButtonHandler exithandler;
    private JLabel turn;
    private URL base;
    private Image o, x, blank;
    private Font myfont = new Font("Times New Roman", Font.BOLD, 78);
    private ImageIcon icon;
    private ImageIcon iconx;
    private ImageIcon icono;
    
    private boolean gameover;
    private boolean turnX;
    
    public TicTacToe() {
        setTitle(TITLE);
        try {
            URL url = new URL("http://i.stack.imgur.com/F0JHK.png");
            icon = new ImageIcon(url);
            URL urlx = new URL("http://i.stack.imgur.com/T5uTa.png");
            iconx = new ImageIcon(urlx);
            URL urlo = new URL("http://i.stack.imgur.com/yoKxT.png");
            icono = new ImageIcon(urlo);
        } catch (Exception e) {
            e.printStackTrace();
        }
        setSize(width, height);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    
        content = getContentPane();
        content.setBackground(Color.black);
    
        content.setLayout(new GridLayout(4, 3));
    
        for (int i = 0; i < spaces.length; i++) {
            spaces[i] = new JButton();
            cellHandler[i] = new CellButtonHandler();
            spaces[i].addActionListener(cellHandler[i]);
        }
    
        exitbutton = new JButton("Exit");
        exithandler = new ExitButtonHandler();
        exitbutton.addActionListener(exithandler);
        initbutton = new JButton("Clear");
        inithandler = new InitButtonHandler();
        initbutton.addActionListener(inithandler);
    
        turn = new JLabel("X's turn", SwingConstants.CENTER);
        turn.setForeground(Color.white);
    
        for (int i = 0; i < spaces.length; i++) {
            spaces[i].setBackground(Color.white);
            content.add(spaces[i]);
        }
    
        content.add(initbutton);
        content.add(turn);
        content.add(exitbutton);
    
        init();
    }
    
    public void init() {
        turnX = true;
        gameover = false;
        spaces[0].setIcon(icon);
        spaces[1].setIcon(icon);
        spaces[2].setIcon(icon);
        spaces[3].setIcon(icon);
        spaces[4].setIcon(icon);
        spaces[5].setIcon(icon);
        spaces[6].setIcon(icon);
        spaces[7].setIcon(icon);
        spaces[8].setIcon(icon);
    
        turn.setText("X's turn");
    
        setVisible(true);
    
    }
    
    public static void main(String[] args) {
        TicTacToe game = new TicTacToe();
    }
    
    private class CellButtonHandler implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            if (gameover) {
                return;
            }
    
            JButton pressed = (JButton) (e.getSource());
    
            if (pressed.getIcon().equals(icono) || pressed.getIcon().equals(iconx)) {
                return;
            }
    
            if (turnX) {
                pressed.setIcon(iconx);
            } else {
                pressed.setIcon(icono);
            }
    
            if (checkwinnerO()) {
                gameover = true;
                turn.setText("O Wins!");
                }
    
            if(checkwinnerX()){
                gameover = true;
                turn.setText("X Wins!");
            }
        }
    }
    
    private class ExitButtonHandler implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            System.exit(0);
        }
    }
    
    private class InitButtonHandler implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            init();
        }
    }
    
    public boolean checkwinnerO() {
        if (spaces[0].getIcon().equals(icono)
                && spaces[1].getIcon().equals(icono) && spaces[2].getIcon().equals(icono)) {
            return true;
        } else if (spaces[3].getIcon().equals(icono)
                && spaces[4].getIcon().equals(icono) && spaces[5].getIcon().equals(icono)) {
            return true;
        } else if (spaces[6].getIcon().equals(icono)
                && spaces[7].getIcon().equals(icono) && spaces[8].getIcon().equals(icono)) {
            return true;
        } else if (spaces[0].getIcon().equals(icono)
                && spaces[3].getIcon().equals(icono) && spaces[6].getIcon().equals(icono)) {
            return true;
        } else if (spaces[1].getIcon().equals(icono)
                && spaces[4].getIcon().equals(icono) && spaces[7].getIcon().equals(icono)) {
            return true;
        } else if (spaces[2].getIcon().equals(icono)
                && spaces[5].getIcon().equals(icono) && spaces[8].getIcon().equals(icono)) {
            return true;
        } else if (spaces[0].getIcon().equals(icono)
                && spaces[4].getIcon().equals(icono) && spaces[8].getIcon().equals(icono)) {
            return true;
        } else if (spaces[2].getIcon().equals(icono)
                && spaces[4].getIcon().equals(icono) && spaces[6].getIcon().equals(icono)) {
            return true;
        } else
    
            return false;
    }
    
    public boolean checkwinnerX() {
        if (spaces[0].getIcon().equals(iconx)
                && spaces[1].getIcon().equals(iconx) && spaces[2].getIcon().equals(iconx)) {
            return true;
        } else if (spaces[3].getIcon().equals(iconx)
                && spaces[4].getIcon().equals(iconx) && spaces[5].getIcon().equals(iconx)) {
            return true;
        } else if (spaces[6].getIcon().equals(iconx)
                && spaces[7].getIcon().equals(iconx) && spaces[8].getIcon().equals(iconx)) {
            return true;
        } else if (spaces[0].getIcon().equals(iconx)
                && spaces[3].getIcon().equals(iconx) && spaces[6].getIcon().equals(iconx)) {
            return true;
        } else if (spaces[1].getIcon().equals(iconx)
                && spaces[4].getIcon().equals(iconx) && spaces[7].getIcon().equals(iconx)) {
            return true;
        } else if (spaces[2].getIcon().equals(iconx)
                && spaces[5].getIcon().equals(iconx) && spaces[8].getIcon().equals(iconx)) {
            return true;
        } else if (spaces[0].getIcon().equals(iconx)
                && spaces[4].getIcon().equals(iconx) && spaces[8].getIcon().equals(iconx)) {
            return true;
        } else if (spaces[2].getIcon().equals(iconx)
                && spaces[4].getIcon().equals(iconx) && spaces[6].getIcon().equals(iconx)) {
            return true;
        } else
    
            return false;
    }
    }