[英]why picture doesn't show up in swing in java?
我想在中心的边框布局面板中显示图像。 我创建如下图像面板,然后将其添加到Border-layout的中心。 我不知道为什么图像没有显示,也没有错误。 可能是什么原因,我该如何解决?
public class ImagePanel extends WebPanel {
private Image image;
private Image scaledImage;
private int imageWidth = 0;
private int imageHeight = 0;
//constructor
public ImagePanel() {
super();
}
public void loadImage(String file) throws IOException {
File filetest= new File("C:\\tmp\\axiuser\\Pictures\\CLA0014.png");
image = ImageIO.read(filetest);//new File(file)
imageWidth = image.getWidth(this);
imageHeight = image.getHeight(this);
setScaledImage();
}
//e.g., containing frame might call this from formComponentResized
public void scaleImage() {
setScaledImage();
}
//override paintComponent
public void paintComponent(Graphics g) {
super.paintComponent(g);
if ( scaledImage != null ) {
//System.out.println("ImagePanel paintComponent " + ++paintCount);
g.drawImage(scaledImage, 0, 0, this);
}
}
private void setScaledImage() {
if ( image != null ) {
//use floats so division below won't round
float iw = imageWidth;
float ih = imageHeight;
float pw = this.getWidth(); //panel width
float ph = this.getHeight(); //panel height
if ( pw < iw || ph < ih ) {
if ( (pw / ph) > (iw / ih) ) {
iw = -1;
ih = ph;
} else {
iw = pw;
ih = -1;
}
//prevent errors if panel is 0 wide or high
if (iw == 0) {
iw = -1;
}
if (ih == 0) {
ih = -1;
}
scaledImage = image.getScaledInstance(
new Float(iw).intValue(), new Float(ih).intValue(), Image.SCALE_DEFAULT);
} else {
scaledImage = image;
}
}
}
}
你从不打电话给你的方法
public void loadImage (String file)
SSCCE:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.io.*;
import javax.imageio.*;
public class ImagePanel extends JPanel {
private Image image;
private Image scaledImage;
public void loadImage (String filename) throws IOException {
image = ImageIO.read (new File (filename));
setScaledImage ();
}
public void paintComponent (Graphics g) {
super.paintComponent (g);
if ( scaledImage != null) {
// System.out.println ("ImagePanel paintComponent ");
g.drawImage (scaledImage, 0, 0, this);
}
}
private void setScaledImage () {
if (image != null) {
//use floats so division below won't round
int imageWidth = image.getWidth (this);
int imageHeight = image.getHeight (this);
float iw = imageWidth;
float ih = imageHeight;
float pw = this.getWidth (); //panel width
float ph = this.getHeight (); //panel height
if ( pw < iw || ph < ih) {
if ( (pw / ph) > (iw / ih)) {
iw = -1;
ih = ph;
} else {
iw = pw;
ih = -1;
}
//prevent errors if panel is 0 wide or high
if (iw == 0) {
iw = -1;
}
if (ih == 0) {
ih = -1;
}
scaledImage = image.getScaledInstance (
new Float (iw).intValue (), new Float (ih).intValue (), Image.SCALE_DEFAULT);
} else {
scaledImage = image;
}
}
}
public static void main (String [] args) throws IOException {
ImagePanel ip = new ImagePanel ();
ip.loadImage ("./sample.png");
JFrame jf = new JFrame ();
jf.setLayout (new BorderLayout ());
jf.add (ip, BorderLayout.CENTER);
jf.setSize (400, 400);
jf.setLocation (150, 150);
jf.setVisible (true);
jf.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
}
}
缩放不起作用,但在这里你有一些东西要开始。 (注意我重命名了图像)。
只需覆盖JPanel
getPreferredSize()
,就像使用paintComponent(...)
方法一样。 让它返回一些Dimension
对象,如:
public Dimension getPreferredSize()
{
return (new Dimension(300, 300));
}
这将允许您查看图像。
也许没有为*.png
定义的Reader。您可以使用ImageIO.getReaderFormatNames()
查看可用的图像阅读器列表
我认为你应该将面板设置为不透明:
setOpaque(false)
在不知道程序何时实际调用paintComponent()
的情况下,我们无法分辨。 但是如果在已经显示GUI( setVisible
) 之后调用loadImage
方法,则需要在面板上调用repaint()
或invalidate()
以触发组件的重绘(并以这种方式更新GUI)。
考虑使用JLabel
来显示图像。
JLabel myLabel=new JLabel();
myLabel.setIcon(new ImageIcon("C:\\tmp\\axiuser\\Pictures\\CLA0014.png"));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.