我正在尝试用 java 向 JPanel 绘制图像,我已经把它记录下来了,很好。我现在的问题是我试图使其缩放到窗口的完整尺寸,但它没有这样做。我尝试过一些方法,它们要么使图像消失,要么根本没有图形变化。
我当前正在使用的代码:
class ImagePanel extends JPanel {
private static final long serialVersionUID = 1L;
private Image img;
public ImagePanel(String img) {
this(new ImageIcon(img).getImage());
}
public ImagePanel(Image img) {
this.img = img;
Dimension size = new Dimension(img.getWidth(null), img.getHeight(null));
setPreferredSize(size);
setMinimumSize(size);
setMaximumSize(size);
setSize(size);
setLayout(null);
}
public void paintComponent(Graphics g) {
g.drawImage(img, 0, 0, null);
}
}
全类:http://pastebin.com/CpcBt2j8
我尝试添加 img = img.getScaledInstance(440, 440, Image.SCALE_SMOOTH)
等代码,但没有任何效果。我还尝试制作一个名为 scaledImg
的新图像,并将 img
的 getScaledInstance
值设置为该值,从而完全从显示中删除该图像。
如何将图像缩放到我想要的完整尺寸?
最佳答案
我想“最简单”的方法是做类似的事情......
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Image scaled = img.getScaledInstance(getWidth(), getHeight(), Image.SCALE_SMOOTH);
g.drawImage(scaled, 0, 0, null);
}
这样做效率低下、成本高昂,而且可能不会产生预期的结果
首先,请查看 The Perils of Image.getScaledInstance()
您还可以查看Java: maintaining aspect ratio of JPanel background image有关保持图像的纵横比以及适合比例与填充比例的更多详细信息。
我还会缓冲结果,这样您就不会在 paintComponent
方法中重复缩放图像,这可能会经常被捕获...</p>
已更新工作示例
这对我来说效果很好......
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.HeadlessException;
import java.awt.Image;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class TestImagePane {
public static void main(String[] args) {
new TestImagePane();
}
public TestImagePane() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
try {
Image img = null;
img = ImageIO.read(new File("/path/to/image"));
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new ImagePanel(img));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
} catch (IOException | HeadlessException exp) {
exp.printStackTrace();
}
}
});
}
class ImagePanel extends JPanel {
private static final long serialVersionUID = 1L;
private Image img;
private Image scaled;
public ImagePanel(String img) {
this(new ImageIcon(img).getImage());
}
public ImagePanel(Image img) {
this.img = img;
}
@Override
public void invalidate() {
super.invalidate();
int width = getWidth();
int height = getHeight();
if (width > 0 && height > 0) {
scaled = img.getScaledInstance(getWidth(), getHeight(), Image.SCALE_SMOOTH);
}
}
@Override
public Dimension getPreferredSize() {
return img == null ? new Dimension(200, 200) : new Dimension(img.getWidth(this), img.getHeight(this));
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(scaled, 0, 0, null);
}
}
}
关于Java:JPanel 背景不缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19648833/