使用.setIcon(ICON)时,JButton不会更改更新映像;

时间:2014-01-20 23:10:37

标签: java swing jpanel jbutton embedded-resource

我已经检查了this重复的问题和其他类似问题,但它没有帮助。我正在尝试在单击按钮时为其添加一个按钮。该计划是一个可变大小的学校tic-tac-toe游戏。

现在我有:

private ImageIcon X_MARK = new ImageIcon("x.png");
private ImageIcon O_MARK = new ImageIcon("o.gif");
private JButton[][] cells;

...

    cells = new JButton[size][size];
    JPanel board = new JPanel(new GridLayout(size, size));
    board.setBorder(new LineBorder(Color.BLACK, 1));

    ButtonListener listener = new ButtonListener();

    for (int i = 0; i < size; i++)
        for (int j = 0; j < size; j++) {
            cells[i][j] = new JButton();
            cells[i][j].addActionListener(listener);
            board.add(cells[i][j]);
        }
    JFrame ttt = new JFrame();
    ttt.add(board);
    ttt.setTitle("Show GUI Components");
    ttt.setSize(60*size, 60*size);
    ttt.setLocation(0, 0);
    ttt.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    ttt.setVisible(true);

...

class ButtonListener implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {

        int i, j;

        for (i = 0; i < size; i++)
            for (j = 0; j < size; j++)
                if (e.getSource() == cells[i][j]) {
                    if ((i + j) % 2 == 0) {
                        cells[i][j].setBackground(Color.GREEN);
                        cells[i][j].setIcon(X_MARK);
                    } else {
                        cells[i][j].setBackground(Color.CYAN);
                        cells[i][j].setIcon(O_MARK);
                    }
                }

    }
}

这就是我认为的所有相关代码。我正在使用Eclipse,我在src文件夹和项目的bin文件夹中有x.png和o.png。我还尝试了一些我在SO和谷歌搜索中看到的变体,例如new ImageIcon("C:/Users/BigBoy/workspace_1/EventDriven/src/x.png");new ImageIcon("src/x.png");以及其他一些涉及getClass().getResource的变体。我不知道还有什么可以尝试。我知道我过去做过这件事并且没有那么多麻烦。

我添加了.setBackground(Color.GREEN);只是为了确保我的点击正确注册并且它们是,我的问题似乎与ImageIcon的声明/初始化有关。

注意:现在我的按钮监听器只是制作棋盘格局,在找出这个图标问题之后,我会真正地给每个玩家标记。

1 个答案:

答案 0 :(得分:4)

您需要了解您想要使用的资源。它们相对于类文件而定。如果图像是带有类文件的话,那么

  • 将您的图片作为资源
  • 从图像创建ImageIcon。

,例如:

package whateverpackeyouareusing;

import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;


public class DefaultFoo {
   public static void main(String[] args) throws IOException {
      String resource = "x.png";
      URL url = Class.class.getResource(resource);
      BufferedImage img = ImageIO.read(url);
      Icon icon = new ImageIcon(img);
      JOptionPane.showMessageDialog(null, icon);
   }
}

编辑:安德鲁·汤普森的一个更好的例子:

package some.package;

import java.awt.Image;
import java.io.IOException;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;


public class PlayWithImages {
   public static final String X_RESOURCE = "x.png";
   private Icon xIcon;

   public PlayWithImages() throws IOException {
      URL xImgUrl = getClass().getResource(X_RESOURCE);
      Image xImg = ImageIO.read(xImgUrl);
      xIcon = new ImageIcon(xImg);
   }

   public Icon getXIcon() {
      return xIcon;
   }

   public static void main(String[] args) {
      try {
         PlayWithImages playWithImages = new PlayWithImages();
         Icon xIcon = playWithImages.getXIcon();
         JOptionPane.showMessageDialog(null, xIcon);
      } catch (IOException e) {
         e.printStackTrace();
      }

   }
}