【问题标题】:I can't get image to display我无法显示图像
【发布时间】:2016-06-28 21:54:37
【问题描述】:

我正在开发一个聊天客户端程序,目前我可以获得文本窗格,左侧的文本输入。我可以添加按钮并将背景颜色更改为右侧,但无法在右侧显示图像。从我所读到的内容中,有不止一种方法可以在此上给猫剥皮,但我正在尝试坚持我目前拥有的设置,因此我不必重写所有内容。我了解 Java (OOP) 的基础知识及其工作原理。我只是迷失了如何格式化图像图标并让这个图像显示。这是代码:我正在使用 IntelliJ 进行编译。

package edu.lmu.cs.networking;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import javax.swing.ImageIcon;
import javax.imageio.ImageIO;
import javax.swing.*;

public class ChatClient {
    private BufferedReader in;
    private PrintWriter out;
    private JFrame frame = new JFrame("Chatter");
    private JTextField textField = new JTextField(20);
    private JTextArea messageArea = new JTextArea(8, 40);
    private JPanel panel;
    private JButton button;
    private JLabel label;

    public ChatClient() {
        textField.setEditable(false);
        messageArea.setEditable(false);
        // frame.setSize(500, 500);
        // frame.setVisible(true);
        frame.getContentPane().add(textField, "South");
        frame.getContentPane().add(new JScrollPane(messageArea), "West");
        panel = new JPanel();
        panel.setBackground(Color.YELLOW);
        button = new JButton("Button");
        label = new JLabel(new ImageIcon("x.gif"));
        panel.add(button);
        panel.add(label, BorderLayout.EAST);
        frame.add(panel);
        frame.pack();
        textField.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                out.println(textField.getText());
                textField.setText("");
            }
        });
    }

    private String getServerAddress() {
        return JOptionPane.showInputDialog(frame, "Enter IP Address of the Server:",
                "Welcome to the Chatter", JOptionPane.QUESTION_MESSAGE);
    }

    private String getName() {
        return JOptionPane.showInputDialog(frame, "Choose a screen name:", "Screen name selection",
                JOptionPane.PLAIN_MESSAGE);
    }

    private void run() throws IOException {
        // Make connection and initialize streams
        String serverAddress = getServerAddress();
        Socket socket = new Socket(serverAddress, 5910);
        in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        out = new PrintWriter(socket.getOutputStream(), true);
        while (true) {
            String line = in.readLine();
            if (line.startsWith("SUBMITNAME")) {
                out.println(getName());
            } else if (line.startsWith("NAMEACCEPTED")) {
                textField.setEditable(true);
            } else if (line.startsWith("MESSAGE")) {
                messageArea.append(line.substring(8) + "\n");
            }
        }
    }

    public static void main(String[] args) throws Exception {
        ChatClient client = new ChatClient();
        client.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        client.frame.setVisible(true);
        client.run();
    }
}

提前致谢, -布兰登

【问题讨论】:

  • 这段代码能编译吗?
  • 例如,您在 JLabel 中创建的 CreateImageIcon 类是什么?为什么不调用实际的 ImageIcon 构造函数?
  • 我发布了整个代码。它编译得很好。只是没有图像。我正在尝试用我编辑的 CreateImageIcon 做一些不同的事情。
  • 您的问题与其他数百个类似的问题相同-您没有正确查找图像,图像文件的路径是相对于用户目录的,而您不是考虑到这一点。但无论如何,您应该按照克强的建议使用资源。
  • 但是感谢您现在发布更有意义的代码。

标签: java image swing icons jpanel


【解决方案1】:

如果图像在您的项目根目录中,那么您可以直接访问它,类似于您所做的。 如果它位于项目结构中的某个文件夹(例如资源文件夹)内,则需要使用getClass().getResource("/resources/x.gif")

您还可以创建图像的缩放版本,指定高度和宽度。可以使用以下示例代码完成:

ImageIcon icon = new ImageIcon("x.gif");
  Image img = icon.getImage();
  Image newimg = img.getScaledInstance(30, 20,
            java.awt.Image.SCALE_SMOOTH);
    icon = new ImageIcon(newimg);
  label = new JLabel(icon);

【讨论】:

  • 我注释掉了我的代码,复制并粘贴了它,但仍然一无所获。图像在文件夹中。我已经成功地测试并运行了几个基本的图像程序。只是当我尝试添加到这个套接字代码时它不会显示。相同的图像在更简单的程序中也有效。如果您想尝试自己编译,我还发布了完整的项目代码
  • 你可以分享你的项目结构吗?只是为了检查图像的确切位置以及访问图像的java文件。
  • 我编译并执行了你的课程,它工作正常,显示了一个我放在根文件夹中的 gif 图像。请分享你的文件夹结构,这可能有助于解决问题。
  • 好的,我正在查看目录结构,我注意到很多额外的东西不属于那里,因为我尝试了几十种不同的东西。与我测试过的所有其他图像程序一样,该图片位于项目的根目录中。我复制了我的代码并丢弃了整个项目并开始了一个全新的项目。这次你的代码运行良好。自从 Apple IIgs 和 PC 上的 C 以来,我一直在编程,这样的事情我永远不会理解。我已经坚持了5天了。谢谢大家的建议和帮助。
【解决方案2】:

您可以按如下方式更改您的代码,它会起作用。刚刚在我自己的电脑上测试了一下,效果很好。

    ImageIcon icon = new ImageIcon(getClass().getResource("x.gif"));

    label = new JLabel(icon);

看来你的问题是你实际上并没有加载图像。记得使用 ClassLoader 来加载资源文件。

您应该将“x.gif”放在您的项目目录或您的资源文件夹(首选)下以使其正常工作。

有关加载资源的更多详细信息,请查看this link

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-31
    • 2021-09-04
    • 2018-03-22
    • 1970-01-01
    相关资源
    最近更新 更多