【问题标题】:How to set imageicon fix on jlabel如何在jlabel上设置imageicon修复
【发布时间】:2014-05-09 15:34:08
【问题描述】:

我正在尝试制作一个 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();
           }
       });
   }
 }

我在这里遇到错误。

行/变量getimage找不到法师img = icon.getImage();

提前致谢

【问题讨论】:

  • 你昨天已经问过这个问题并得到了答案。别再用重复的问题弄乱论坛了。

标签: java swing


【解决方案1】:

使用 BufferedImage 代替具有调整大小功能的 Icon。

这里是代码

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();
            }
        });
    }
}

【讨论】:

  • 如何从项目文件夹中获取图片
  • 试试这个ImageIO.read(getClass().getResourceAsStream("3.png"))) 从存在类的同一个包中读取图像文件。
  • 我不想要一张图片我想要所有图片
  • 用不同的图片文件名多次调用有问题吗?
  • 我没有正确地做到这一点
【解决方案2】:

首先将每个图像调整为固定大小,并且它必须适合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));
        ...

【讨论】:

  • 你能告诉我我需要在哪里更改我的代码
  • 你必须在添加到 ArrayList 之前调整每张图片的大小。然后将调整大小的图片的路径添加到列表中。就是这样。
  • 使用drawImage进行缩放不是强烈推荐的缩放方案,有更好的选择
  • @MadProgrammer 下载链接重定向到错误页面。
【解决方案3】:

让我们从这个开始......

for(Icon icon: list){

   Image img = icon.getImage() ;

Icon 没有方法getImage,实际上没有办法获取Icon 类维护的“图像”数据,除非先将其渲染为某种东西(如BufferedImage

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

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

看看Reading/Loading an Image

对于缩放,您可能想看看

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-08
    • 1970-01-01
    • 1970-01-01
    • 2012-12-26
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多