如何在框架中显示图像?

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

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; } 

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

我想人们可能会因为重复这个而讨厌我:P:

  • 不要扩展JFrame类
  • class级名称以首字母开头即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)resize,但这有其危险 ,主要问题是:

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

 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; } 

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