单元格的render和editor如下,想知道点击按钮以后,也就是editor后怎么通知render。
class ButtonTableEditor extends DefaultCellEditor {
    public ButtonTableEditor(JCheckBox checkBox) {
        super(checkBox);
    }
    public ButtonTableEditor(JComboBox comboBox) {
        super(comboBox);
    }
    public ButtonTableEditor(JTextField textField) {
        super(textField);
    }
    public Component getTableCellEditorComponent(JTable table, Object value,
            boolean isSelected, int row, int column) {
        if (row<0||column!=0)
            return super.getTableCellEditorComponent(table, value, isSelected,  row, column);
        else {
            JButton label = new JButton("No");
            label.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
            label.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent e) {
//                     JOptionPane.showMessageDialog(null, "test");
                    new SendFinished();
                }
            });
            label.setPreferredSize(new Dimension(10,20));
            return label;
        }
    }
}class ButtonTableRender extends DefaultTableCellRenderer {

    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column) {     
        if (row<0||column!=0)
            return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        else {
         JButton label = new JButton("Yes");
            label.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
            label.setPreferredSize(new Dimension(10,20));
            return label;
        }        
    }
}编辑前button上是yes,点击后变成no,但是焦距离开单元格,又重新熏染回yes了。我试过外部定义个String,然后点击按钮后修改String值,在render里button读取String值,但是这样会使所有其他的jbutton都改变值了。怎样才能做到像jtable里内嵌new Boolean(),勾选一个改变一个。

解决方案 »

  1.   


    JToggleButton b1 = new JToggleButton("North");b.addActionListener(new ActionListener(){
      public void actionPerformed(ActionEvent e){
        b1.setText("South");
      }
    });这样写的话应该不会改动的了
      

  2.   

    editor编辑后会设置table相应单元的值,之后通知render重绘。并不是table直接将值传递给render,它们都是与table打交道的。而你想要在table中放一个JButton,对于Render来说,你构造一个匿名内部类即可,因为你只需要重写getTableCellRendererComponent方法。而对于Editor,则没那么简单了,因为你需要将JButton这个元素储存在Editor中,下面的示例,其实是将DefaultCellEditor稍微改动以后使用的。import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.event.*;
    import javax.swing.text.*;
    import javax.swing.table.*;
    import java.util.*;
    /**
     * 2011-6-26 2:04:24
     * @author Administrator
     */
    public class JTable_CellRender_Button {
        JFrame frame;
        Container contentPane;
        JScrollPane jsp;
        JTable table;
        public JTable_CellRender_Button(){
            frame=new JFrame("表格组件测试");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            contentPane=frame.getContentPane();
            contentPane.setLayout(new BorderLayout());
            String name[]={"姓名","语文","数学","合格"};
            Object data[][]={
                {"王鹏",91,100,"是"},
                {"李兵",99,89,"否"},
                {"肖龙",100,100,"是"}
            };
            DefaultTableModel dtm=new DefaultTableModel(data,name);
            dtm.setColumnCount(5);
            dtm.setRowCount(5);
            table=new JTable(dtm);
            //设置表格属性
            table.setRowHeight(50);
    //        table.setRowHeight(4, 4*table.getRowHeight());
            table.setCellSelectionEnabled(true);
            table.setPreferredScrollableViewportSize(new Dimension(400,400));
            table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
            //设置列属性
            TableColumnModel tcm=table.getColumnModel();
            tcm.setColumnMargin(10);
            JButton bun=new JButton("是");
            bun.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    JButton bun=(JButton)e.getSource();
                    String str=bun.getText();
                    if(str.equals("是")){
                        bun.setText("否");
                    }else{
                        bun.setText("是");
                    }
                }
            });
            tcm.getColumn(3).setCellEditor(new MyDefaultCellEditor(bun));
            DefaultTableCellRenderer dtcr=new DefaultTableCellRenderer(){
                public Component getTableCellRendererComponent(JTable table, Object value,
                        boolean isSelected, boolean hasFocus, int row, int column) {
                    Component c=table.getCellEditor(row, column).getTableCellEditorComponent(table, null, isSelected, row, column);
                    if(c instanceof JButton){
                        JButton cBun=(JButton)c;
                        Object text=table.getModel().getValueAt(row, column);
                        String str=(text==null)?"否":text.toString();
                        JButton bun=new JButton(str);
                        bun.setPreferredSize(cBun.getPreferredSize());
                        bun.setForeground(cBun.getForeground());
                        bun.setBackground(cBun.getBackground());
                        bun.setFont(cBun.getFont());
                        return bun;
                    }
                    return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
                }
            };
            for(int i=0;i<tcm.getColumnCount();i++){
                TableColumn tc=tcm.getColumn(i);
                tc.setPreferredWidth(100);
                tc.setCellRenderer(dtcr);
    //            tc.setMinWidth(50);
            }
            jsp=new JScrollPane(table);
            contentPane.add(jsp,BorderLayout.CENTER);
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
        public static void main(String args[]){
            new JTable_CellRender_Button();
        }
        class MyDefaultCellEditor extends AbstractCellEditor implements TableCellEditor {
            protected JComponent editorComponent;
            protected EditorDelegate delegate;
            protected int clickCountToStart = 1;
            public MyDefaultCellEditor(JButton button) {
                editorComponent = button;
                editorComponent.setRequestFocusEnabled(false);
                delegate = new EditorDelegate() {
                    public void setValue(Object value) {
                        if(value==null){
                            ((JButton)editorComponent).setText("");
                        }
                        else{
                            String text=value.toString();
                            ((JButton)editorComponent).setText(text);
                        }
                    }
                    public Object getCellEditorValue() {
                        return ((JButton)editorComponent).getText();
                    }
                };
            }
            public Component getComponent() {
                return editorComponent;
            }
            public void setClickCountToStart(int count) {
                clickCountToStart = count;
            }
            public int getClickCountToStart() {
                return clickCountToStart;
            }
            public Object getCellEditorValue() {
                return delegate.getCellEditorValue();
            }
            public boolean isCellEditable(EventObject anEvent) {
                return delegate.isCellEditable(anEvent);
            }
            public boolean shouldSelectCell(EventObject anEvent) {
                return delegate.shouldSelectCell(anEvent);
            }
            public boolean stopCellEditing() {
                return delegate.stopCellEditing();
            }
            public void cancelCellEditing() {
                delegate.cancelCellEditing();
            }
            public Component getTableCellEditorComponent(JTable table, Object value,
                                                         boolean isSelected,
                                                         int row, int column) {
                if(value==null){
                    return editorComponent;
                }
                delegate.setValue(value);
                return editorComponent;
            }
            protected class EditorDelegate{
                protected Object value;
                public Object getCellEditorValue() {
                    return value;
                }
                public void setValue(Object value) {
                    this.value = value;
                }
                public boolean isCellEditable(EventObject anEvent) {
                    if (anEvent instanceof MouseEvent) {
                        return ((MouseEvent)anEvent).getClickCount() >= clickCountToStart;
                    }
                    return true;
                }
                public boolean shouldSelectCell(EventObject anEvent) {
                    return true;
                }
                public boolean startCellEditing(EventObject anEvent) {
                    return true;
                }
                public boolean stopCellEditing() {
                    fireEditingStopped();
                    return true;
                }
               public void cancelCellEditing() {
                   fireEditingCanceled();
               }
            }
        }
    }
      

  3.   

    给jTable设置监听器,里面执行jTable.setText(“显示的内容”);就行了