这是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;
}