1.實現效果
給swing的JTable實現如下效果,JTable的列表中插入圖片

2.實現步驟
這里准備了三張方式的圖片:網絡圖片、工程類目錄圖片、本地磁盤圖片
工程目錄如下:

關鍵步驟有兩個:
- 創建Icon對象
- 重寫DefaultTableModel類的getColumnClass方法
3.完整代碼
package com.qy;
import java.awt.BorderLayout;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Enumeration;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.border.EmptyBorder;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableColumn;
/**
* @Author 賀劉芳
* @Time 2021年7月25日 下午11:21:33
* @Version 1.0
* <p>Description:</p>
*/
public class JTableImg extends JFrame {
private JPanel contentPane;
private JTable table;
public static void main(String[] args) {
JTableImg frame = new JTableImg();
frame.setVisible(true);
}
public JTableImg() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//設置窗口關閉程序退出
setSize(566, 429);//設置窗口大小
setLocationRelativeTo(null);//設置窗口居中
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);//設置布局方式為絕對布局
JPanel panel = new JPanel();
panel.setBounds(10, 10, 530, 349);
contentPane.add(panel);
panel.setLayout(new BorderLayout(0, 0));
//核心步驟1:創建Icon對象
//相對於類路徑讀取圖片
Icon icon1 = new ImageIcon(this.getClass().getResource("/images/33.jpg"));
//絕對路徑讀取圖片
Icon icon2 = new ImageIcon("D:/images/22.jpg");
//網絡路徑讀取圖片
Icon icon3 = null;
try {
icon3 = new ImageIcon(new URL("https://avatar.csdnimg.cn/3/F/F/3_toto1297488504_1548903051.jpg"));
} catch (MalformedURLException e) {
e.printStackTrace();
}
table = new JTable();
String[] columnNames = new String[] {"頭像", "姓名"};
//將圖片Icon對象放入表格數據數組
Object[][] data = new Object[][] {
{icon1, "Text 1"},
{icon2, "Text 2"},
{icon3, "Text 3"}
};
//將表格數據數組放入表格模型,並重寫getColumnClass方法
table.setModel(new DefaultTableModel(data,columnNames){
@Override //核心步驟2:重寫getColumnClass方法
public Class<?> getColumnClass(int columnIndex) {
return getValueAt(0, columnIndex).getClass();
}
});
//設置每一列的列寬
//table.getColumn(columnNames[0]).setPreferredWidth(59);
table.setRowHeight(0, 80);
table.setRowHeight(1, 80);
table.setRowHeight(2, 80);
table.setRowHeight(3, 80);
//fitTableColumns(table); //非必須,設置列寬隨表格內容自動調整
JScrollPane jsp = new JScrollPane(table);
jsp.setSize(530, 349);
panel.add(jsp);
}
//設置列寬隨表格內容自動調整 參考博客:https://blog.csdn.net/tototuzuoquan/article/details/8982618
public void fitTableColumns(JTable myTable) { // 設置table的列寬隨內容調整
JTableHeader header = myTable.getTableHeader();
int rowCount = myTable.getRowCount();
Enumeration columns = myTable.getColumnModel().getColumns();
while (columns.hasMoreElements()) {
TableColumn column = (TableColumn) columns.nextElement();
int col = header.getColumnModel().getColumnIndex(column.getIdentifier());
int width = (int) myTable.getTableHeader().getDefaultRenderer()
.getTableCellRendererComponent(myTable,column.getIdentifier(), false, false, -1, col)
.getPreferredSize().getWidth();
for (int row = 0; row < rowCount; row++) {
int preferedWidth = (int) myTable.getCellRenderer(row, col)
.getTableCellRendererComponent(myTable,myTable.getValueAt(row, col), false, false,row, col)
.getPreferredSize().getWidth();
width = Math.max(width, preferedWidth);
}
header.setResizingColumn(column);
column.setWidth(width + myTable.getIntercellSpacing().width);
}
}
}
