gpt4 book ai didi

java - 使用 JFileChooser 将图像加载到 JFrame 中

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:22:13 24 4
gpt4 key购买 nike

我正在尝试编写一段代码,将使用 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 的值只有在用户点击按钮并选择要显示的文件后才有真正的值(value)。直到此时,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();
...

解释我所做的更改...

  1. label 现在将在您首次启动程序时创建为空的 JLabel。它还存储为全局变量,以便我们稍后访问它
  2. 单击按钮时,将像以前一样创建 img,然后使用 setIcon(); 将其加载到您的 label 中>
  3. 调整标签大小,然后执行 revalidate()repaint() 以确保图像在设置后绘制。

关于java - 使用 JFileChooser 将图像加载到 JFrame 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10737029/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com