GUI一次显示一个数组的每个图像

时间:2012-04-05 07:52:56

标签: java arrays swing user-interface actionlistener

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

我需要制作一个将要经过的GUI和ImageIcons数组,并一次显示一个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++;
            }

        }
    }

3 个答案:

答案 0 :(得分:2)

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

  • 不要忘记检查imageNumber++;是否不在ImageIcon[] images;数组之外,否则数组索引超出界限异常将冻结您的GUI,

答案 1 :(得分: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");
          }

        }

答案 2 :(得分:1)

你只需要在ButtonListener中添加几行


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


        }
    }