将图像加载到 JPanel 不起作用
load image to JPanel not working
这两天我一直在尝试从文件中将图像加载到 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.getContentPane().add(secPanel)
替换为 frame.add(this , BORDERLAYOUT.CENTER)
,一切正常。
您在 paintComponent
中调用 super.paintComponents(g);
,而不是最后的 s
,这最终会导致 WhosebugException
,但实际上永远不会将 ReadingImage
JPanel
添加到任何东西,所以它从来没有真正画过
这意味着secPane
似乎没有任何意义
您还应该避免在其他组件中创建框架,尤其是在构造函数中,它为组件提供了非常有限的用例
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
方法和 return图片,这使得布局更容易
首先加载图像图标中的图像,假设对象为 'pic'。
panel1.add(新 JLabel(图片));
添加 panel1 并将其设置为可见。
这两天我一直在尝试从文件中将图像加载到 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.getContentPane().add(secPanel)
替换为 frame.add(this , BORDERLAYOUT.CENTER)
,一切正常。
您在 paintComponent
中调用 super.paintComponents(g);
,而不是最后的 s
,这最终会导致 WhosebugException
,但实际上永远不会将 ReadingImage
JPanel
添加到任何东西,所以它从来没有真正画过
这意味着secPane
您还应该避免在其他组件中创建框架,尤其是在构造函数中,它为组件提供了非常有限的用例
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
方法和 return图片,这使得布局更容易
首先加载图像图标中的图像,假设对象为 'pic'。
panel1.add(新 JLabel(图片));
添加 panel1 并将其设置为可见。