2009-06-25 26 views
0

Mein Bild wird von einem Server in mein Programm übernommen und als String gespeichert. Ich möchte diese Zeichenfolge in ein Bild konvertieren und dann wiederum dieses Bild innerhalb eines Labels innerhalb eines GridBagLayout anzeigen. Wenn ich den untenstehenden Code ausführe, bekomme ich einen leeren Rahmen. Keine Ausnahmen während der Ausführung. Wenn ich das Bildobjekt von der ToolKit in debug anschaue, heißt es, Höhe und Breite sind -1 (aber die "Bilddaten" innerhalb der source = ByteArrayImageSource hat Byte [5144]). Irgendwelche Ideen?Bildanzeige in GridBagLayout Java

hinzugefügt Hinweis: Image wird im Programm als String gespeichert, da die Daten in C# serialisiert und innerhalb von Java deserialisiert werden. Dieser Prozess scheint nicht byte[] im Deserialize-Prozess, so dass ich es als Zeichenfolge speichern und getBytes verwenden, wenn ich das Bild verwenden möchte.

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

Können Sie es mit einem einfachen FlowLayout versuchen und sehen, ob es sich zeigt? –

+0

Ich habe es mit einem FlowLayout und einem GridLayout auch versucht, immer ein leerer Rahmen als Ergebnis. –

+0

Jemand erhält das Update nicht, wenn das Bild geladen ist? –

Antwort

0

Stellt sich heraus, das war meine eigene Schuld. Es ist nichts falsch mit dem Code, den ich oben geschrieben habe, außer dass ich vergessen habe, die Bildfolge zu dekodieren. Es wird vom Base64-codierten Server übergeben, und ich habe getBytes für diese codierte Zeichenfolge verwendet und diese in die Funktion "createImage" übergeben. Danke für deine Vorschläge und Hilfe. Der korrekte Code ist unten:

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

Zuerst müssen Sie herausfinden, ob das Problem das Bild oder das Layout ist. Do mmyers suggestion und platziere es (möglicherweise selbst) mit einem FlowLayout. Wenn es immer noch nicht angezeigt wird, könnte es das Bild sein. Gibt es einen Grund, warum die Eingabe in einen String konvertiert wird? Der Standardzeichensatz kann die Konvertierung möglicherweise nicht sauber verarbeiten (dh Bytes -> String -> Bytes geben möglicherweise nicht die gleichen Anfangsbytes zurück).

+0

Ich habe versucht, ein Bild aus meinem Dateisystem in das Etikett zu kopieren (indem ich einfach den Dateipfad in den ImageIcon-Konstruktor platziere) und es wird korrekt im Etikett angezeigt. –

+0

Bitte beachten Sie die hinzugefügte Notiz, warum das Label als String gespeichert wird. Aber es sieht so aus, als ob etwas nicht konvertiert, wie Sie dachten Bytes -> String -> Bytes –

+0

Sie müssen überprüfen, wie C# es serialisiert. Was ist der tatsächliche Code, den Sie verwenden, um die Zeichenfolge zu erhalten? Ich hätte erwartet, dass C# als Bytes serialisieren würde. –

0

sollten Sie immer geben eine explizite Codierung beim Konvertieren einer Zeichenfolge in Bytes, da der Standardwert plattformabhängig ist.

Die Verwendung von ISO-8859-1 funktioniert in den meisten Fällen, da diese Codierung die Bytes 0 bis 255 auf die Zeichen U + 0000 bis U + 00FF abbildet.

Natürlich müssen Sie sicherstellen, dass die Daten nicht beschädigt wurden, wenn Sie sie in C# in einen String umgewandelt haben (Sie können dort auch eine Kodierung angeben ...).

+0

Das Hinzufügen des Codierungstyps "UTF-8" zur getBytes-Methode hat nicht geholfen. Selbst wenn ich versuche, das Bild unter Verwendung von ImageIO in eine Datei auszugeben, löst es eine Ausnahme aus, die besagt, dass Höhe und Breite -1 sind. –

+0

Ich rate jetzt ist Fehler von Byte [] in C# ... zu String in Java ... zurück zu Byte [] in Java –

+0

Wenn Sie noch nicht, überprüfen Sie den Artikel "Das absolute Minimum jeder Software-Entwickler absolut, Positiv muss über Unicode und Zeichensätze (keine Ausreden!) Wissen "(http://www.joelonsoftware.com/articles/Unicode.html). –