TableCellRenderer的一个例子

这是java核心技术Ⅱ中一个使用TableCellRenderer的例子,我写完代码,运行后发现TableCellRendererFrame的代码

moonColumn.setHeaderRenderer(table.getDefaultRenderer(ImageIcon.class));会使表头第三列的名字不显示,如果将该距注释掉可以正常显示,不知道为什么

程序中用到的图片来自下面的这个网址,下载图片后需要修改图片名称和程序中使用的图片名称一致,图片存放到java源文件当前目录即可

http://www.snaught.com/JimsCoolIcons/Planets/

下面是我照书上写的代码,为了正常显示表头moonColumn.setHeaderRenderer(table.getDefaultRenderer(ImageIcon.class));被我注释掉了,书上这句代码是原来没注释。

package test;
import java.awt.EventQueue;
import java.awt.Color;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.WindowListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowAdapter;
import javax.swing.JFrame;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableModel;
import javax.swing.JTable;
import javax.swing.JComboBox;
import javax.swing.table.TableColumnModel;
import javax.swing.table.TableColumn;
import javax.swing.JScrollPane;
import javax.swing.ImageIcon;
import javax.swing.DefaultCellEditor;
import javax.swing.table.AbstractTableModel;
import javax.swing.UIManager;
import javax.swing.JPanel;
import javax.swing.table.TableCellEditor;
import javax.swing.JColorChooser;
import javax.swing.AbstractCellEditor;
import javax.swing.JDialog;
import java.util.EventObject;
public class TableCellRendererTest{
 public static void main(String[] args){
  EventQueue.invokeLater(new Runnable(){
   public void run(){
    JFrame frame = new TableCellRendererFrame();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
   }
  });
 }
}
class TableCellRendererFrame extends JFrame{
 public TableCellRendererFrame(){
  setTitle("TableCellRendererFrame");
  setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);

  TableModel model = new PlanetTableModel();
  JTable table = new JTable(model);
  table.setRowSelectionAllowed(false);

  //set up renderers and editors
  table.setDefaultRenderer(Color.class,new ColorTableCellRenderer());
  table.setDefaultEditor(Color.class,new ColorTableCellEditor());

  JComboBox moonCombo = new JComboBox();
  for(int i=0;i<=20;i++){
   moonCombo.addItem(i);
  }
  TableColumnModel columnModel = table.getColumnModel();
  TableColumn moonColumn = columnModel.getColumn(PlanetTableModel.MOONS_COLUMN);
  moonColumn.setCellEditor(new DefaultCellEditor(moonCombo));
  //moonColumn.setHeaderRenderer(table.getDefaultRenderer(ImageIcon.class));
  moonColumn.setHeaderValue(new ImageIcon("Moons.gif"));

  //show table
  table.setRowHeight(100);
  add(new JScrollPane(table),BorderLayout.CENTER);

 }

 private static final int DEFAULT_WIDTH = 600;
 private static final int DEFAULT_HEIGHT = 400;
}
class PlanetTableModel extends AbstractTableModel{
 public String getColumnName(int c){
  return columnNames[c];
 }
 public Class<?> getColumnClass(int c){
  return cells[0][c].getClass();
 }
 public int getColumnCount(){
  return cells[0].length;
 }
 public int getRowCount(){
  return cells.length;
 }
 public Object getValueAt(int r,int c){
  return cells[r][c];
 }
 public void setValueAt(Object obj,int r,int c){
  cells[r][c] = obj;
 }
 public boolean isCellEditable(int r,int c){
  return c == PLANET_COLUMN||c == MOONS_COLUMN||c == CASEOUS_COLUMN||c == COLOR_COLUMN;
 }
 
 public static final int PLANET_COLUMN = 0;
 public static final int MOONS_COLUMN = 2;
 public static final int CASEOUS_COLUMN = 3;
 public static final int COLOR_COLUMN = 4;

 private Object[][] cells={{"Mercury",2440.0,0,false,Color.yellow,new ImageIcon("Mercury.gif")},
  {"Venus",6052.0,0,false,Color.yellow,new ImageIcon("Venus.gif")},
  {"Earth",6378.0,1,false,Color.blue,new ImageIcon("Earth.gif")},
  {"Mars",3397.0,2,false,Color.red,new ImageIcon("Mars.gif")},
  {"Jupiter",71492.0,16,true,Color.orange,new ImageIcon("Jupiter.gif")},
  {"Saturn",60268.0,18,true,Color.orange,new ImageIcon("Saturn.gif")},
  {"Uranus",25559.0,17,true,Color.blue,new ImageIcon("Uranus.gif")},
  {"Neptune",24766.0,8,true,Color.blue,new ImageIcon("Neptune.gif")},
  {"Pluto",1137.0,1,false,Color.black,new ImageIcon("Pluto.gif")}
 };
 private String[] columnNames = {"Planet","Radius","Moons","Caseous","Color","Image"};
 
}
class ColorTableCellRenderer extends JPanel implements TableCellRenderer{
 public Component getTableCellRendererComponent(JTable table,Object value,boolean isSelected,boolean hasFocus,int row,int column){
  setBackground((Color)value);
  if(hasFocus){
   setBorder(UIManager.getBorder("Table.focusCellHightlightBorder"));
  }else{
   setBorder(null);
  }
  return this;
 }
}
class ColorTableCellEditor extends AbstractCellEditor implements TableCellEditor{
 public ColorTableCellEditor(){
  panel = new JPanel();
  colorChooser = new JColorChooser();
  colorDialog = JColorChooser.createDialog(null,"Planet Color",false,colorChooser,new ActionListener(){
   public void actionPerformed(ActionEvent event){
    stopCellEditing();
   }
  },new ActionListener(){
   public void actionPerformed(ActionEvent event){
    cancelCellEditing();
   }
  });
  colorDialog.addWindowListener(new WindowAdapter(){
   public void windowClosing(WindowEvent e){
    cancelCellEditing();
   }
  });
 }
 public Component getTableCellEditorComponent(JTable table,Object value,boolean isSelected,int row,int col){
  colorChooser.setColor((Color)value);
  return panel;
 }
 public boolean shouldSelectCell(EventObject anEvent){
  colorDialog.setVisible(true);
  return true;
 }
 public void cancelCellEditing(){
  colorDialog.setVisible(false);
  super.cancelCellEditing();
 }
 public boolean stopCellEditing(){
  colorDialog.setVisible(false);
  super.stopCellEditing();
  return true;
 }
 public Object getCellEditorValue(){
  return colorChooser.getColor();
 }
 private JColorChooser colorChooser;
 private JDialog colorDialog;
 private JPanel panel;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值