2010-07-11 1 views
3

Мне нужно отобразить изображение в одной из jTable ячеек.
я писал:JAVA: Поместить изображение в jTable Cell

class ImageRenderer extends DefaultTableCellRenderer { 
    JLabel lbl = new JLabel(); 

    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, 
     boolean hasFocus, int row, int column) { 
     lbl.setText((String) value); 
     lbl.setIcon(new ImageIcon("/home/ariyan/Desktop/71290452.jpg")); 
     return lbl; 
    } 
} 

, а затем использовали его, как это:

jTable1.getColumn(0).setCellRenderer(new ImageRenderer()); 

Но это не сработало
Как я могу сделать это?

Благодаря

ответ

1

Хмм: jTable1.getColumnModel().getColumn(0).setCellRenderer(new ImageRenderer()); возможно?

Вот соответствующий отрывок из кода быстрого теста, который я собрал, чтобы быстро проверить мои предположения. Он отображает значки из папки (предполагается, что все файлы в папке являются значками, поэтому вы должны протестировать ее с чем-то вроде подкаталога темы темы XDG). Сначала установите модель таблицы, а затем добавьте рендеринг ячеек в столбцы:

class Renderer extends DefaultTableCellRenderer { 

    @Override 
    public Component getTableCellRendererComponent (JTable table, 
                Object value, 
                boolean isSelected, 
                boolean hasFocus, 
                int row, int column) { 
     if(isSelected) { 
      this.setBackground(table.getSelectionBackground()); 
      this.setForeground(table.getSelectionForeground()); 
     } 
     else { 
      this.setBackground(table.getBackground()); 
      this.setForeground(table.getForeground()); 
     } 
     if(column == 0) { 
      this.setText(list[row]); 
     } 
     else { 
      // edit as appropriate for your icon theme 
      this.setIcon(new ImageIcon("/usr/share/icons/default.kde4/16x16/apps/"+list[row])); 
     } 
     return this; 
    } 

} 
class Model extends DefaultTableModel { 

    @Override 
    public boolean isCellEditable (int row, int column) { 
     return false; 
    } 

    @Override 
    public Object getValueAt (int row, int column) { 
     return list[row]; 
    } 

    @Override 
    public int getRowCount() { 
     return list.length; 
    } 

    @Override 
    public int getColumnCount() { 
     return 2; 
    } 

    @Override 
    public String getColumnName (int column) { 
     return column == 0? "Name" : "Preview"; 
    } 

    @Override 
    public Class<?> getColumnClass (int columnIndex) { 
     return String.class; 
    } 
} 
// edit base directory as appropriate for your icon theme of choice 
static String[] list=new File("/usr/share/icons/default.kde4/16x16/apps/").list(); 
+0

Рендереры должны быть максимально эффективными. Вы не должны читать изображение с диска каждый раз, когда вызывается средство визуализации. Также при расширении рендеринга по умолчанию вы должны вызывать super.getTableCellRendererComponent (...). Это позволит убедиться, что рендеринг полностью инициализирован, например, добавив соответствующую границу, а также установив расцветку по умолчанию. – camickr

+0

Конечно нет. Но эй, я написал это как концепцию, прототип кода. Не актуальное решение для работы в режиме реального времени! – user268396

6

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

a) переопределить метод getColumnClass() JTable или TableModel, чтобы вернуть класс данных в колонка. В этом случае вы должны вернуть Icon.class.

b) добавить изображениеIcon в модель таблицы.

Теперь JTable будет использовать средство рендеринга по умолчанию для этого столбца.

+0

Как я могу сделать это в netbeans ?! – RYN

+0

См. Также [* Как использовать таблицы: понятия: редакторы и рендереры *] (http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#editrender). – trashgod

 Смежные вопросы

  • Нет связанных вопросов^_^