我扩展了 AbstractTableModel 来创建自定义 TableModel。这样做的原因是将 hashmap 绑定(bind)到 JTable。
在我的 TableModel 中,在其中一行上我返回这样的 html 代码:
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
switch (columnIndex) {
case 0:
String sTest = "<div style=\"margin-left:100px;\"><img src='" + new ImageIcon(Wds.class.getResource("/resources/video.png"))+ "'</div>";
return "<html>" + sTest + sTest + "hello" + "</html>";
default:
throw new IndexOutOfBoundsException();
}
}
我现在遇到的问题是Java中的html支持似乎很糟糕。
我需要使用“margin-left、margin-top”等来控制图像。问题是,如果我使用"<div style>"
它会导致换行,因此之后的所有内容都将在下面一行。如果我使用 "<span style>"
它不会导致换行,但边距不适用于 "<span style>"
(它应该);
我还尝试创建自定义 TableCellRenderer 并在其中添加 .css 值并使用 "<div class>"
但换行问题仍然存在。
通常"display:inline"
在"<div style>"
消除了换行符和 margin-left
通常与 "<span style>"
一起使用,但 Java 对 HTML 的支持似乎很差。
有人对我如何解决这个问题有任何建议吗?
这里是完整的 SSCCE 代码:
private Map<String, String> list = new LinkedHashMap<String,String>();
class MyTableModel extends AbstractTableModel {
private String[] columnNames = {"Column1"};
public void addElement(String sElement, String sElement2) {
list.put(sElement, sElement2);
fireTableRowsInserted(list.size(), list.size());
}
@Override
public int getColumnCount() {
return columnNames.length;
}
@Override
public int getRowCount() {
return list.size();
}
@Override
public String getColumnName(int col) {
return columnNames[col];
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
switch (columnIndex) {
case 1:
String sTest = "<div style=\"margin-left:100px;\"><img src='" + new ImageIcon(Wds.class.getResource("/resources/video.png"))+ "'</div>";
return "<html>" + sTest + sTest + "hello" + "</html>";
default:
throw new IndexOutOfBoundsException();
}
}
}
最佳答案
您应该在 custom 中处理对齐方式TableCellRenderer
,用于 example 。该示例显示了一个 ListCellRenderer
,但原理是相同的。
附录:我需要添加几个图标并将它们放置在单元格内的不同位置。
您的 TableCellRenderer
实现可以返回任何所需的 Component
,甚至是具有自己布局的 JPanel
,例如 StatusPanel
显示 here 。您可能还需要自定义 TableCellEditor
。
关于java - JTable 中图像的 html 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16209322/