加载图像到JPanel不起作用
两天来我试图从文件中加载图像到JPanel
。我不能!加载图像到JPanel不起作用
我用JLabel
和Icon
它的加载没问题,但我需要直接加载图像到JPanel
,这是不可能的?
因为差不多我看到很多这样的相关问题,很多人推荐问问题的人把图像加载到标签中!
这是代码:
public class ReadingImage extends JPanel {
JPanel panel;
JFrame frame;
JPanel secPanel;
private BufferedImage img;
public ReadingImage(String path){
frame = new JFrame();
frame.setVisible(true);
frame.setLocation(300, 300);
frame.setSize(300, 500);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
secPanel = new JPanel();
secPanel.setVisible(true);
//secPanel.setLayout(new FlowLayout());
secPanel.repaint();
frame.getContentPane().add(secPanel);
try{
FileImageInputStream fi = new FileImageInputStream(new File(path));
//System.out.println(path);
img = ImageIO.read(fi);
this.repaint();
}
catch (IOException io){ io.printStackTrace();}
}
@Override
protected void paintComponent(Graphics g){
super.paintComponents(g);
if (img!=null){
g.drawImage(img, 0, 0, this);
repaint();
}
}
}
它不扔任何异常,但它不是在JPanel
显示图像!
我调整引起的扩展JPanel
并使用另一个JPanel的代码很多,很多次..
在这个任何帮助:)
感谢,
经典混乱。用frame.add(this , BORDERLAYOUT.CENTER)
代替frame.getContentPane().add(secPanel)
,一切都应该正常工作。
非常感谢:) 我没想到这是狡猾的错误:) 我可以问我们是否可以添加图片的固定大小,所以通过我的程序,我决定哪种尺寸更好,而不是照片尺寸? 谢谢:) – Omarkk 2015-04-03 11:18:00
当然,'图形'还提供了其他方法来绘制图像。使用:'g.drawImage(img,x,y,width,height,null)'绘制图像 – Paul 2015-04-03 11:49:38
@Paul您应该使用'g.drawImage(img,x,y,this)',否则组件可能不知道当图像状态发生变化时 – MadProgrammer 2015-04-03 21:48:13
您调用paintComponent
super.paintComponents(g);
,而不是s
末,这将导致*Exception
最终,但实际上不能添加ReadingImage
JPanel
任何东西,所以它实际上从未画
这意味着,似乎没有要任何一点的任何点到secPane
你也应该避免从其他组件中创建帧,特别是从构造方法中,它提供组件
0一个非常极限的情况下使用import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.imageio.stream.FileImageInputStream;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class ReadingImage extends JPanel {
private BufferedImage img;
public ReadingImage(String path) {
try {
FileImageInputStream fi = new FileImageInputStream(new File(path));
img = ImageIO.read(fi);
this.repaint();
} catch (IOException io) {
io.printStackTrace();
}
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (img != null) {
g.drawImage(img, 0, 0, this);
repaint();
}
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame();
frame.add(new ReadingImage("Your image"));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocation(300, 300);
frame.setSize(300, 500);
frame.setVisible(true);
}
});
}
}
我不知道你想实现什么,但我也建议你重写ReadingImage
的getPreferredSize
方法,并返回图像的大小,这使得它更容易布局
首先在图像图标中加载图像,让对象说成'图片'。
panel1.add(new JLabel(pic));
添加并将panel1设置为可见。
Swing组件在默认情况下是可见的(除了'Window'类和'JInternalFrame'外) – MadProgrammer 2015-04-03 11:11:29
您是否尝试过这里提到的解决方案,http://*.com/questions/299495/how-to-add-an-image-to-a-jpanel – 2015-04-03 11:04:21