如何在调整画框大小时调整图像大小使用drawImage

6

我有一个小问题。我正在学习Java表单,并希望在调整表单大小时调整我的图像大小。但不幸的是,我只能调整表单大小,而图像仍具有相同的尺寸。我该如何重新缩放图像?我应该改变什么?我做错了什么吗? 以下是代码:

    package przegladarka;
import java.io.*;
import java.util.ArrayList;
import java.awt.*;

import javax.swing.*;
public class view extends JPanel {
    Image imag; 
    Dimension size;
    public static int framew=300;
    public static int frameh=300;
    static String[] children;
    static ArrayList<String> sciezki = new ArrayList<String>(); 

    public static void main(String[] args) {
        File folder = new File("./zdjecia/");
        visitAllFiles(folder);

        JFrame frame = new JFrame("Przegladarka");
        frame.setSize(300, 300);

        frame.setVisible(true);
        frame.getContentPane().add(new MyCanvas());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   
    }



    public static void visitAllFiles(File dir) {
        if (dir.isDirectory()) {
            children = dir.list();
            for (int i = 0; i < children.length; i++) {
                visitAllFiles(new File(dir, children[i]));
                System.out.println(""+children[i]);
                Image imag = Toolkit.getDefaultToolkit().getImage(children[i]); 
            }

        } else {
            System.out.println(dir.getAbsolutePath() + " is being processed.");
            sciezki.add(dir.getAbsolutePath());
        }
    }
}
class MyCanvas extends JComponent{
    public void paint(Graphics g){
        Graphics2D g2d = (Graphics2D) g;

        for(int i=0; i<view.sciezki.size();i++){

            Image imag = Toolkit.getDefaultToolkit().getImage(view.sciezki.get(i));


        g2d.drawImage(imag, 0, 0, this);

        g2d.finalize();
        }
    }
}

请查看这个链接这个链接 - MadProgrammer
  1. 自定义绘制是通过覆盖paintComponent()方法而不是paint()方法来完成的。
  2. 不要在绘制方法中从磁盘读取图像。应该在创建类时或将其作为参数传递给类时读取图像。
  3. 你的代码没有意义,因为你创建了一个循环。只有最后一个图像会被绘制。
  4. 不要对Graphics对象执行finalize()。该对象由框架上的所有组件共享。
- camickr
1个回答

11

首先,在使用drawImage方法时,你不仅需要设置x和y的值,还需要设置width和height的值。只有这样才能对图像进行缩放。

drawImage(Image img, int x, int y, int width, int height, ImageObserver observer) 

当您重新调整窗体大小时,您的画布应该会被重绘,但如果没有,您可以使用.repaint()来强制重绘。

增加内容:

您告诉我您想让它与您的表单大小相同。那么您需要做两件事。 首先,您可以使用上述方法,将宽度设置为this.getWidth(),将高度设置为this.getHeight(),其中this指的是画布。您需要确保您的画布随着您的框架进行缩放,只需选择适当的布局管理器即可实现。

frame.setLayout(...)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接