Java 如何在jlabel上设置imageicon修复

Java 如何在jlabel上设置imageicon修复,java,swing,Java,Swing,我正在尝试制作一个java桌面应用程序。我有一个JLabel我正在洗牌图像,但所有图像大小都不同,所以我想在JLabel上固定图像的大小 我该怎么做 这是我的密码: public class ImageShuffle1 extends JPanel { private List<Icon> list = new ArrayList<Icon>(); private List<Icon> shuffled; private JLabel la

我正在尝试制作一个java桌面应用程序。我有一个
JLabel
我正在洗牌图像,但所有图像大小都不同,所以我想在
JLabel
上固定图像的大小

我该怎么做

这是我的密码:

public class ImageShuffle1 extends JPanel {

   private List<Icon> list = new ArrayList<Icon>();
   private List<Icon> shuffled;
   private JLabel label = new JLabel();
   private Timer timer = new Timer(1000, new ActionListener() {

      @Override
       public void actionPerformed(ActionEvent e) {
        update();
       }
   });

   public ImageShuffle1() {
       this.setLayout(new GridLayout(1, 0));

      list.add(new ImageIcon("E:\\SOFTWARE\\TrainPIS\\res\\drawable\\e.jpg"));
    list.add(new ImageIcon("E:\\SOFTWARE\\TrainPIS\\res\\drawable\\d.jpg"));
    list.add(new ImageIcon("E:\\SOFTWARE\\TrainPIS\\res\\drawable\\yellow.png"));
      list.add(new ImageIcon("E:\\SOFTWARE\\TrainPIS\\res\\drawable\\f.jpg"));
            list.add(new ImageIcon("E:\\SOFTWARE\\TrainPIS\\res\\drawable\\l.jpg"));
       //label.setIcon(UIManager.getIcon("OptionPane.informationIcon"));

    for(Icon icon: list){

       Image img = icon.getImage() ;

       // put here the size properties  
       Image newimg = img.getScaledInstance( 45, 34,  java.awt.Image.SCALE_SMOOTH ) ;  

       icon = new ImageIcon(newimg);

    }

shuffled = new ArrayList<Icon>(list);
Collections.shuffle(shuffled);
       timer.start();
   }

   private void update() {
      if (shuffled.isEmpty()) {
    shuffled = new ArrayList<Icon>(list);
    Collections.shuffle(shuffled);
 }

 Icon icon = shuffled.remove(0);
 label.setIcon(icon);
}

private void display() {
    JFrame f = new JFrame("ImageShuffle");
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.add(this);
    f.add(label);
    f.pack();
    f.setLocationRelativeTo(null);
    f.setVisible(true);
}

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {

           @Override
          public void run() {
              new ImageShuffle1().display();
           }
       });
   }
 }
公共类ImageShuffle1扩展了JPanel{
私有列表=新的ArrayList();
私人名单被洗牌;
专用JLabel标签=新JLabel();
私有计时器=新计时器(1000,新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
更新();
}
});
公共映像shuffle1(){
这个.setLayout(新的GridLayout(1,0));
添加(新图像图标(“E:\\SOFTWARE\\TrainPIS\\res\\drawable\\E.jpg”);
添加(新图像图标(“E:\\SOFTWARE\\TrainPIS\\res\\drawable\\d.jpg”);
添加(新的图像图标(“E:\\SOFTWARE\\TrainPIS\\res\\drawable\\yellow.png”);
添加(新图像图标(“E:\\SOFTWARE\\TrainPIS\\res\\drawable\\f.jpg”);
添加(新图像图标(“E:\\SOFTWARE\\TrainPIS\\res\\drawable\\l.jpg”);
//label.setIcon(UIManager.getIcon(“OptionPane.informationIcon”);
用于(图标:列表){
Image img=icon.getImage();
//在这里输入大小属性
Image newimg=img.getScaledInstance(45,34,java.awt.Image.SCALE\u平滑);
图标=新图像图标(newimg);
}
shuffled=新数组列表(列表);
收藏。洗牌(洗牌);
timer.start();
}
私有void更新(){
if(shuffled.isEmpty()){
shuffled=新数组列表(列表);
收藏。洗牌(洗牌);
}
图标=洗牌。移除(0);
label.setIcon(图标);
}
专用void display(){
JFrame f=新JFrame(“ImageShuffle”);
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f、 加上(这个);
f、 添加(标签);
f、 包装();
f、 setLocationRelativeTo(空);
f、 setVisible(真);
}
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
新建ImageShuffle1().display();
}
});
}
}
我在这里得到了这个错误

找不到行/变量getimage mage img=icon.getimage()


提前感谢

首先,您将每个图像的大小调整为固定大小,并且必须适合
JLabel

public static Boolean resizeImage(String sourceImage, String destinationImage, Integer   Width, Integer Height) {
    BufferedImage origImage;
    try {

        origImage = ImageIO.read(new File(sourceImage));
        int type = origImage.getType() == 0? BufferedImage.TYPE_INT_ARGB :  origImage.getType();

        //*Special* if the width or height is 0 use image src dimensions
        if (Width == 0) {
            Width = origImage.getWidth();
        }
        if (Height == 0) {
            Height = origImage.getHeight();
        }

        int fHeight = Height;
        int fWidth = Width;

        //Work out the resized width/height
        if (origImage.getHeight() > Height || origImage.getWidth() > Width) {
            fHeight = Height;
            int wid = Width;
            float sum = (float)origImage.getWidth() / (float)origImage.getHeight();
            fWidth = Math.round(fHeight * sum);

            if (fWidth > wid) {
                //rezise again for the width this time
                fHeight = Math.round(wid/sum);
                fWidth = wid;
            }
        }

        BufferedImage resizedImage = new BufferedImage(fWidth, fHeight, type);
        Graphics2D g = resizedImage.createGraphics();
        g.setComposite(AlphaComposite.Src);

        g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,  RenderingHints.VALUE_INTERPOLATION_BILINEAR);
        g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        g.drawImage(origImage, 0, 0, fWidth, fHeight, null);
        g.dispose();

        ImageIO.write(resizedImage, "png", new File(destinationImage));
        ...

让我们从这个开始

for(Icon icon: list){

   Image img = icon.getImage() ;
Icon
没有方法
getImage
,实际上,如果不先将其呈现给某个对象(如
BufferedImage
),就无法获取由
Icon
类维护的“图像”数据

更好的解决方案可能是将图像加载到支持
BufferedImage
列表中
BuffereImage
是一个更通用的起点,因为它从
Image
扩展而来,所以可以与
ImageIcon
一起使用。例如

private List<BufferedImage> list = new ArrayList<BufferedImage>();
//...
list.add(ImageIO.read("E:\\SOFTWARE\\TrainPIS\\res\\drawable\\e.jpg"));
private List=new ArrayList();
//...
添加(ImageIO.read(“E:\\SOFTWARE\\TrainPIS\\res\\drawable\\E.jpg”);
看看

对于缩放,您可能想看看

使用BuffereImage代替具有重新调整大小功能的图标

这是密码

import java.awt.EventQueue;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;

public class ImageShuffle1 extends JPanel {

    private List<BufferedImage> list = new ArrayList<BufferedImage>();
    private List<BufferedImage> shuffled;
    private JLabel label = new JLabel();

    private int width = 50;
    private int height = 100;

    private Timer timer = new Timer(1000, new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            update();
        }
    });

    public ImageShuffle1() {

        try {
            list.add(resizeImage(ImageIO.read(new File("resources/1.png"))));
            list.add(resizeImage(ImageIO.read(new File("resources/2.png"))));
            list.add(resizeImage(ImageIO.read(new File("resources/6.png"))));
            list.add(resizeImage(ImageIO.read(new File("resources/Tulips.jpg"))));
        } catch (IOException e) {
            e.printStackTrace();
        }

        shuffled = new ArrayList<BufferedImage>(list);
        Collections.shuffle(shuffled);
        timer.start();
    }

    private BufferedImage resizeImage(BufferedImage originalImage) throws IOException {
        BufferedImage resizedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g = resizedImage.createGraphics();
        g.drawImage(originalImage, 0, 0, width, height, null);
        g.dispose();
        return resizedImage;
    }

    private void update() {
        if (shuffled.isEmpty()) {
            shuffled = new ArrayList<BufferedImage>(list);
            Collections.shuffle(shuffled);
        }

        BufferedImage icon = shuffled.remove(0);
        label.setIcon(new ImageIcon(icon));
    }

    private void display() {
        JFrame f = new JFrame("ImageShuffle");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(this);
        f.add(label);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new ImageShuffle1().display();
            }
        });
    }
}
导入java.awt.EventQueue;
导入java.awt.Graphics2D;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.image.buffereImage;
导入java.io.File;
导入java.io.IOException;
导入java.util.ArrayList;
导入java.util.Collections;
导入java.util.List;
导入javax.imageio.imageio;
导入javax.swing.ImageIcon;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
导入javax.swing.Timer;
公共类ImageShuffle1扩展了JPanel{
私有列表=新的ArrayList();
私人名单被洗牌;
专用JLabel标签=新JLabel();
私有整数宽度=50;
私人内部高度=100;
私有计时器=新计时器(1000,新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
更新();
}
});
公共映像shuffle1(){
试一试{
添加(resizeImage(ImageIO.read)(新文件(“resources/1.png”));
添加(resizeImage(ImageIO.read)(新文件(“resources/2.png”));
添加(resizeImage(ImageIO.read)(新文件(“resources/6.png”));
添加(resizeImage(ImageIO.read)(新文件(“resources/Tulips.jpg”));
}捕获(IOE异常){
e、 printStackTrace();
}
shuffled=新数组列表(列表);
收藏。洗牌(洗牌);
timer.start();
}
私有BuffereImage resizeImage(BuffereImage originalImage)引发IOException{
BuffereImage resizedImage=新的BuffereImage(宽度、高度、BuffereImage.TYPE_INT_ARGB);
Graphics2D g=resizedImage.createGraphics();
g、 drawImage(原始图像,0,0,宽度,高度,空);
g、 处置();
返回resizedImage;
}
私有void更新(){
if(shuffled.isEmpty()){
shuffled=新数组列表(列表);
收藏。洗牌(洗牌);
}
BuffereImage图标=已洗牌。移除(0);
label.setIcon(新图像图标(图标));
}
专用void display(){
JFrame f=新JFrame(“ImageShuffle”);
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f、 加上(这个);
f、 添加(标签);
f、 包装();
f、 setLocationRelativeTo(空);
f、 setVisible(真);
}
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
新建ImageShuffle1().display();
}
});
}
}

您能告诉我在哪里需要对代码进行更改吗您必须调整每个图像的大小,然后再将其添加到ArrayList。然后将调整大小的图像的路径添加到列表中。仅此而已。请使用