代码之家  ›  专栏  ›  技术社区  ›  Ken

GRIDBAG布局Java中的图像显示

  •  0
  • Ken  · 技术社区  · 15 年前

    我的图像从服务器传递到我的程序中,并保存为字符串。我想将该字符串转换为图像,然后在 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));
    
    3 回复  |  直到 8 年前
        1
  •  0
  •   Kathy Van Stone    15 年前

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

        2
  •  0
  •   mihi    15 年前

    你应该 总是 在将字符串转换为字节时给出显式编码,因为默认值依赖于平台。

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

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

        3
  •  0
  •   Ken    15 年前

    原来这是我自己的错。上面写的代码没有什么问题,只是我忘记了解码图像字符串。它是从服务器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));