[英]Java: JPanel background not scaling
我正在嘗試在 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
值設置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);
}
這是低效的,成本高昂的,並且可能不會產生預期的結果
首先,看看Image.getScaledInstance() 的危險
您還可以查看Java:維護 JPanel 背景圖像的縱橫比以獲取有關維護圖像縱橫比和縮放以適應與縮放以填充的更多詳細信息。
我也會緩沖結果,這樣您就不會在可能經常被捕獲的paintComponent
方法中重復縮放圖像......
更新了工作示例
這對我來說很好用...
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);
}
}
}
要動態縮放您使用的圖像:
//g.drawImage(img, 0, 0, null);
g.drawImage(image, 0, 0, getWidth(), getHeight(), null);
有關完整的實現以及平鋪功能,請參閱背景面板。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.