2009-06-25 7 views
0

내 이미지가 서버에서 내 프로그램으로 전달되고 문자열로 저장됩니다. 해당 문자열을 이미지로 변환 한 다음 해당 이미지를 GridBagLayout의 레이블 안에 차례로 표시하려고합니다. 아래 코드를 실행하면 빈 프레임이 생깁니다. 실행 중에는 예외가 없습니다. ToolKit의 이미지 객체를 디버그 할 때 높이와 너비가 -1이라고 가정합니다 (그러나 source = ByteArrayImageSource의 "imagedata"는 바이트 [5144]를가집니다). 어떤 아이디어?GridBagLayout 내의 이미지 표시 Java

추가 정보 참고 : 이미지는 C#에서 직렬화되고 Java 내에서 직렬화되기 때문에 프로그램에 String으로 저장됩니다. 이 프로세스는 deserialize 프로세스에서 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

간단한 FlowLayout으로 시도해 볼 수 있습니까? –

+0

나는 FlowLayout과 GridLayout을 사용해 보았는데, 항상 빈 프레임이었다. –

+0

이미지로드가 완료되면 누군가 업데이트를받지 못합니다. –

답변

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)); 
0

먼저 문제가 이미지인지 레이아웃인지 확인해야합니다. mmyers 제안을하고 FlowLayout을 사용하여 패널 (아마도 그 자체로)을 배치하십시오. 그래도 표시되지 않으면 이미지가 나타날 수 있습니다. 입력이 String으로 변환되는 이유가 있습니까? 기본 charset은 변환을 완전히 처리하지 못할 수도 있습니다 (즉, bytes -> String -> bytes는 동일한 초기 바이트를 제공하지 않을 수도 있음).

+0

파일 시스템의 이미지를 레이블에 넣으려고했는지 확인했습니다. 파일 경로를 ImageIcon 생성자에 배치하면 레이블에 올바르게 표시됩니다. –

+0

레이블이 String으로 저장되는 이유에 대한 추가 참고 사항을 참조하십시오. 하지만 당신이 생각한 것처럼 무언가가 변환되지 않는 것처럼 보입니다. -> string -> bytes –

+0

C#을 어떻게 serialize하는지 확인해야합니다. 문자열을 가져 오는 데 사용하는 실제 코드는 무엇입니까? C#을 바이트로 직렬화 할 것으로 예상 했었습니다. –

0

항상은 문자열을 바이트로 변환 할 때 명시 적 인코딩을 제공합니다. 기본값은 플랫폼에 따라 다르기 때문에입니다.

ISO-8859-1을 사용하면 인코딩이 0에서 255 바이트의 문자를 U + 0000에서 U + 00FF 문자로 매핑하기 때문에 대부분의 경우 작동합니다.

물론 데이터를 C#의 문자열로 변환 할 때 데이터가 엉망이되지 않도록해야합니다 (물론 인코딩을 지정할 수도 있습니다 ...).

+0

"UTF-8"의 인코딩 유형을 getBytes 메소드에 추가하는 것이 도움이되지 않았습니다. ImageIO를 사용하여 이미지를 파일로 출력하려고해도 높이와 너비가 -1이라는 예외가 발생합니다. –

+0

내 생각 엔 C#의 byte []에서 Java의 String으로 ... –

+0

의 바이트 []로 돌아가는 오류가 아직 없다면 "절대적으로 모든 소프트웨어 개발자의 절대 최소, 확실하게 유니 코드와 문자 집합에 대해 알아야합니다 (변명의 여지가 없습니다!) "(http://www.joelonsoftware.com/articles/Unicode.html). –