Как отобразить таблицу базы данных с блоками в JTable

Я пытаюсь отобразить таблицу базы данных с blobs на Jtable, и я хочу, чтобы изображения отображались, но вместо этого я получаю набор кодов в столбце для изображений... Вот мои коды:

этот класс извлекает мою таблицу db из базы данных через результирующий набор...

public class rs2Table {

public static TableModel resultSetToTableModel(ResultSet rs) {
 try {
 ResultSetMetaData metaData = rs.getMetaData();
 int numberOfColumns = metaData.getColumnCount();
 Vector<string> columnNames = new Vector<string>();

 // Get the column names
 for (int column = 0; column < numberOfColumns; column++) {
 columnNames.addElement(metaData.getColumnLabel(column + 1));
 }

 // Get all rows.
 Vector<vector<object>> rows = new Vector<vector<object>>();

 while (rs.next()) {
 Vector<object> newRow = new Vector<object>();

 for (int i = 1; i <= numberOfColumns; i++) {
 newRow.addElement(rs.getObject(i));
 }

 rows.addElement(newRow);
 }

 return new DefaultTableModel(rows, columnNames) {
 @Override
 public boolean isCellEditable(int row, int column) {
 //return all cells false
 return false;
 }
 };
 } catch (SQLException e) {
 JOptionPane.showMessageDialog(null,e);
 return null;
 }
}
 <p> вот где я пытаюсь отобразить таблицу базы данных с изображениями и другими полями...</p> <pre class="prettyprint linenums"><code>private void retrvStaffList() {
 try {
 //this sql uses LEFT JOIN to merge tables with corresponding foreign keys
 //hence we it is going to display all staff with their specified info retrieved from all the tables in ONE table...
 String sql = "SELECT DISTINCT s.StaffName, d.DeptName, b.age, b.telephone, b.email, b.address, t.position, t.salary, b.image FROM Staffs AS s\n"
 + "LEFT JOIN Departments as d ON d.DepartmentID = s.DepartmentID\n"
 + "LEFT JOIN BioData AS b ON b.BioID = s.StaffID\n"
 + "LEFT JOIN StatusTable AS t ON t.ownerID = s.StaffID\n"
 + "ORDER BY s.StaffName";
 PreparedStatement pStmt2 = connect.prepareStatement(sql);
 rs = pStmt2.executeQuery();

 //get the staff table...
 staffTable.setModel(rs2Table.resultSetToTableModel(rs));

 } catch (SQLException ex) {
 Logger.getLogger(StaffList.class.getName()).log(Level.SEVERE, null, ex);
 }
}
</code>

Я получил изображения для других целей успешно, но я не знаю, как я буду вставлять его в JTable вместе с другими полями. я знаю, что мне, возможно, придется использовать байт, чтобы получить изображения, а затем передать его на значок изображения, как и в других случаях, я получил изображения для других целей, но я не знаю, какие из методов применять это.

пожалуйста, ребята, любой намек высоко ценится... спасибо заранее

1 ответ

Цель состоит в том, чтобы получить изображение из db в ImageIcon чтобы вы могли воспользоваться средством рендеринга по умолчанию, не предоставляя свою собственную реализацию визуализатора (см. Раздел " Использование таблиц: Редакторы и Renderers").

Поскольку вы не указали, как вы "получили изображения для других целей успешно", я предоставил свои собственные:

while (rs.next()) {
 Vector<object> newRow = new Vector<object>();

 for (int i = 1; i <= numberOfColumns; i++) {
 if (i == <imagecolumn>) { // ... whatever column is your image column
 Blob blob = rs.getBlob("image");
 int blobLength = (int) blob.length(); 

 byte[] bytes = blob.getBytes(1, blobLength);
 blob.free();
 BufferedImage img = ImageIO.read(new ********************(bytes));
 ImageIcon icon = new ImageIcon(img); 
 newRow.addElement(icon); 
 } else {
 newRow.addElement(rs.getObject(i));
 }
 }
 rows.addElement(newRow);
}
 <p> Тогда это просто вопрос переопределения <code>getColumnClass()</code> на вашем <code>DefaultTableModel</code> (поэтому средство визуализации по умолчанию может отображать его как <code>ImageIcon</code>), как объясняется в <a href="https://stackoverflow.com/questions/25378231/cant-add-image-using-imageicon-to-jtable-cell" target="_blank">этом ответе</a>.</p> <p> Возможно, вы захотите также изменить размер строки/столбца, чтобы соответствовать изображению. Вы можете сделать это, просто сделав что-то вроде</p> <pre class="prettyprint linenums"><code>table.setRowHeight(height);
TableColumn column = table.getColumn("ColumnIdentifier");
column.setWidth(width);
</code>

Ресурсы Javadoc:

РЕДАКТИРОВАТЬ

С SQLlite кажется, что вы должны читать как rs.getBytes("image"); , Кроме того, после дальнейшего чтения документов вы могли бы также просто построить ImageIcon с возвращенным byte[]. new ImageIcon(rs.getBytes("image"));

licensed under cc by-sa 3.0 with attribution.