Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中单击按钮时更改jframe上的图像_Java_Swing - Fatal编程技术网

在Java中单击按钮时更改jframe上的图像

在Java中单击按钮时更改jframe上的图像,java,swing,Java,Swing,我一直在想,为什么点击按钮后,下一张图片不显示在同一个面板上。我不想将这些类分成一个类,而是使用repaint()用新的pic重新调用paintComponent() 请帮帮我。我快死了:( 当我运行此程序时,第一张图片显示良好。当单击按钮将第一张图片更改为第二张图片时,面板将继续显示第一张图片 多谢各位 import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; im

我一直在想,为什么点击按钮后,下一张图片不显示在同一个面板上。我不想将这些类分成一个类,而是使用repaint()用新的pic重新调用paintComponent()

请帮帮我。我快死了:(

  • 当我运行此程序时,第一张图片显示良好。当单击按钮将第一张图片更改为第二张图片时,面板将继续显示第一张图片
多谢各位

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.*;

class drawImage extends JPanel {

    BufferedImage[] b = new BufferedImage[2];

    public drawImage() {
        try {
            b[0] = ImageIO.read(new File("img/gameOn.png"));
            b[1] = ImageIO.read(new File("img/gameOff.png"));
        } catch (IOException e) {

            e.printStackTrace();
        }

    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        g.drawImage(b[0], 0, 0, null);

    }

    public void setNextImage(BufferedImage image) {

        b[0] = image;

        repaint();
    }

    public BufferedImage getB0() {
        return b[0];
    }

    public BufferedImage getB1() {
        return b[1];
    }

}// end drawImage

class clickedListener implements ActionListener {

    BufferedImage pre = new drawImage().getB0();
    BufferedImage next = new drawImage().getB1();

    @Override
    public void actionPerformed(ActionEvent e) {

        new drawImage().setNextImage(next);

    }

}

public class buttonFrame {
    public static void main(String[] args) throws IOException {
        JFrame jf = new JFrame("Button & Frame");
        JButton btn = new JButton("Click");

        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.setVisible(true);
        jf.setLayout(new GridLayout(2, 0));
        jf.add(new drawImage());
        jf.add(btn);
        jf.setSize(200, 250);

        btn.addActionListener(new clickedListener());

    }

}

为什么不改变您的方法,改用JLabel?将您的图像设置为标签上的图标,并将其添加到您的JPanel中:

BufferedImage image = ImageIO.read(new File("image-path"));
JLabel label = new JLabel(new ImageIcon(image));
panel.add(label);

然后,您可以在每次更改图像时调用
JLabel#setIcon(…)

为什么不更改方法并使用JLabel?将图像设置为标签上的图标,并将其添加到JPanel中:

BufferedImage image = ImageIO.read(new File("image-path"));
JLabel label = new JLabel(new ImageIcon(image));
panel.add(label);

然后,每次需要更改图像时,您都可以调用
JLabel#setIcon(…)

您也可以像这样使用图像图标

image = new ImageIcon(imageList[1]);
label.setIcon(image);
当每次点击按钮时,你们可以像这样改变图像

image = new ImageIcon(imageList[1]);
label.setIcon(image);

您也可以像这样使用ImageIcon

image = new ImageIcon(imageList[1]);
label.setIcon(image);
当每次点击按钮时,你们可以像这样改变图像

image = new ImageIcon(imageList[1]);
label.setIcon(image);

您正在创建一个新的
drawImage
实例(类应为大写,顺便说一句,以遵循命名约定),而不是设置现有实例的映像。此外,不相关,但gui应在中创建。您正在创建一个新的
drawImage
实例(顺便说一句,类应为大写,以遵循命名约定),而不是设置现有类的图像。此外,不相关,但gui应在中创建。这是在Swing中显示图像的最简单方法之一。这是在Swing中显示图像的最简单方法之一。