[英]Changing the icon of a JButton
因此,我嘗試創建一個使用可能的插槽作為按鈕的井字游戲。 在游戲開始時,按鈕被設置為空白的白色圖像作為其圖標。 單擊按鈕時,我試圖將按鈕圖標更改為相應的圖像(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;
}
}
init
方法將每個按鈕圖標設置為空白圖像。 CellHandlerMethod
處理空白圖像和圖像(x或o)之間的更改。 此輸出肯定表明游戲邏輯存在問題。
請注意,單擊按鈕時,它的確從紅色正方形(表示“空白”)變為綠色圓圈。 但是它永遠不會從玩家X切換到玩家Y(反之亦然)。
至於為什么看不到任何變化,我只能得出以下三點之一:
x.png != X.png || x.PNG
) JOptionPane
顯示它們。 不要使用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;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.