public class Test1 {
public static void main(String[] args) {
Test1 t = new Test1();
t.init();
} private void init(){
JFrame frame = new JFrame();
JTable table = new JTable(new Object[][]{{1,2},{3,4}},new Object[]{"A","B"});
JComboBox jcb = new JComboBox();
jcb.addItem("1");
jcb.addItem("2");
table.setDefaultEditor(Object.class, new MyEditor(jcb));
table.setDefaultRenderer(Object.class, new MyRenderer());
frame.add(new JScrollPane(table));
frame.setVisible(true);
frame.setSize(400,300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

//===================
class MyRenderer extends DefaultTableCellRenderer{
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int column) {
if(row==1 && column==1){
JButton jtf = new JButton();
jtf.setText(value.toString());
return jtf;
}
return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
}
}

class MyEditor extends DefaultCellEditor{
private JComboBox jcb;
public MyEditor(JComboBox comboBox) {
super(comboBox);
this.jcb = comboBox;
}

 public Component getTableCellEditorComponent(JTable table, Object value,
 boolean isSelected,
 int row, int column) {
 return this.jcb;
 }
}
}
在getTableCellRendererComponent中为什么会调用两遍?

解决方案 »

  1.   

    一个是CellRender时调用,一个是作为Editor调用,你加两个打印语句就明白了import java.awt.Component;import javax.swing.DefaultCellEditor;
    import javax.swing.JButton;
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.table.DefaultTableCellRenderer;public class Test1 {
        public static void main(String[] args) {
            Test1 t = new Test1();
            t.init();
        }    private void init(){
            JFrame frame = new JFrame();
            JTable table = new JTable(new Object[][]{{1,2},{3,4}},new Object[]{"A","B"});
            JComboBox jcb = new JComboBox();
            jcb.addItem("1");
            jcb.addItem("2");
            table.setDefaultEditor(Object.class, new MyEditor(jcb));
            table.setDefaultRenderer(Object.class, new MyRenderer());
            frame.add(new JScrollPane(table));
            frame.setVisible(true);
            frame.setSize(400,300);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
        
        //===================
        class MyRenderer extends DefaultTableCellRenderer{
            @Override
            public Component getTableCellRendererComponent(JTable table,
                    Object value, boolean isSelected, boolean hasFocus, int row,
                    int column) {
             System.out.println("CellRender调用.");
                if(row==1 && column==1){
                    JButton jtf = new JButton();
                    jtf.setText(value.toString());
                    return jtf;
                }
                return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
            }
        }
        
        class MyEditor extends DefaultCellEditor{
            private JComboBox jcb;
            public MyEditor(JComboBox comboBox) {
                super(comboBox);
                this.jcb = comboBox;
            }
            
             public Component getTableCellEditorComponent(JTable table, Object value,
                     boolean isSelected,
                     int row, int column) {
              System.out.println("Editor调用.");
                 return this.jcb;
             }
        }
    }
      

  2.   

    @still_rain  感谢你的回答,但是好像和我问的不是一回事我问public Component getTableCellRendererComponent(JTable table,
                    Object value, boolean isSelected, boolean hasFocus, int row,
                    int column) 对同一个value为什么调用两次,我跟踪了一下,value的值分别为1 2 3 4 1 2 3 4,虽然只是4个值,但这个方法却调用了8次。请问为什么会这样?