[英]image loading using a JFileChooser into a JFrame
我正在嘗試編寫一個代碼,將使用JFileChooser選擇的圖像顯示到另一個JFrame中。我嘗試了下面的代碼,但只得到以下錯誤。
Exception in thread "main" java.lang.NullPointerException
at javax.swing.ImageIcon.<init>(ImageIcon.java:228)
at power.<init>(fCGUI.java:53)
at fCGUI.main(fCGUI.java:11)
這是代碼:
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class fCGUI
{
public static void main(String []args)
{
power p=new power();
p.setVisible(true);
}
}
class power extends JFrame
{
JFileChooser chooser;
BufferedImage img;
JButton button,button2;
JFrame comp;
String filename;
File file ;
public power()
{
setSize(450,450);
panel.setLayout(new BorderLayout());
JPanel panel=new JPanel();
getContentPane().add(panel);
button =new JButton("press");
panel.add(button,BorderLayout.NORTH);
chooser = new JFileChooser();
ActionListener action=new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
if (e.getSource()==button)
{
chooser.showOpenDialog(null);
file = chooser.getSelectedFile();
try
{
img=ImageIO.read(file);
}
catch(IOException e1) {}
}
if (e.getSource()==button2)
{
comp.setVisible(true);
}
}
};
ImageIcon icon=new ImageIcon(img);
JLabel label=new JLabel(icon);
JPanel secpanel=new JPanel();
comp=new JFrame();
comp.setSize(650,500);
comp.setLayout(new BorderLayout());
comp.setTitle("View Report");
JRootPane compPane=comp.getRootPane();
Container contePane=compPane.getContentPane();
contePane.add(secpanel);
secpanel.add(label,BorderLayout.CENTER);
button2=new JButton("access");
button2.addActionListener(action);
button.addActionListener(action);
panel.add(button2,BorderLayout.SOUTH);
}
}
在用戶單擊按鈕並選擇要顯示的文件后, img
的值將僅具有實際值。 在此之前, img
值為null
,因此當它繼續通過您的方法並調用行ImageIcon icon=new ImageIcon(img);
,它試圖為null
創建一個ImageIcon
對象。
要更正此問題,您應該只在用戶選擇文件時創建ImageIcon
。 這是一個應該更接近正常工作的變化。 (請參閱以下代碼中的注釋//ADDED
和//REMOVED
以查看更改...
...
class power extends JFrame {
JFileChooser chooser;
BufferedImage img;
JButton button,button2;
JFrame comp;
String filename;
File file ;
JLabel label; // ADDED
public power() {
...
public void actionPerformed(ActionEvent e) {
if (e.getSource()==button) {
chooser.showOpenDialog(null);
file = chooser.getSelectedFile();
try {
img=ImageIO.read(file);
ImageIcon icon=new ImageIcon(img); // ADDED
label.setIcon(icon); // ADDED
Dimension imageSize = new Dimension(icon.getIconWidth(),icon.getIconHeight()); // ADDED
label.setPreferredSize(imageSize); // ADDED
label.revalidate(); // ADDED
label.repaint(); // ADDED
}
catch(IOException e1) {}
}
if (e.getSource()==button2){
comp.setVisible(true);
}
}
};
//ImageIcon icon=new ImageIcon(img); // REMOVED
//JLabel label=new JLabel(icon); // REMOVED
label = new JLabel(); // ADDED
JPanel secpanel=new JPanel();
...
解釋我改變了什么......
label
現在將創建為空的JLabel
。 它也存儲為全局變量,以便我們以后可以訪問它 img
,然后使用setIcon();
將其加載到您的label
setIcon();
revalidate()
和repaint()
以確保在設置圖像后繪制圖像。 只有在按下特定的JButton
時才會執行ImageIO.read
。 那是因為它在ActionListener
。 因此, img
為null,當執行ImageIcon icon=new ImageIcon(img)
時會導致NullPointerException
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.