我是java-swing的新手。我想在表格单元格中添加图标。但是当我在单元格中添加ImageIcon时,它只显示路径而不是图标。
这是我的代码。
public void createGUI(ArrayList<String> params, String type) {
try {
DefaultTableModel model = new DefaultTableModel();
model.addColumn("ParameterName");
model.addColumn("ParameterType");
model.addColumn("Operation");
for (int i = 0; i < params.size() - 4; i++) {
String param_name = params.get(i).toString().substring(0, params.get(i).toString().indexOf("["));
String param_type = params.get(i).toString().substring(params.get(i).toString().indexOf("[") + 1, params.get(i).toString().indexOf("]"));
//URL url = ClassLoader.getSystemClassLoader().getResource("");
ImageIcon image = new ImageIcon("/com/soastreamer/resources/delete_idle.png");
// JLabel label = new JLabel(image);
model.addRow(new Object[]{param_name, param_type.toUpperCase(),image});
}
Action delete = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
JTable table = (JTable) e.getSource();
int modelRow = Integer.valueOf(e.getActionCommand());
((DefaultTableModel) table.getModel()).removeRow(modelRow);
}
};
这是清晰理解的图像。
请给我提示或任何参考。 谢谢。
答案 0 :(得分:5)
问题在于您的TableModel,您必须告诉表必须在该列中呈现图像,从而覆盖模型的getColumnClass(int column)
方法。
通过camickr查看此answer。
<强>更新强>
带有ImageIcon的JTable的最小示例,使用DefaultTableModel的渲染器绘制它。我通过camickr再次从this answer借用了updateRowHeights()
代码,没有它,图标比行大,并且没有完全显示。
重要的是,现在当渲染器调用getColumnClass(1)
时,它会获得ImageIcon.class
,因此将执行渲染图标的代码。默认情况下,此方法将返回Object.class
,渲染器将忽略它是一个图标的事实。
import java.awt.BorderLayout;
import java.awt.Component;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
public class ImageIconTable
{
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new ImageIconTable().initGUI();
}
});
}
public void initGUI()
{
JFrame frame = new JFrame();
DefaultTableModel tableModel = new DefaultTableModel()
{
@Override
public Class getColumnClass(int column)
{
if (column == 1) return ImageIcon.class;
return Object.class;
}
};
tableModel.addColumn("Row 1");
tableModel.addColumn("Icons Row");
tableModel.addRow(new Object[]{"This cell is an Object", new ImageIcon("icon.jpg")});
_table = new JTable(tableModel);
updateRowHeights();
frame.add(new JScrollPane(_table), BorderLayout.CENTER);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
private void updateRowHeights()
{
try
{
for (int row = 0; row < _table.getRowCount(); row++)
{
int rowHeight = _table.getRowHeight();
for (int column = 0; column < _table.getColumnCount(); column++)
{
Component comp = _table.prepareRenderer(_table.getCellRenderer(row, column), row, column);
rowHeight = Math.max(rowHeight, comp.getPreferredSize().height);
}
_table.setRowHeight(row, rowHeight);
}
}
catch(ClassCastException e) {}
}
private JTable _table;
}
看起来像这样:
答案 1 :(得分:0)
首先,我建议您使用ImageIo.read()并使用作为ImageIcon
对象的参数返回的BufferedImage。
其次,使用Class.getResource()工具
YourClass.class.getResource("/com/soastreamer/resources/delete_idle.png");
然后,一切都应该有效。