java - 在构造函数中加载图像代码可以工作,相同的代码在按钮和文件选择器操作中不起作用?

标签 java image swing load

我尝试加载图像,我找到了一个代码,它运行良好,加载图像的代码在构造函数中,我尝试将其移动到 button行动,也到filechooser 。但永远不要加载图像。代码中没有错误,并且我使用 print 语句测试了这些子句,它们表明这些子句已通过。

这是一个 SSCCE:

构造函数代码分为UpperLower两部分。通过注释和取消注释交替来演示这些代码之间的问题。每个

下部部分可以工作;它从构造函数加载图像。
部分设置从 Action 代码加载图像所需的 JPanel 和 JButton。

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
import javax.swing.*;

public class ImgLoadTest extends JPanel implements ActionListener
{

    File file;
    BufferedImage img;
    JButton fileChooserButton;
    JButton showImgButton;
    JPanel imgePanel;
    JPanel widgetPanel;
    JFileChooser fileChooser;

    @Override
    public void paintComponent(Graphics g)
    {
        g.drawImage(img, 0, 60, null);
    }

    public ImgLoadTest()
    {
           //Upper:

//        fileChooser = new JFileChooser();
//
//        fileChooserButton = new JButton("Browse");
//        fileChooserButton.addActionListener(this);
//        showImgButton = new JButton("Show Image");
//        showImgButton.addActionListener(this);
//
//        imgePanel = new JPanel();
//        widgetPanel = new JPanel();
//        this.setLayout(new BorderLayout());
//        widgetPanel.add(fileChooserButton);
//        widgetPanel.add(showImgButton);
//        this.add(imgePanel, BorderLayout.CENTER);
//        this.add(widgetPanel, BorderLayout.EAST);


        /*
         *  try alternating (comment/uncomment) between 
         *  the upper code (in this constructor)
         *  and the lower code below;
         */

          //Lower:

        try
        {
            img = ImageIO.read(new File("D:\\De.JPG"));
        } catch (IOException e)
        {
        }

    }

    @Override
    public void actionPerformed(ActionEvent e)
    {
        Object source = e.getSource();
        if (source == fileChooserButton)
        {
            int reternedValue = fileChooser.showOpenDialog(ImgLoadTest.this);

            if (reternedValue == JFileChooser.APPROVE_OPTION)
            {
                file = fileChooser.getSelectedFile();
                try
                {
                    img = ImageIO.read(file);
                    System.out.println("File chooser: Image accepted");
                    this.repaint();

                } catch (IOException err)
                {
                    System.out.println("error " + err);
                }
            } else
            {
                System.out.println("No Image");
            }
        }
        if (source == showImgButton)
        {
            try
            {
                System.out.println("button: Image accepted");
                img = ImageIO.read(new File("D:\\De.JPG"));
                repaint();
            } catch (IOException err)
            {
                System.out.println("No Image");
                System.out.println("error " + err);
            }
        }
    }

    public static void main(String[] args)
    {
        JFrame frame = new JFrame("Image load test");
        frame.setSize(new Dimension(400, 600));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        ImgLoadTest imgLoadTest = new ImgLoadTest();
        frame.add(imgLoadTest);
        frame.setVisible(true);
    }
}

最佳答案

仅分配 BufferedImage img 不会使图像出现。您可以添加一个包含图像的 JLabel:

JLabel picLabel = new JLabel(new ImageIcon(img));
imgePanel.add(picLabel);
imgePanel.revalidate();
imgePanel.repaint();

关于java - 在构造函数中加载图像代码可以工作,相同的代码在按钮和文件选择器操作中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14643419/

相关文章:

java - 如何修改 jbpm-console 应用程序以使其从数据库检索用户、角色和组列表?

mysql - 将图像存储在 MySQL 数据库中

javascript - Jquery Onclick 事件函数第二次不起作用

java - Android:操作图像并在图像周围添加白色边框

java - Libgdx 在绘制另一个屏幕时加载一个屏幕

java - 仅从字符串中删除空格

java - 我的 JTable 根本不显示

Java ImageIcon/Icon 和 JLabel 不工作

java - 在 2 个或更多正则表达式中拆分字符串

java - 2 个 JButtons 2 GUI