首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从JFileChooser上传图片?

如何从JFileChooser上传图片?
EN

Stack Overflow用户
提问于 2017-05-09 13:46:36
回答 3查看 1.5K关注 0票数 1

我在使用图形将图像放入jPanel时遇到问题。我有下面的代码:

代码语言:javascript
运行
复制
    JFileChooser navegador = new JFileChooser();
    if (navegador.showOpenDialog(null) == 0) {
        try {
            BufferedImage imagenAbrir = ImageIO.read(navegador.getSelectedFile());
            lienzo.paintComponents(imagenAbrir.getGraphics());
        } catch (IOException e) {
            JOptionPane.showMessageDialog(this, "Ocurriò un error al guardar la imàgen");
        }
    }

代码是按钮的一部分,用户可以从任何路径选择图像,但它不会在面板中显示任何内容。可能的问题是什么?

EN

回答 3

Stack Overflow用户

发布于 2017-05-09 14:46:16

我认为你必须用BufferedImage对象而不是图形对象来改变你的方法

代码语言:javascript
运行
复制
@Override
            public void actionPerformed(ActionEvent e) {
                JFileChooser navegador = new JFileChooser();
                if (navegador.showOpenDialog(null) == 0) {
                    try {
                        BufferedImage imagenAbrir = ImageIO.read(navegador.getSelectedFile());
                        //drawPan.paintComponents(imagenAbrir.getGraphics());
                        drawPan.drawImage(imagenAbrir);
                    } catch (IOException ie) {
                        JOptionPane.showMessageDialog(null, "Ocurriò un error al guardar la imàgen");
                    }
                }
            }

然后,如果你想绘制图像,你可以自己创建定制的JPanel类。每次在代码中调用paintCompoent方法时,都会自动调用JComponent的重绘方法。

代码语言:javascript
运行
复制
final class ImagePane extends JPanel {

            private static final long serialVersionUID = 1L;
            private BufferedImage myImage;

            public ImagePane(final BufferedImage myImage) {
                this.myImage = myImage;
            }

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(240, 220);
            }

            public void drawImage(BufferedImage img)
            {
                this.myImage = img;
                repaint();
            }

            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                if (myImage != null) {
                    Graphics2D g2d = (Graphics2D) g.create();
                    int x = (getWidth() - myImage.getWidth()) / 2;
                    int y = (getHeight() - myImage.getHeight()) / 2;
                    g2d.drawImage(myImage, x, y, this);
                    g2d.dispose();
                }
            }

        }

这是完整的源代码。

代码语言:javascript
运行
复制
public class JFileChooserTest {

    static Runnable doRun = new Runnable()
    {
        final class ChooseAction implements ActionListener
        {
            final ImagePane drawPan;

            ChooseAction(final ImagePane drawPan)
            {
                this.drawPan = drawPan;
            }


            @Override
            public void actionPerformed(ActionEvent e) {
                JFileChooser navegador = new JFileChooser();
                if (navegador.showOpenDialog(null) == 0) {
                    try {
                        BufferedImage imagenAbrir = ImageIO.read(navegador.getSelectedFile());
                        //drawPan.paintComponents(imagenAbrir.getGraphics());
                        drawPan.drawImage(imagenAbrir);
                    } catch (IOException ie) {
                        JOptionPane.showMessageDialog(null, "Ocurriò un error al guardar la imàgen");
                    }
                }
            }

        }

        final class ImagePane extends JPanel {

            private static final long serialVersionUID = 1L;
            private BufferedImage myImage;

            public ImagePane(final BufferedImage myImage) {
                this.myImage = myImage;
            }

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(240, 220);
            }

            public void drawImage(BufferedImage img)
            {
                this.myImage = img;
                repaint();
            }

            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                if (myImage != null) {
                    Graphics2D g2d = (Graphics2D) g.create();
                    int x = (getWidth() - myImage.getWidth()) / 2;
                    int y = (getHeight() - myImage.getHeight()) / 2;
                    g2d.drawImage(myImage, x, y, this);
                    g2d.dispose();
                }
            }

        }

        @Override
        public void run() {
            final JFrame frame = new JFrame();
            //frame.setSize(new Dimension(300,400));

            JPanel lienzo = new JPanel();
            lienzo.setLayout(new BorderLayout());

            ImagePane drawPan = new ImagePane(null);
            JButton drawMe = new JButton("draw me");
            lienzo.add(drawMe, BorderLayout.NORTH);
            lienzo.add(drawPan, BorderLayout.CENTER);

            frame.add(lienzo);

            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);

            drawMe.addActionListener(new ChooseAction(drawPan));
        }

    };

    public static void main(String[] args)
    {

        SwingUtilities.invokeLater(doRun);

    }
}

我希望这能对你有所帮助。

票数 3
EN

Stack Overflow用户

发布于 2017-05-09 13:58:10

代码是按钮的一部分,用户可以从任何路径选择图像,但它不会在面板中显示任何内容。可能的问题是什么?

基本上,这不是Swing中自定义绘制的工作方式。永远不要自己调用paintComponentpaintComponents,这不是你的责任。

您要做的是通过组件的Graphics上下文将图像绘制到组件

查看Painting in AWT and SwingPerforming Custom Painting,了解有关绘画的工作原理以及如何使用它的更多详细信息

然后看看How to use lables,找到一个显示图像的简单解决方案

你也可以看看How to set a background picture in JPanel。它演示了如何使用JLabel和自定义组件来显示图像

票数 2
EN

Stack Overflow用户

发布于 2017-05-10 13:20:04

那么,你想在面板上添加图像,其中显示了一些基础图像?如果是这样的话,有一些技巧可以做到这一点。我在互联网上准备了两张图片(恐怕这些都是授权的图片)

然后,现在我在你的类上放了三个按钮

代码语言:javascript
运行
复制
JButton drawMe = new JButton("draw me");
JButton pickMe = new JButton("pick me");
JButton clearMe = new JButton("clear me");

我决定让DrawAction类重用三个动作命令,这三个命令是一起绘制、拾取和清除。

代码语言:javascript
运行
复制
drawMe.addActionListener(drawAct);
drawMe.setActionCommand("draw");
pickMe.addActionListener(drawAct);
pickMe.setActionCommand("pick");
clearMe.addActionListener(drawAct);
clearMe.setActionCommand("clear");

我们将再次看到ImagePane类。如果您想在图像上添加图像,则应该有一个从JComponent继承的paintcomponent方法,无论您想要使用什么组件。

“绘制我”按钮是在清除bufferedimage类的数组列表中的图像列表中的所有图像后设置基础图像。

代码语言:javascript
运行
复制
public void drawImage(BufferedImage img)
{
    if (imageList.size() > 0) imageList.clear();
    imageList.add(img);
    repaint();
}

“pick me”按钮是将图像添加到图像列表的方法。

代码语言:javascript
运行
复制
public void addImage(BufferedImage imagenAbrir) {
    imageList.add(imagenAbrir);
    repaint();
}

最后一个是清除按钮,刷新和清除图像列表中的所有图像缓冲区。

代码语言:javascript
运行
复制
public void clearImage() {
     imageList.clear();
     isClear = true;
     repaint();
}

这是我在面板上清除图像的技巧,它是通过用一些特定的颜色(灰色)重新绘制画布(此时是jPanel)来完成的。main方法,paintComponent如下..

代码语言:javascript
运行
复制
@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);

    if(isClear)
    {
        Graphics2D g2d = (Graphics2D) g.create();
        Rectangle2D rectangle = new Rectangle2D.Double(0,0,getWidth(),getHeight());
        g2d.setPaint(Color.GRAY);
        g2d.fill(rectangle);
        g2d.dispose();

        isClear = false;
        return;
    }


    if (imageList.size() > 0) {
        BufferedImage img = null;
        for(int i = 0; i < imageList.size(); i++)
        {
            img = imageList.get(i);
            Graphics2D g2d = (Graphics2D) g.create();
            int x = (getWidth() - img.getWidth()) / 2;
            int y = (getHeight() - img.getHeight()) / 2;
            g2d.drawImage(img, x, y, this);
            g2d.dispose();
        }
    }
}

最后,您将阅读下面的代码,该代码如何处理动作命令和java组件,

代码语言:javascript
运行
复制
@Override
public void actionPerformed(ActionEvent e) {

    if(e.getActionCommand().equals("draw"))
    {
        JFileChooser navegador = new JFileChooser();
        if (navegador.showOpenDialog(null) == 0) {
            try {
                BufferedImage imagenAbrir = ImageIO.read(navegador.getSelectedFile());
                //drawPan.paintComponents(imagenAbrir.getGraphics());
                drawPan.drawImage(imagenAbrir);
            } catch (IOException ie) {
                JOptionPane.showMessageDialog(null, "Ocurrio un error al guardar la imagen");
            }
        }
    }
    else if(e.getActionCommand().equals("pick"))
    {
        JFileChooser navegador = new JFileChooser();
        if (navegador.showOpenDialog(null) == 0) {
            try {
                BufferedImage imagenAbrir = ImageIO.read(navegador.getSelectedFile());
                //drawPan.paintComponents(imagenAbrir.getGraphics());
                drawPan.addImage(imagenAbrir);
            } catch (IOException ie) {
                JOptionPane.showMessageDialog(null, "Ocurrio un error al guardar la imagen");
            }
        }
    }
    else if(e.getActionCommand().equals("clear"))
    {
        drawPan.clearImage();
    }
}

正如您看到的代码一样,每次单击pick或draw按钮时都需要拾取一个文件。

完整的源代码

代码语言:javascript
运行
复制
package com.tobee.ui.test;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class JFileChooserTest {

    static Runnable doRun = new Runnable()
    {
        final class DrawAction implements ActionListener
        {
            final ImagePane drawPan;

            DrawAction(final ImagePane drawPan)
            {
                this.drawPan = drawPan;
            }


            @Override
            public void actionPerformed(ActionEvent e) {

                System.out.println(e.getActionCommand());

                if(e.getActionCommand().equals("draw"))
                {
                    JFileChooser navegador = new JFileChooser();
                    if (navegador.showOpenDialog(null) == 0) {
                        try {
                            BufferedImage imagenAbrir = ImageIO.read(navegador.getSelectedFile());
                            //drawPan.paintComponents(imagenAbrir.getGraphics());
                            drawPan.drawImage(imagenAbrir);
                        } catch (IOException ie) {
                            JOptionPane.showMessageDialog(null, "Ocurriò un error al guardar la imàgen");
                        }
                    }
                }
                else if(e.getActionCommand().equals("pick"))
                {
                    JFileChooser navegador = new JFileChooser();
                    if (navegador.showOpenDialog(null) == 0) {
                        try {
                            BufferedImage imagenAbrir = ImageIO.read(navegador.getSelectedFile());
                            //drawPan.paintComponents(imagenAbrir.getGraphics());
                            drawPan.addImage(imagenAbrir);
                        } catch (IOException ie) {
                            JOptionPane.showMessageDialog(null, "Ocurriò un error al guardar la imàgen");
                        }
                    }
                }
                else if(e.getActionCommand().equals("clear"))
                {
                    drawPan.clearImage();
                }
            }

        }

        final class ImagePane extends JPanel {

            private static final long serialVersionUID = 1L;
            private boolean isClear;

            private List<BufferedImage> imageList;

            public ImagePane()
            {
                imageList = new ArrayList<BufferedImage>();
                isClear = false;
            }

            public void clearImage() {
                imageList.clear();
                isClear = true;
                repaint();
            }

            public void addImage(BufferedImage imagenAbrir) {
                imageList.add(imagenAbrir);
                repaint();
            }

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(240, 220);
            }

            public void drawImage(BufferedImage img)
            {
                if (imageList.size() > 0) imageList.clear();
                imageList.add(img);
                repaint();
            }

            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);

                if(isClear)
                {
                    Graphics2D g2d = (Graphics2D) g.create();
                    Rectangle2D rectangle = new Rectangle2D.Double(0,0,getWidth(),getHeight());
                    g2d.setPaint(Color.GRAY);
                    g2d.fill(rectangle);
                    g2d.dispose();

                    isClear = false;
                    return;
                }


                if (imageList.size() > 0) {
                    BufferedImage img = null;
                    for(int i = 0; i < imageList.size(); i++)
                    {
                        img = imageList.get(i);
                        Graphics2D g2d = (Graphics2D) g.create();
                        int x = (getWidth() - img.getWidth()) / 2;
                        int y = (getHeight() - img.getHeight()) / 2;
                        g2d.drawImage(img, x, y, this);
                        g2d.dispose();
                    }
                }
            }

        }

        @Override
        public void run() {
            final JFrame frame = new JFrame();

            JPanel lienzo = new JPanel();
            lienzo.setLayout(new BorderLayout());


            JPanel optionPan = new JPanel();
            ImagePane drawPan = new ImagePane();
            JButton drawMe = new JButton("draw me");
            JButton pickMe = new JButton("pick me");
            JButton clearMe = new JButton("clear me");

            DrawAction drawAct = new DrawAction(drawPan);

            optionPan.add(drawMe);
            optionPan.add(pickMe);
            optionPan.add(clearMe);

            lienzo.add(optionPan, BorderLayout.NORTH);
            lienzo.add(drawPan, BorderLayout.CENTER);

            frame.add(lienzo);

            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);

            drawMe.addActionListener(drawAct);
            drawMe.setActionCommand("draw");
            pickMe.addActionListener(drawAct);
            pickMe.setActionCommand("pick");
            clearMe.addActionListener(drawAct);
            clearMe.setActionCommand("clear");
        }

    };

    public static void main(String[] args)
    {

        SwingUtilities.invokeLater(doRun);

    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43861991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档