我的图像从服务器传递到我的程序中并保存为字符串。我想将该字符串转换为图像,然后在GridBagLayout
内的标签内显示该图像。当我执行下面的代码时,我得到一个空白框架。执行期间没有例外。当我在调试中查看ToolKit
中的图像对象时,它确实表示高度和宽度为-1(但source = ByteArrayImageSource
中的“imagedata”具有字节[5144])。有什么想法吗?
添加注意:Image作为String存储在程序中,因为数据是在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));
答案 0 :(得分:0)
首先,您需要确定问题是图像还是布局。 mmyers建议并使用FlowLayout将其放置在面板上(可能单独使用)。如果它仍未显示,则可能是图像。是否有将输入转换为String的原因?默认字符集可能无法干净地处理转换(即,bytes - > String - >字节可能无法为您提供相同的初始字节)。
答案 1 :(得分:0)
将String转换为字节时,始终会给出明确的编码,因为默认值取决于平台。
在大多数情况下使用ISO-8859-1
都可以,因为该编码将字节0到255映射到字符U + 0000到U + 00FF。
当然,当你将数据转换为C#中的String时,你必须确保数据没有被破坏(你可以在那里给出一个编码......)。
答案 2 :(得分:0)
原来这是我自己的错。除了忘记解码图像字符串之外,上面编写的代码没有任何问题。它从服务器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));