【问题标题】:How to display an image in a frame?如何在框架中显示图像?
【发布时间】:2012-10-21 09:13:21
【问题描述】:

我正在编写一个 gui,我想使用嵌入一些图片,但在将它嵌入到我的主程序之前,我编写了该代码来测试它:

    public class guikopie extends javax.swing.JFrame{
        public guikopie() {
            a = new javax.swing.JLabel();
            setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
            a.setIcon(new javax.swing.ImageIcon("C:\\Users\\Public\\Pictures\\Sample Pictures\\Tulpen.jpg"));       
            add(a);//here i add it to the jlabel
            pack();
        }

        public static void main(String args[]){
            java.awt.EventQueue.invokeLater(new Runnable() {
                public void run() {
                    new guikopie().setVisible(true);
                }
            });
        }

        private javax.swing.JLabel a;
    }

我的问题是:为什么这段代码不显示图片?

【问题讨论】:

标签: java image swing user-interface jframe


【解决方案1】:

我认为人们可能会因为我重复这一点而讨厌我:P:

  • 不要扩展 JFrame 类
  • 类名以大写字母开头,即Guikopie

还取决于背景的用途,即如果它的标志将被添加到JPanel 上的特定位置,那么使用JLabel 就可以了,但是,如果它被用作背景它不是;因为随着更多组件的添加,它会四处移动,因此我们不应该将背景添加为组件,而是在组件上绘制背景。

至于你的问题:

我的问题是:为什么这段代码不显示图片?

您的代码非常适合我,因此您的图片位置一定不正确。

我做了一个简短的示例,展示了如何将Image 添加到JPanel 背景,然后将JPanel 添加到JFrame,它还包括用于调整图片大小的ImgUtils 类:

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class JFrameWithPicture {

    public JFrameWithPicture() throws MalformedURLException, IOException {
        initComponents();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    new JFrameWithPicture();
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        });
    }

    private void initComponents() throws MalformedURLException, IOException {
        JFrame frame = new JFrame("Frame with JPanel and background");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        final Image background = ImageUtils.scaleImage(300, 300, ImageIO.read(new URL("http://images2.layoutsparks.com/1/98191/naruto-14-red-design.jpg")));
        final Dimension jpanelDimensions = new Dimension(new ImageIcon(background).getIconWidth(), new ImageIcon(background).getIconHeight());

        frame.add(new JPanel() {
            @Override
            protected void paintComponent(Graphics grphcs) {
                super.paintComponent(grphcs);
                grphcs.drawImage(background, 0, 0, this);
            }

            @Override
            public Dimension getPreferredSize() {
                return jpanelDimensions;
            }
        });

        frame.setResizable(false);
        frame.pack();
        frame.setVisible(true);
    }
}

class ImageUtils {

    public static BufferedImage scaleImage(int width, int height, String filename) {
        BufferedImage bi;
        try {
            ImageIcon ii = new ImageIcon(filename);
            bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            Graphics2D g2d = (Graphics2D) bi.createGraphics();
            g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY));
            g2d.drawImage(ii.getImage(), 0, 0, width, height, null);
        } catch (Exception e) {
            return null;
        }
        return bi;
    }

    static Image scaleImage(int width, int height, BufferedImage filename) {
        BufferedImage bi;
        try {
            bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            Graphics2D g2d = (Graphics2D) bi.createGraphics();
            g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY));
            g2d.drawImage(filename, 0, 0, width, height, null);
        } catch (Exception e) {
            return null;
        }
        return bi;
    }
}

或者,您可能想使用Image#getScaledInstance(int width,int height,int hints) 调整大小,但this has its perils,主要问题是:

Image.getScaledInstance() 不返回完成的缩放图像。 它将大部分缩放工作留给以后图像 使用像素。

【讨论】:

  • @Sujay +1 谢谢你,谁能不爱火影忍者和九尾?! :P
  • @DavidKroukamp 为什么不扩展 JFrame?
  • @PrototypeStark 1) 你只能扩展类来添加功能 2) 一旦你扩展了JFrame 你就不能扩展另一个你可能实际上需要的类
【解决方案2】:
import javax.swing.*;
public class guikopie extends javax.swing.JFrame{
    public guikopie() {
        a = new javax.swing.JLabel();
        JPanel panel = new JPanel();
        panel.add(a);
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        a.setIcon(new javax.swing.ImageIcon("C:\\Users\\Public\\Pictures\\Sample Pictures\\Tulips.jpg"));
        getContentPane().add(panel);
        pack();
    }

    public static void main(String args[]){
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new guikopie().setVisible(true);
            }
        });
    }

    private javax.swing.JLabel a;
}

检查此代码。你的路径可能是错误的。

【讨论】:

  • 你的sn-p与OP的代码解决问题的区别是......?
  • @kleopatra 路径正确吗? Tulipen.jpg 未找到,永远不会在我的计算机上找到(非西班牙语)
  • 这不是重现整个 sn-p 的理由(包括违反命名约定...)
猜你喜欢
  • 1970-01-01
  • 2015-01-14
  • 1970-01-01
  • 2020-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多