Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > А как вставить картинку в ячейку таблицы???


Автор: Alone 11.12.2003, 12:02
собственно сабж...

Автор: AntonSaburov 11.12.2003, 12:30
Переопределить обработчик prepareRenderer для JTable.

В него передается объект TableCellRenderer и номер строки и столбца.
TableCellRenderer - интерфейс, но реально передается DefaultTableCellRenderer, который наследуется от JLabel.
И рисуй что хочешь.

Автор: Alone 11.12.2003, 15:23
Намек понял, пасиб smile.gif

Автор: Alone 20.2.2004, 15:48
Так и не разобрался до конца... Можно пример или урлconfused.gif sad.gif

Автор: AntonSaburov 20.2.2004, 16:25
Рисуем иконку и текст

Код

import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;

public class Focus extends JFrame
{
 public Focus()
 {
   MyTable assa = new MyTable(5,2);

   getContentPane().add(assa);
   setBounds(100,100,500,500);
 }

 public static void main(String[] args)
 {
   Focus my = new Focus();
   my.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   my.setVisible(true);
 }
}

class MyTable extends JTable
{
 private ImageIcon m_icon = new ImageIcon("close.gif");

 public MyTable(int rows, int columns)
 {
   super(rows, columns);
 }

 public Component prepareRenderer(TableCellRenderer renderer,
                                  int row,
                                  int column)  
 {
   DefaultTableCellRenderer cmp =
       (DefaultTableCellRenderer)super.prepareRenderer(renderer, row, column);

   cmp.setIcon(m_icon);
   cmp.setText(row+":"+column);

   return cmp;
 }
}


Можно переопределить TableCellRenderer и рисовать прямо в нем - это немного сложнее, зато интереснее smile.gif

Автор: Alone 20.2.2004, 16:27
Вот кстати, нашел такой варант:
Код

tbl=new javax.swing.JTable{
           public javax.swing.table.TableCellRenderer getCellRenderer(int row, int column) {
               javax.swing.table.TableColumn tableColumn = getColumnModel().getColumn(column);
               javax.swing.table.TableCellRenderer renderer = tableColumn.getCellRenderer();
               if (renderer == null) {
                   Class c = getColumnClass(column);
                   if( c.equals(Object.class) ) {
                       Object o = getValueAt(row,column);
                       if( o != null )
                           c = getValueAt(row,column).getClass();
                   }
                   renderer = getDefaultRenderer(c);
               }
               return renderer;
           }
       };



а потом
javax.swing.ImageIcon img=new javax.swing.ImageIcon(getClass().getResource("/img/20x20/leftarrow.png"));

tbl.setValueAt(img,0, 0);
Так нормально будет?

Автор: Kurt 20.2.2004, 17:46
А вот еще вариант. Через AbstractTableModel.
Мне так больше нравится..
Вот работающий код:
Код
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.text.*;
import javax.swing.table.*;
import javax.swing.border.*;
import javax.swing.colorchooser.*;
import javax.swing.filechooser.*;
import javax.accessibility.*;

import java.io.*;
import java.awt.*;
import java.awt.event.*;
import java.beans.*;
import java.util.*;
import java.applet.*;
import java.net.*;

public class TableImage {
   private JFrame MainFrame;

   public TableImage() {
       MainFrame = this.createFrame();
       
       return;
   }
   
   private JFrame createFrame(){
       
       JFrame frame = new JFrame("TableImageDemo");
       frame.setSize(300,300);
       frame.addWindowListener(new WindowAdapter(){
           public void windowClosing(WindowEvent e){
               System.exit(0);
           }
           });
       JScrollPane sp = new JScrollPane(this.createTable());
       frame.getContentPane().add(sp);    
       frame.setVisible(true);    
       return frame;
       
   }
   
   private JTable createTable(){
       ImageIcon im = new ImageIcon("im1.jpg");
       final Object[][] rowData = {{"1",im},{"3",im},{"5",im}};
       final String[] columnNames = {"1-st column","2-nd column"};
       TableModel dataModel = new AbstractTableModel() {
            public int getColumnCount() { return columnNames.length; }
            public int getRowCount() { return rowData.length;}
            public Object getValueAt(int row, int col) {return rowData[row][col];}
            public String getColumnName(int column) {return columnNames[column];}
            public Class getColumnClass(int c) {return getValueAt(0, c).getClass();}
            public boolean isCellEditable(int row, int col) {return col != 5;}
            public void setValueAt(Object aValue, int row, int column) {                              rowData[row][column] = aValue; }
         };
       JTable table = new JTable(dataModel);
     
       return table;
   }
   
   public static void main(String[] args) {
       TableImage TI = new TableImage();
       return;
   }
   
}

Естественно, должна быть картинка im1.jpg.
Пусть вас не пугает обилие import - мне просто лень было это прописывать - я взял блок import с другой программки.. smile.gif
.. тоже вариант, вобщем.. smile.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)