簡體   English   中英

更改JButton的圖標

[英]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;

}
}
  1. 圖像圖標被初始化。
  2. 我的init方法將每個按鈕圖標設置為空白圖像。
  3. 當單擊時,我的CellHandlerMethod處理空白圖像和圖像(x或o)之間的更改。

此輸出肯定表明游戲邏輯存在問題。

井字游戲

請注意,單擊按鈕時,它的確從紅色正方形(表示“空白”)變為綠色圓圈。 但是它永遠不會從玩家X切換到玩家Y(反之亦然)。

至於為什么看不到任何變化,我只能得出以下三點之一:

  1. 圖像不在您認為的位置。
  2. 這些圖像未命名為您認為的名稱。 (EG x.png != X.png || x.PNG
  3. 圖像未使用Java理解的內部格式。 嘗試直接在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM