有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JButton在使用时不会更改更新映像。设置图标(图标);

我已经检查了this重复的问题和其他类似的问题,但没有帮助。我试图在按钮被点击时添加一个png。该项目是一个学校的可变大小的井字游戏

现在我有:

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和google搜索中看到的变体,比如,new ImageIcon("C:/Users/BigBoy/workspace_1/EventDriven/src/x.png");new ImageIcon("src/x.png");,以及其他一些涉及getClass().getResource的变体。我不知道还能尝试什么。我知道我以前也这么做过,也没遇到这么多麻烦

我添加了.setBackground(Color.GREEN);只是为了确保我的点击正确注册,而它们确实注册了,对我来说,问题似乎在于ImageIcon的声明/初始化

注意:现在我的按钮侦听器只是制作棋盘格图案,在我解决了这个图标问题后,我将开始实际放置每个玩家的标记


共 (1) 个答案

  1. # 1 楼答案

    你需要了解你想要使用的资源。它们位于类文件的相对位置。如果图像与类文件一起,则

    • 让你的形象成为一种资源
    • 从图像中创建图像图标

    例如:

    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();
          }
    
       }
    }