【问题标题】:Image display within GridBagLayout JavaGridBagLayout Java 中的图像显示
【发布时间】:2009-06-25 18:58:38
【问题描述】:

我的图像从服务器传递到我的程序并保存为字符串。我想将该字符串转换为图像,然后在GridBagLayout 内的标签内显示该图像。当我执行下面的代码时,我得到一个空白框。执行过程中没有异常。当我在调试中查看来自ToolKit 的图像对象时,它确实说高度和宽度为-1(但source = ByteArrayImageSource 中的“图像数据”具有字节[5144])。有什么想法吗?

添加注意:图像作为字符串存储在程序中,因为数据在 C# 中序列化,并在 Java 中反序列化。这个过程显然不喜欢反序列化过程中的byte[],所以我将其保存为字符串,并在我想使用图像时使用getBytes

imageToDisplay = Toolkit.getDefaultToolkit().createImage(myString.getBytes());
ImageIcon logoIcon = new ImageIcon(imageToDisplay);
JLabel logolabel = new JLabel(logoIcon);
mainPanel.add(logolabel, new GridBagConstraints(0, 0, 1, 1, 1.0, 1.0,
                GridBagConstraints.EAST, GridBagConstraints.HORIZONTAL, 
                new Insets(2, 2, 2, 2), 0, 0));
mainFrame.add(mainPanel, new GridBagConstraints(0, 0, 1, 1, 1.0, 1.0,
                GridBagConstraints.CENTER, GridBagConstraints.BOTH, 
                new Insets(2, 2, 2, 2), 0, 0));

【问题讨论】:

  • 你能不能用一个简单的 FlowLayout 试试看能不能显示出来?
  • 我也尝试过使用 FlowLayout 和 GridLayout,结果总是一个空白框。
  • 图片加载完成后有人没有收到更新?

标签: java arrays image


【解决方案1】:

首先您需要确定问题是图像还是布局。做 mmyers 的建议并将其放置在一个带有 FlowLayout 的面板(可能单独)。如果它仍然没有出现,它可能是图像。输入转换为字符串是否有原因?默认字符集可能无法干净地处理转换(即字节 -> 字符串 -> 字节可能不会给您相同的初始字节)。

【讨论】:

  • 我已经检查过尝试将图像从我的文件系统放入标签中(只需将文件路径放入 ImageIcon 构造函数中)并且它在标签中正确显示。
  • 请参阅关于为什么标签存储为字符串的附加说明。但看起来有些东西没有像你想象的那样转换字节 -> 字符串 -> 字节
  • 你需要检查 C# 是如何序列化它的。您用来获取字符串的实际代码是什么?我本来希望 C# 序列化为字节。
【解决方案2】:

您应该始终在将字符串转换为字节时给出显式编码,因为默认值取决于平台。

在大多数情况下使用ISO-8859-1 会起作用,因为该编码会将字节 0 到 255 映射到字符 U+0000 到 U+00FF。

当然,您必须确保当您在 C# 中将数据转换为字符串时,数据不会被破坏(您也可以在那里提供编码...)。

【讨论】:

  • 在 getBytes 方法中添加“UTF-8”的编码类型没有帮助。即使我尝试使用 ImageIO 将图像输出到文件中,它也会抛出一个异常,说高度和宽度为 -1。
  • 我现在的猜测是错误从 C# 中的 byte[] 到 Java 中的 String...回到 Java 中的 byte[]
  • 如果您还没有,请查看文章“每个软件开发人员绝对、肯定必须了解 Unicode 和字符集的绝对最低要求(没有任何借口!)”(joelonsoftware.com/articles/Unicode.html)。
【解决方案3】:

原来这是我自己的错。除了忘记解码图像字符串之外,我上面编写的代码没有任何问题。它是从服务器 Base64 编码传递的,我在该编码字符串上使用 getBytes 并将其传递给“createImage”函数。感谢您的建议和帮助。正确的代码如下:

try 
{
        imageToDisplay = Toolkit.getDefaultToolkit().createImage(Base64.decode(myString));
} catch (Exception e1) {
        //          // TODO Auto-generated catch block
        e1.printStackTrace();
}

ImageIcon logoIcon = new ImageIcon(imageToDisplay);
JLabel logolabel = new JLabel(logoIcon);
mainPanel.add(logolabel, new GridBagConstraints(0, 0, 1, 1, 1.0, 1.0,
    GridBagConstraints.EAST, GridBagConstraints.HORIZONTAL, 
    new Insets(2, 2, 2, 2), 0, 0));

【讨论】:

    猜你喜欢
    • 2011-09-02
    • 1970-01-01
    • 2012-06-03
    • 2012-01-27
    • 1970-01-01
    • 2010-09-07
    相关资源
    最近更新 更多