我对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++;
}
}
}
答案 0 :(得分:2)
这些方法在教程avout Icon/ImageIcon和JLabel中有所描述,请使用方法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();
}
}