【问题标题】:I need help inserting an image to a JPanel in java,我需要帮助将图像插入 java 中的 JPanel,
【发布时间】:2022-01-17 06:35:20
【问题描述】:

这是我写的代码,它没有导致没有图像输出面板只是空的 我的目标是有一个有 8 个面板的框架,每个面板都包含一张图片

      ImageIcon image1 = new ImageIcon("kenya.png");
       Image ken = image1.getImage();   
       Image kenya = ken.getScaledInstance(200,100,java.awt.Image.SCALE_FAST);
       image1 = new ImageIcon(kenya);
       
     JFrame frame = new JFrame("Ticket airline system");
    frame.setVisible(true);
    frame.setSize(1800,1000);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JPanel panel = new JPanel();
    panel.setBackground(new Color(200,250,255)); 
    panel.setSize(1800,1000);
    panel.setLayout(null);
    panel.setBounds (0,0,1800,1000); 
    JPanel panel1 = new JPanel();
    panel1.setBounds(0,140,300,280);
    panel1.setLayout(null);
    JLabel label1 = new JLabel();
    label1.setSize(200,180);
    
    label1.setIcon(image1); 
    panel1.add(label1);
    panel.add(panel1);
   frame.add(panel);

【问题讨论】:

  • panel.setLayout(null); 对您的事业没有帮助。
  • @MadProgrammer 相信我,哈哈,我试图摆脱它,但输出变得疯狂
  • 相信我(网上有些陌生人说???更多详情请见Laying Out Components Within a Container

标签: java swing jpanel jlabel imageicon


【解决方案1】:

null 或“像素完美”布局是一种错觉。决定组件的最佳尺寸/位置和关系的因素有很多,您需要花费大量时间尝试使其在每个平台上都能正常工作。

相反,利用所有已经完成的工作,更多详情请参阅Laying Out Components Within a Container

ImageIcon(String) 期望在磁盘上您指定的位置找到一个文件。由于您使用的是相对路径,因此这将偏离应用程序的“工作”位置(即启动目录)。

如果图像“似乎没有加载”,我会考虑使用System.out.println(new File("kenya.png").exists()); 之类的东西,这将很好地指示问题是图像文件本身还是图像文件可以'在当前上下文中找不到。

如果你想知道当前工作目录是什么,可以使用System.out.println(System.getProperty("user.dir"));之类的东西

ImageIcon 还将尝试在后台线程中加载图像,这意味着如果失败,它将默默地加载。由于这个(以及其他一些)原因,我更喜欢使用ImageIO.read,请参阅Reading/Loading an Image

现在,解决外部文件问题的一种方法是将它们直接“嵌入”到应用程序上下文中。通常这是通过将它们包含在生成的 Jar 中来完成的。根据您构建的系统和 IDE,您应该能够将图像添加到项目中的“位置”,这将使它们在开发过程中很容易获得,并在导出时自动将它们包含在 Jar 中。

在 Netbeans(使用基于 Ant 的项目)中,您可以简单地将资源放到 src 目录中。

一旦它们被“嵌入”,就不能再将它们当作文件,而是需要根据需要使用Class#getResourceClass#getResourceAsStream

例如...

BYO 自己的图片(我不应该这么说,但你会感到惊讶)。

我还特意将列数设置为 3,以便“突出显示”更好地显示。

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    JFrame frame = new JFrame();
                    frame.add(new TestPane());
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                } catch (IOException ex) {
                    Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() throws IOException {
            setLayout(new GridLayout(-1, 3));
            for (int index = 0; index < 8; index++) {
                BufferedImage img = ImageIO.read(getClass().getResource("/images/Cute" + (index + 1) + ".png"));
                JLabel label = new JLabel(new ImageIcon(img.getScaledInstance(-1, 50, Image.SCALE_SMOOTH)));
                JPanel panel = new JPanel(new GridBagLayout());
                panel.add(label);
                if (index % 2 == 0) {
                    panel.setBackground(Color.DARK_GRAY);
                }
                add(panel);
            }
        }

    }
}

现在,如果您希望图像可以选择,那么您应该考虑使用JList,它可以支持列和行(默认为单列)

如果您希望将图像列在单个列中(对于上面的示例),则更改 GridLayout 使用的列数,这比尝试自己手动重新计算位置要简单得多?

Image#setScaledInstance 既不高效也不美观,请参阅

更多详情

【讨论】:

  • System.out.println(new File("kenya.png").exists())的输出;是假的。请告诉我这意味着什么以及如何解决它
  • ps:图片都粘贴在我的项目src文件夹中
  • “请告诉我这意味着什么以及如何解决它” - 我做了,我解释了嵌入式资源。 “如何”将归结为您的 IDE。在我的测试项目中,图片位于src/images,显然src在运行时不会存在,所以偏移路径变为/images
  • 疯狂的程序员非常感谢您的耐心和帮助。我会尝试应用你刚刚告诉我的内容
  • 嵌入式资源可能需要一些时间和精力才能让您了解,但一旦您这样做,它们将解决很多问题
猜你喜欢
  • 2019-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-26
  • 1970-01-01
相关资源
最近更新 更多