Java jTable, добавляющий HTML-тег img с изображением base64 - PullRequest
0 голосов
/ 31 января 2019

Новое в Java и JTable.Я хочу добавить изображение в одну из ячеек в столбце.Я могу добавить изображение, но оно не отображается, просто изображение сломанного изображения:

enter image description here

Это код, которым я являюсьиспользуя для заполнения этих изображений:

@SuppressWarnings("unused")
public void createAvatar(String b64image, String name, int row, int col) {      
    String html = String.format("<html><table><td><img alt=\"Avatar\" style=\"position: absolute; top: 0px; left: 0px;\" src=\"data:image/png;base64,%s\"/>%s</td></table></html>", b64image, name);
    table.setValueAt(html, row, col);
}
private void initialize() throws Exception {
...MORE CODE HERE...
try {
    for (int i = 0; i < b64s.size(); i++) {
       createAvatar(b64s.get(i), names.get(i), i, 8);
    }
} catch(Exception e) {
    JOptionPane.showMessageDialog(null, e);
}

table = new JTable(model) {
   @Override
   public boolean isCellEditable (int row, int col)
   {
        return true;
   }

   public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col) {
        return null;
   }

   public Component prepareRenderer(TableCellRenderer renderer, int row, int column) {
        Component c = super.prepareRenderer(renderer, row, column);

        if (c instanceof JComponent) {
             if(column == 4){
                JComponent jc = (JComponent) c;
                jc.setToolTipText(getValueAt(row, column).toString());
             }
        }

        return c;
   }
};

table.getModel().addTableModelListener(new TableModelListener() {
   @SuppressWarnings("static-access")
   public void tableChanged(TableModelEvent e) {
   ...MORE CODE HERE...
});

table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

for (int i = 0; i < b64s.size(); i++) {
   createAvatar(b64s.get(i), names.get(i), i, 8);
}
}

Если я использую жестко закодированный путь к диску, как это:

@SuppressWarnings("unused")
public void createAvatar(String b64image, String name, int row, int col) {      
     String html = String.format("<html><table><td><img alt=\"Avatar\" style=\"position: absolute; top: 0px; left: 0px;\" src=\"%s\"/>%s</td></table></html>", "file:///C:/Users/xxxxxx/eclipse-workspacePhoton_xxxxx/xxxxx/resources/avatarB.png", name);
     table.setValueAt(html, row, col);
}

Он работает просто отлично:

enter image description here

И когда я делаю то же самое, но с жестко закодированной строкой base64:

String html = String.format("<html><table><td><img alt=\"Avatar\" style=\"position: absolute; top: 0px; left: 0px;\" src=\"data:image/png;base64,%s\"/>%s</td></table></html>", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAYAAADE6YVjAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUA....aZ9htT6WuJRFzV3epJcukNncYXzbPKIUjXzcWmUe+K7lQ3q/tn0/Gbk89e3sSussuZpu2D1Wj0P0mjaW2u8Si/mHPSBJpmUUM8x9EVbrT4j3P9QAAAABJRU5ErkJggg==", name);

Отображается то же самоекак не жестко закодированная строка:

enter image description here

и копирование HTML-переменной из кода:

<html><table><td><img alt="Avatar" style="position: absolute; top: 0px; left: 0px;" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAYAAADE6YVjAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcE.....ussuZpu2D1Wj0P0mjaW2u8Si/mHPSBJpmUUM8x9EVbrT4j3P9QAAAABJRU5ErkJggg=="/>Bob</td></table></html>

<html><table><td><img alt="Avatar" style="position: absolute; top: 0px; left: 0px;" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAYAAADE6YVjAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMjHxIGmVAAAEFUlEQVRIS82VYUxbVRTH33AbZoiZzk03BkQQp9Mw55yS6eIcg+BAqlLSOUzYCBoGGThHtuiHdTi3jKlBZWqUmAnrJjSUwVpZQAeidHTaQul7UGhf11H62s6q0Q9Dk2U73tve9/bu+kLIPvlP/mnSc87/13tPXx7zv5JVEBaNOv2rOE/waYcnlMn5fPdqtdo4Ur592e3BhDE+UMHxgpnlA/9yfABEs27hOvr0cG7hGOu6kk5G5i4AmOdwBV7n3IFQNFSAYZaHxve18E6ZBt6rfgPaWlrA4ZoWodfQj2h0hsOJJGJ2cRy3EA19TYbB8G0raNanwYtpCbD5AYZy6fOZMPCzRQRhOycuBx8kUcrS6/V3sJ7AaXHojL4dclYuiAmXW/3ESrhoG5ODfKzbn0wiY8Xywj6x2e68DMVrUyJBH1e9AsPtn0DXR3uh+PH7YkDayp1yCKA9/WIFWEBib8oxGUpDO/hHbGxtbo4EVGavhr/sJslTA6fg7fwnKUhBxmIYdU5RIHSaWhJ9U6jQJG86VPNmJMBQX0NBsP8cPgvtR3eDJnOpBOrt7bsFIlzp93rvJPEM43SGE9EprsqbKvKfg+zl88Db1xIDEf2HrQtOHiiHzcsZONn0JQXBZnn/NoJgmPFLQi5VdAugWr0UCtIWRYKUAHJrMpdB/f4aCkByviEIeuHYFisbuQLVw3crht7qik2rYMemNRQAGz3IIwSB9uEONMiLHW366ELncBK8n1cfXRy52sEhGwVBDhEEPon/U3nx+JG6CAQPTv2oUwwXPXTqmLR8XdNXcgB2mCDQSVz+A/JibUmhNHjmg7cUw0UfLs2VepsaPpQD8E4mCIJhRl3TarHgmJyGwkeWSIP4vvGVKAGwS9atkHo/O3qIgqCH0kAQDOPxhO5HX17Dhd6e89KQaPzEKwGGdPWwZUWc1LdHs5WGeIJVBBEV6xLO4ULDwXcpgOi67S+Ab+B0JByfTH+kCvJS46kevEP8p8E56Kpmxv1/LyHxUaG/8bOocGNXwUZqUPSWpDiwdzRKkB1ZqYp92l2lUQgfOE6iaaH3w4mt6XfFDOYkzQddXSV1VWzX51D02LKY3oNVO/EpAvjNSWJpdXZ2JuamxI/Lh4rTU+BcowmCwm8QHv8VwtY++J0dhJDXCxMjl6B6XR4F+aL+8MzYpLCRRCpLnZWRlJscP4YHXsvIAENhD5iKLoDtBA+cyQfnd9tguNkDnNEH31dYwagahH3rNRFATvLCq4a2tjwSNbvKNmxIfOmhe5p1+a03jCozCprdZ1U/QfmaZ9htT6WuJRFzV3epJcukNncYXzbPKIUjXzcWmUe+K7lQ3q/tn0/Gbk89e3sSussuZpu2D1Wj0P0mjaW2u8Si/mHPSBJpmUUM8x9EVbrT4j3P9QAAAABJRU5ErkJggg=="/>Bob</td></table></html>

Отображается ли нормально (что означает, что изображение base64 правильное и работает)

Так я не могу использовать версию Base64 внутри HTML для jTable?

1 Ответ

0 голосов
/ 01 февраля 2019

Вместо использования HTML вы можете попробовать использовать компоненты Swing напрямую.Судя по вашему вопросу, похоже, что у вас есть столбец, представляющий аватар пользователя, поэтому предположим, что данные относятся к типу Avatar.

. Затем вы можете установить пользовательское средство визуализации ячеек для этого типа столбца и вернуть его.JLabel.Эта метка может содержать как текст, так и значок, поэтому код может выглядеть следующим образом (упрощенно):

JTable table = ...;

table.setDefaultRenderer( Avatar.class, new TableCellRenderer() {      
  @Override
  public Component getTableCellRendererComponent( JTable table, Object value, boolean isSelected, 
                                 boolean hasFocus, int row, int column )
  {
    Avatar avatar = (Avatar)value;

    //you might want to think about caching the icon and maybe even the label.
    Icon icon = new ImageIcon(Base64.decode( avatar.getBase64Image() ));
    return new JLabel(avatar.getName(), icon, JLabel.LEFT);
  }
} );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...