0

我对 GUI(和 Java,不到 3 个月前开始)非常陌生,并且需要一些关于我正在为家庭作业做的 GUI 的帮助。我作为最后的手段来到这里,因为我无法弄清楚这一点并且已经工作了几个小时。

我需要制作一个将通过 ImageIcons 数组的 GUI,并一次显示每个 ImageIcon(删除显示的前一个)。我已经把它放到了它显示我的第一个图像的位置,但是我的 JButton 完全没有做任何事情,我不知道如何让它工作。我翻阅了我的教科书和许多在线资源和老师给出的例子,但仍然一无所获。我知道一旦我看到一个解决方案,我会感到很愚蠢,但现在,我很累,并且开始思考不正确,因为我已经这样做了很长时间。请帮忙=D!!!

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.ImageIcon;

public class HangmanPanel extends JPanel {
    private JLabel imageLabel;
    private ImageIcon[] images;
    private JButton nextImage;
    private int imageNumber;


    public HangmanPanel() {

        nextImage = new JButton("Next Image");
        nextImage.setEnabled(true);
        nextImage.setToolTipText("Press for next image.");
        nextImage.addActionListener(new ButtonListener());

        images = new ImageIcon[8];
        // Populating the array
        {
            images[0] = new ImageIcon("hangman0.png");
            images[1] = new ImageIcon("hangman1.png");
            images[2] = new ImageIcon("hangman2.png");
            images[3] = new ImageIcon("hangman3.png");
            images[4] = new ImageIcon("hangman4.png");
            images[5] = new ImageIcon("hangman5.png");
            images[6] = new ImageIcon("hangman6.png");
            images[7] = new ImageIcon("hangman7.png");
        }

        setBackground(Color.white);

        add(nextImage);
        int count = 0;
        while (images.length > count)
        imageLabel = new JLabel (images[imageNumber]);
        count++;
        imageNumber++;
        add (imageLabel);
    }


    public void paint(Graphics page) {
        super.paint(page);


    }
    private class ButtonListener implements ActionListener{
        public void actionPerformed(ActionEvent event) {
            imageNumber++;
            }

        }
    }
4

3 回答 3

2
  • 这些方法在教程 avout Icon/ImageIconJLabel中有描述,使用方法JLabel#setIcon()

  • 不要忘记检查是否imageNumber++;不在 Array of 中ImageIcon[] images;,否则 Array Index Out of Bounds Exception 将冻结您的 GUI,

于 2012-04-05T08:02:10.200 回答
2

假设你想在按下按钮时改变图片,你想把你的逻辑放在 ActionListener 里面。这将使程序在单击按钮时触发更改。

在构造函数中,您只想启动第一个图标,并且您想保存一个全局计数参考,以便您知道下一个是哪个图像。“图像更改逻辑”将在您的侦听器内部,因此您想做这样的事情:

//construcor
   imageLabel = new JLabel (images[imageNumber]);
   imageNumber++;
   add (imageLabel);

//listener
private class ButtonListener implements ActionListener{
        public void actionPerformed(ActionEvent event) {
           if(imageNumber<images.length){  //add a check so you don't get outofbounds exception
              imageLabel.setIcon(images[imageNumber]); //this will set the image next in line
              imageNumber++;
              imageLabel.repaint();
            }
          else
            System.out.println("Whole array has been looped thru, no more images to show");
          }

        }
于 2012-04-05T08:02:39.243 回答
1

您只需要在 ButtonListener 中添加几行


    private class ButtonListener implements ActionListener{
        public void actionPerformed(ActionEvent event) {
            imageNumber++;
            imageNumber %= images.length;
            imageLabel.setIcon(images[imageNumber]);
            imageLabel.repaint();


        }
    }
于 2012-04-05T08:02:19.783 回答