public class TJableTest { public static void main(String... args) {
JTable table = new JTable(new Object[][] { { true }, { false },
{ new Object[] { "one", "two" } }, { "text field" } },
new Object[] { "Header" }); table.setDefaultRenderer(Object.class, new MyTableCellRenderer()); JFrame frame = new JFrame("JTable");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(table);
frame.pack();
frame.setVisible(true);
} public static class MyTableCellRenderer extends DefaultTableCellRenderer { private JCheckBox check = new JCheckBox(); private JTextField text = new JTextField(); public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int column) {
if (value instanceof Boolean) {
check.setSelected((Boolean) value);
return check;
} else if (value instanceof Object[]) {
JComboBox combo = new JComboBox((Object[]) value);
return combo;
} else {
text.setText(value.toString());
return text;
}
}
}
}请问这个 Renderer 的 Editor 该怎么写?我对JTable 还很陌生,希望能给个没有调试错误的 
MyTableCellRenderer 的 class 。非常感谢!

解决方案 »

  1.   

    TableCellRenderer 就是用来绘制cell单元数值内容的,你可以用文字、数值或者图片来表示内容,
    当然最强大展示方式的就是通过自定义自己的renderer组件,通过Java2D来绘制各种天花乱坠的效果。 另外需要TableCellEditor的配合
    TableCellEditor主要是用来当用户点击在具体cell时进行编辑的组件,所以TableCellEditor除了
    具有TableCellRenderer一样的绘制功能外还可以进行交互动作,例如在cell上出现下拉框、勾选框
    甚至通过按钮弹出更复杂的对话框让用户进行输入编辑。注意这里的renderer只是用来显示效果,并没有进行交互动作击在cell上时,JTable定位在的editor,
    所以不要徒劳在renderer做点击事项处理,renderer是不会接受到交互事项的,renderer只是个画笔.
    你这个程序有点乱.  整不太明白.
    我写了个例子.
    /**
     * project:test
     * 
     * <p>
     * description:
     * </p>
     * 
     * @author herry-huangcm <[email protected]>
     * @copyright 2008, BestWiz(Dalian) Co.,Ltd 
     * @version TestT.java 2008-1-31 下午01:01:53
     */public class TestT extends JFrame {

    public TestT() { JTable table = new JTable(3,1);

    TableColumn tableColumn = table.getColumnModel().getColumn(0);
    tableColumn.setCellRenderer(new Renderer());
    tableColumn.setCellEditor(new Editor()); this.getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
    this.setSize(500, 300);
    this.setLocationRelativeTo(null);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setVisible(true);
    }
    JCheckBox box =new JCheckBox();
    JTextField text =new JTextField();
    JComboBox com =new JComboBox(new String[]{"aa","bb"});
    class Editor extends AbstractCellEditor implements TableCellEditor {

    public Object getCellEditorValue() {return null;} public Component getTableCellEditorComponent(JTable table,Object value, boolean isSelected, int row, int column) {
    switch(row){
    case 0:return box;
    case 1:return text;
    case 2:return com; 
    }
    return null;
    }
    } class Renderer extends JComponent implements TableCellRenderer {
    public Component getTableCellRendererComponent(JTable table,Object value, boolean isSelected, boolean hasFocus, int row,int column) {
    switch(row){
    case 0:return box;
    case 1:return text; 
    case 2:return com;
    }
    return null;
    }
    } public static void main(String[] args) {
    new TestT();
    }
    }
      

  2.   

    tutorial中的代码
    /* 
     * ColorRenderer.java (compiles with releases 1.2, 1.3, and 1.4) is used by 
     * TableDialogEditDemo.java.
     */import javax.swing.BorderFactory;
    import javax.swing.JLabel;
    import javax.swing.JTable;
    import javax.swing.border.Border;
    import javax.swing.table.TableCellRenderer;
    import java.awt.Color;
    import java.awt.Component;public class ColorRenderer extends JLabel
                               implements TableCellRenderer {
        Border unselectedBorder = null;
        Border selectedBorder = null;
        boolean isBordered = true;    public ColorRenderer(boolean isBordered) {
            this.isBordered = isBordered;
            setOpaque(true); //MUST do this for background to show up.
        }    public Component getTableCellRendererComponent(
                                JTable table, Object color,
                                boolean isSelected, boolean hasFocus,
                                int row, int column) {
            Color newColor = (Color)color;
            setBackground(newColor);
            if (isBordered) {
                if (isSelected) {
                    if (selectedBorder == null) {
                        selectedBorder = BorderFactory.createMatteBorder(2,5,2,5,
                                                  table.getSelectionBackground());
                    }
                    setBorder(selectedBorder);
                } else {
                    if (unselectedBorder == null) {
                        unselectedBorder = BorderFactory.createMatteBorder(2,5,2,5,
                                                  table.getBackground());
                    }
                    setBorder(unselectedBorder);
                }
            }
            
            setToolTipText("RGB value: " + newColor.getRed() + ", "
                                         + newColor.getGreen() + ", "
                                         + newColor.getBlue());
            return this;
        }
    }
      

  3.   


    我的bloghttp://blog.sina.com.cn/s/blog_466f1918010002co.html
     
    http://blog.sina.com.cn/s/blog_466f1918010002cp.html 
     
      

  4.   

    首先,我非常感谢楼上的朋友! 大过年的,现在这里很清静。hcmsxy 你的blog 我看了,谢谢!你上面的代码是根据指定的行来判断 editor 的类型,但是这样比较死,日后维护系统不容易。
    我的目的是想让 editor 通用一些,
    当Cell 里的值是 String 的时候 return Label, 
    当Cell 里的值是 int 的时候 return JSpinner 
    当Cell 里的值是 String[] 的时候 return JComboBox , 
    当Cell 里的值是 Boolean 的时候 return CheckBox.
    因此的我的 Renderer 是public Component getTableCellRendererComponent(JTable table,
                    Object value, boolean isSelected, boolean hasFocus, int row,
                    int column) {
                if (value instanceof Boolean) {
                    check.setSelected((Boolean) value);
                    return check;
                } else if (value instanceof Object[]) {
                    JComboBox combo = new JComboBox((Object[]) value);
                    return combo;
                } else {
                    text.setText(value.toString());
                    return text;
                }
            }
    但是我的 Java 基础不是很好,所以我不知道 相应的 Editor 该怎么写,以及如何让public Object getCellEditorValue()
    public Object setCellEditorValue()做出正确的判断?如果你还有时间的话,请帮帮忙?在此,祝各位朋友们新春快乐,身体健康,阖家幸福!
      

  5.   

    public void setDefaultEditor(Class<?> columnClass,
                                 TableCellEditor editor)如果尚未在 TableColumn 中设置编辑器,则设置要使用的默认单元格编辑器。如果表不需要进行编辑,或者表中的特定列不需要编辑,则使用 TableModel 接口中的 isCellEditable 方法来确保此 JTable 在这些列中不启动编辑器。如果 editor 为 null,则移除此 columnClass 的默认编辑器。 参数:
    columnClass - 设置此 columnClass 的默认单元格编辑器
    editor - 此 columnClass 要使用的默认单元格编辑器
    另请参见:
    TableModel.isCellEditable(int, int), getDefaultEditor(java.lang.Class), setDefaultRenderer(java.lang.Class, javax.swing.table.TableCellRenderer)
      

  6.   

    是硬编码的话 那就改过来import java.awt.Component;
    import javax.swing.AbstractCellEditor;
    import javax.swing.JCheckBox;
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JTable;
    import javax.swing.JTextField;
    import javax.swing.table.DefaultTableCellRenderer;
    import javax.swing.table.TableCellEditor;
    import javax.swing.table.TableColumn;public class Test {    public static void main(String... args) {
            Test test = new Test();
            JTable table = new JTable(new Object[][] { { true }, { false },
                    { new Object[] { "one", "two" } }, { "text field" } },
                    new Object[] { "Header" });        TableColumn tableColumn = table.getColumnModel().getColumn(0);        tableColumn.setCellRenderer(test.new MyTableCellRenderer());
            tableColumn.setCellEditor(test.new Editor());        JFrame frame = new JFrame("JTable");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.getContentPane().add(table);
            frame.pack();
            frame.setVisible(true);
        }    private JCheckBox check = new JCheckBox();    private JTextField text = new JTextField();    class MyTableCellRenderer extends DefaultTableCellRenderer {        public Component getTableCellRendererComponent(JTable table,
                    Object value, boolean isSelected, boolean hasFocus, int row,
                    int column) {
                if (value instanceof Boolean) {
                    check.setSelected((Boolean) value);
                    return check;
                }
                else if (value instanceof Object[]) {
                    JComboBox combo = new JComboBox((Object[]) value);
                    return combo;
                }
                else {
                    text.setText(value.toString());
                    return text;
                }
            }
        }    class Editor extends AbstractCellEditor implements TableCellEditor {        public Object getCellEditorValue() {
                return null;
            }        public Component getTableCellEditorComponent(JTable table,
                    Object value, boolean isSelected, int row, int column) {            if (value instanceof Boolean) {
                    check.setSelected((Boolean) value);
                    return check;
                }
                else if (value instanceof Object[]) {
                    JComboBox combo = new JComboBox((Object[]) value);
                    return combo;
                }
                else {
                    text.setText(value.toString());
                    return text;
                }
            }
        }
    }