package com.cn.nec.jxl.oracle;import   java.awt.*;   
import   java.awt.event.*;   
import   java.util.Vector;   
import   javax.swing.*;   
import   javax.swing.event.*;   
import   javax.swing.table.*;   
  
public   class   AddRemoveCells   implements   ActionListener   
{   
        JTable   table   =   null;   
        DefaultTableModel   defaultModel   =   null;   
  
        public   AddRemoveCells()   
        {   
              JFrame   f   =   new   JFrame();   
              String[]   name   =   {"字段   1","字段   2","字段   3","字段   4","字段   5"};   
             Object data[][]   =  {{new String(),new String(),new String(),new String(),new Boolean(false),new Boolean(false),new String()},
           {new String(),new String(),new String(),new String(),new Boolean(false),new Boolean(false),new String()}};
                
              defaultModel   =   new   DefaultTableModel(data,name);   
              table=new   JTable(defaultModel);   
              table.setPreferredScrollableViewportSize(new   Dimension(400,   80));   
                JScrollPane   s   =   new   JScrollPane(table);   
                  
                JPanel   panel   =   new   JPanel();   
                JButton   b   =   new   JButton("增加行",new ImageIcon("add.png"));   
                panel.add(b);   
                b.addActionListener(this);   
                b   =   new   JButton("增加列");   
                panel.add(b);   
                b.addActionListener(this);   
                b   =   new   JButton("删除行");   
                panel.add(b);   
                b.addActionListener(this);   
                b   =   new   JButton("删除列");   
                panel.add(b);   
                b.addActionListener(this);   
                  
                Container   contentPane   =   f.getContentPane();   
                contentPane.add(panel,   BorderLayout.NORTH);   
                contentPane.add(s,   BorderLayout.CENTER);   
                  
        f.setTitle("AddRemoveCells");   
                f.pack();   
                f.setVisible(true);   
                f.validate();  
                f.addWindowListener(new   WindowAdapter()   {   
                        public   void   windowClosing(WindowEvent   e)   {   
                                System.exit(0);   
                        }   
                });   
        }   
          
        public   void   actionPerformed(ActionEvent   e)   
        {   
                if(e.getActionCommand().equals("增加列"))   
                        defaultModel.addColumn("增加列");   
                if(e.getActionCommand().equals("增加行"))   
                        defaultModel.addRow(new   Vector());   
                if(e.getActionCommand().equals("删除列"))   
                {   
                        int   columncount   =   defaultModel.getColumnCount()-1;   
                        if(columncount   >=   0)   
                        {   
                                TableColumnModel   columnModel   =   table.getColumnModel();   
                                TableColumn   tableColumn   =   columnModel.getColumn(columncount);   
                                columnModel.removeColumn(tableColumn);   
                                defaultModel.setColumnCount(columncount);   
                        }   
                }   
                if(e.getActionCommand().equals("删除行"))   
                {   
                        int   rowcount   =   defaultModel.getRowCount()-1;   
                        if(rowcount   >=   0)   
                        {   
                                defaultModel.removeRow(rowcount);   
                                defaultModel.setRowCount(rowcount);   
                        }   
                }   
                table.revalidate();   
        }   
          
        public   static   void   main(String   args[])   {  
        
                new   AddRemoveCells();   
        }   
}   
为什么我定义了boolean实例,没有出现复选框呢,而且我点击“添加行”按钮,虽然加行了,可也没有出现带复选框按钮的
行,苦想中

解决方案 »

  1.   

    楼主把帖子移到J2SE板块中吧。
      

  2.   

    第一,你的model是直接使用的defaulttablemodel。这样当然可以,但是建议你继承这个类,并改写其中的方法。
    第二,虽然默认确实提供了对于Boolean类型支持,显示为checkbox。但是有些问题。你必须提供某一列的类型,也就是改写getColumnClass方法。
    将你定义的model写成如下,你就可以看到效果。因为你只定义了第五列索引为4的。
    public Class<?> getColumnClass(int columnIndex) {
    // TODO Auto-generated method stub
    return columnIndex == 4 ? Boolean.class : String.class;
    }
    第三,这样做仍存在问题。如果像你的题目所说,加入的复选框不是规则地分布在同一列上,或者一列上存在多种展示,这样仍然无法满足。所以建议考虑我所说的第一条,而且对于数据类型复杂的情形,直接new的时候加参数,传递数据,可能会有问题,例如保存修改的值等等。
    第四,写法。你可以看到,出现了硬编码。非常不利于阅读,维护和扩展。例如,如果那你的7列数据全部加上,那你就要写成
    columnIndex == 4 || columnIndex == 6
    那如果更多呢?表格20列,十列是checkbox,你就罗列十个,太繁琐。
    当然,其他
    方法还有很多,当然也相对复杂一点。慢慢摸索吧。
      

  3.   

    高手能不能给个demo呢,拜托了
      

  4.   

    呵呵。是这样。
    我只是随意的唠叨了几句,纯属个人观点了,不必太在意。
    往往需要配合renderer和editor使用。根据modelgetalueAt返回得到的数据类型来进行展示的。所以model返回的可以是Object类型,这个数据,就是真实展示的依据。有的时候,表格里面的展示,每个单元格都有可能不同,有的是checkBox,有的是Combobox,我甚至还搞过里面是什么 JList,JTable,JTree等等。每个单元格都是这些的一种。痛苦啊。不知道你是不是知道renderer和editor的原理。如果你知道了,这些对于你就很容易了。别急,慢慢来。
    我虽然有一些代码,可是这些都是在项目中,有些没有封装好,单独拿出一段代码来也没有用。
    你先慢慢看吧。高人很多,但我不是。人外有人啊。
      

  5.   

    以是Object类型,这个数据,就是真实展示的依据。有的时候,表格里面的展示,每个单元格都有可能不同,有的是checkBox,有的是Combobox,我甚至还搞过里面是什么 JList,JTable,JTree等等。每个单元格都是这些的一种。痛苦啊。不知道你是不是知道renderer和editor的原理。如果你知道了,这些对于你就很容易了。别急,慢慢来。
    我虽然有一些代码,可是这些都是在项目中,有些没有封装好,单独拿出一段代码来也没有用。
    你先慢慢看吧。
      

  6.   


    呵呵,这本就是j2se啦!!!!
      

  7.   


    import   java.awt.*;   
    import   java.awt.event.*;   
    import   java.util.Vector;   
    import   javax.swing.*;   
    import   javax.swing.event.*;   
    import   javax.swing.table.*;   
      
    public   class   AddRemoveCells   implements   ActionListener   
    {   
            JTable   table   =   null;   
            DefaultTableModel   defaultModel   =   null;   
      
            public   AddRemoveCells()   
            {   
                  JFrame   f   =   new   JFrame();   
                  String[]   name   =   {"字段   1","字段   2","字段   3","字段   4","字段   5"};   
                 Object data[][]   =  {{new String(),new String(),new String(),new String(),new Boolean(false),new Boolean(false),new String()},
                          {new String(),new String(),new String(),new String(),new Boolean(false),new Boolean(false),new String()}};
                    
                  defaultModel   =   new   DefaultTableModel(data,name);   
                  table=new   JTable(defaultModel);   
                  table.getColumnModel().getColumn(0).setCellEditor(new DefaultCellEditor(new JCheckBox("true")));//复选框单元格
                  table.setPreferredScrollableViewportSize(new   Dimension(400,   80));   
                    JScrollPane   s   =   new   JScrollPane(table);   
                      
                    JPanel   panel   =   new   JPanel();   
                    JButton   b   =   new   JButton("增加行",new ImageIcon("add.png"));   
                    panel.add(b);   
                    b.addActionListener(this);   
                    b   =   new   JButton("增加列");   
                    panel.add(b);   
                    b.addActionListener(this);   
                    b   =   new   JButton("删除行");   
                    panel.add(b);   
                    b.addActionListener(this);   
                    b   =   new   JButton("删除列");   
                    panel.add(b);   
                    b.addActionListener(this);   
                      
                    Container   contentPane   =   f.getContentPane();   
                    contentPane.add(panel,   BorderLayout.NORTH);   
                    contentPane.add(s,   BorderLayout.CENTER);   
                      
            f.setTitle("AddRemoveCells");   
                    f.pack();   
                    f.setVisible(true);   
                    f.validate();  
                    f.addWindowListener(new   WindowAdapter()   {   
                            public   void   windowClosing(WindowEvent   e)   {   
                                    System.exit(0);   
                            }   
                    });   
            }   
              
            public   void   actionPerformed(ActionEvent   e)   
            {   
                    if(e.getActionCommand().equals("增加列")) 
                            defaultModel.addColumn("增加列");   
                    if(e.getActionCommand().equals("增加行"))   
                            defaultModel.addRow(new   Vector());   
                    if(e.getActionCommand().equals("删除列"))   
                    {   
                            int   columncount   =   defaultModel.getColumnCount()-1;   
                            if(columncount   >=   0)   
                            {   
                                    TableColumnModel   columnModel   =   table.getColumnModel();   
                                    TableColumn   tableColumn   =   columnModel.getColumn(columncount);   
                                    columnModel.removeColumn(tableColumn);   
                                    defaultModel.setColumnCount(columncount);   
                            }   
                    }   
                    if(e.getActionCommand().equals("删除行"))   
                    {   
                            int   rowcount   =   defaultModel.getRowCount()-1;   
                            if(rowcount   >=   0)   
                            {   
                                    defaultModel.removeRow(rowcount);   
                                    defaultModel.setRowCount(rowcount);   
                            }   
                    }   
                    table.revalidate();   
            }   
              
            public   static   void   main(String   args[])   {  
                
                    new   AddRemoveCells();   
            }   
    }   是要这样的结果不!!运行后点击添加,再点击添加行的第一列
      

  8.   

    你对renderer和editor了解多少?如果了解的不够,还是先把这些概念弄清楚再说吧
      

  9.   

    这是没有使用renderer和editor的例子public class JCheckBoxTable extends JFrame { private static final long serialVersionUID = 1L; // column names
    Vector<String> colName = new Vector<String>(); // data to display
    Vector<Vector<Object>> data = new Vector<Vector<Object>>(); private JTable table; public JCheckBoxTable() {
    super();
    initData(); Container c = getContentPane();
    c.setLayout(new BorderLayout()); table = new JTable(new CModel());
    JScrollPane jsp = new JScrollPane();
    jsp.setViewportView(table); c.add(jsp); JButton button = new JButton("ok");
    c.add(button, BorderLayout.SOUTH);
    button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
    table.setModel(new CModel());
    } }); setSize(800, 600);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setLocationRelativeTo(null);
    setVisible(true);
    } private void initData() {
    for (int i = 0; i < 6; i++) {
    colName.add("column " + i);
    } for (int i = 0; i < 20; i++) {
    Vector<Object> record = new Vector<Object>();
    record.add(new Boolean(i % 2 == 0));
    record.add(new Boolean(i % 3 == 0));
    record.add(i + " 2");
    record.add(i + " 3");
    record.add(new Boolean(false));
    record.add("i" + i + "5"); data.add(record);
    }
    } class CModel extends AbstractTableModel { private static final long serialVersionUID = 1L; @Override
    public int getColumnCount() {
    return colName.size();
    } @Override
    public int getRowCount() {
    return data.size();
    } @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
    return data.get(rowIndex).get(columnIndex);
    } @Override
    public Class<?> getColumnClass(int columnIndex) {
    return data.get(0).get(columnIndex).getClass(); } @Override
    public String getColumnName(int column) {
    return colName.get(column);
    } @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
    // return columnIndex == 0;
    return (getValueAt(rowIndex, columnIndex) instanceof Boolean);
    } @Override
    public void setValueAt(Object value, int rowIndex, int columnIndex) {
    data.get(rowIndex).set(columnIndex, value);
    fireTableCellUpdated(rowIndex, columnIndex);
    }
    } public static void main(String[] args) {
    new JCheckBoxTable();
    }
    }
      

  10.   

    /**
     * @author gentalguo(暗淡星辰)
     * @Date 2009-12-17
     * 
     */
    public class JtableWithMultibleEditor extends JFrame { private static final long serialVersionUID = 1L;
    private Vector<String> colNames = new Vector<String>();
    private Vector<Vector<String>> data = new Vector<Vector<String>>(); private JTable table; public JtableWithMultibleEditor() {
    super();
    initData();
    initUI(); setSize(600, 400);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setLocationRelativeTo(null);
    setVisible(true);
    } private void initData() {
    for (int i = 0; i < 5; i++) {
    colNames.add("Column" + i);
    } for (int i = 0; i < 50; i++) {
    Vector<String> v = new Vector<String>();
    for (int j = 0; j < 5; j++) {
    v.add(i + "," + j);
    }
    data.add(v);
    }
    } private void initUI() {
    Container c = getContentPane();
    c.setLayout(new BorderLayout());
    table = new JTable() {
    private static final long serialVersionUID = 1L; @Override
    public void changeSelection(int rowIndex, int columnIndex,
    boolean toggle, boolean extend) {
    // TODO Auto-generated method stub
    super.changeSelection(rowIndex, columnIndex, toggle, extend);
    if (isCellEditable(rowIndex, columnIndex)) {
    editCellAt(rowIndex, columnIndex);
    }
    }
    };
    table.setModel(new DefaultTableModel() {
    private static final long serialVersionUID = 1L; @Override
    public int getColumnCount() {
    return colNames.size();
    } @Override
    public String getColumnName(int column) {
    return colNames.get(column);
    } @Override
    public int getRowCount() {
    return data.size();
    } @Override
    public Object getValueAt(int row, int column) {
    return data.get(row).get(column);
    } @Override
    public boolean isCellEditable(int row, int column) {
    // only last row, 1st,2nd Columns are editable
    return (row == (getRowCount() - 1))
    && (column == 0 || column == 1);
    }
    }); c.add(new JScrollPane(table));
    table.getColumnModel().getColumn(0).setCellRenderer(
    new JButtonRenderer());
    table.getColumnModel().getColumn(1).setCellRenderer(
    new JButtonRenderer());
    table.getColumnModel().getColumn(0).setCellEditor(new JButtonEditor());
    table.getColumnModel().getColumn(1).setCellEditor(new JButtonEditor());
    table.getTableHeader().setReorderingAllowed(false); } private class JButtonRenderer extends DefaultTableCellRenderer {
    private static final long serialVersionUID = 1L;
    private JButton button; public JButtonRenderer() {
    button = new JButton();
    } @Override
    public Component getTableCellRendererComponent(JTable table,
    Object value, boolean isSelected, boolean hasFocus, int row,
    int column) {
    if (table.getModel().isCellEditable(row, column)) {
    button.setText(value == null ? "" : value.toString());
    return button;
    } else {
    return super.getTableCellRendererComponent(table, value,
    isSelected, hasFocus, row, column);
    }
    }
    } private class JButtonEditor extends DefaultCellEditor { private static final long serialVersionUID = 1L; private JButton button;
    private JTable table;
    private int row, column; public JButtonEditor() {
    super(new JTextField());
    button = new JButton();
    button.setContentAreaFilled(false);
    button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
    JOptionPane
    .showMessageDialog(
    table.getParent(),
    "Hello, you selected row "
    + row
    + " Column "
    + column
    + ", you can replace these lines of codes and "
    + "do any thing you want here");
    }
    });
    } @Override
    public Component getTableCellEditorComponent(JTable table,
    Object value, boolean isSelected, int row, int column) {
    this.table = table;
    this.row = row;
    this.column = column;
    if (table.isCellEditable(row, column)) {
    button.setText(value == null ? "" : value.toString()); return button;
    } else {
    return super.getTableCellEditorComponent(table, value,
    isSelected, row, column);
    } }
    } public static void main(String[] args) {
    try {
    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    } catch (Exception e) {
    // TODO: handle exception
    }
    new JtableWithMultibleEditor();
    }}
    这是只在最后一行的第一和第二列,展现为按钮的例子。你要其他的类型,把相应的展现方式和返回的数据修改即可。根据你的需要,判断那些可以编辑,那些不可编辑。
      

  11.   

    朋友,佩服,能给举个带renderer和editor的例子吗?拜托,谢谢
      

  12.   

    之前两个,第二个用了renderer和editor。不过是用的内部类。
    有一个问题,就是,编辑表格的时候,用这个方式,总是需要先选中单元格,进入编辑状态,然后再点才会触发编辑器的事件。如果想点击之后一次就直接有反应,可以采用加鼠标监听的方式。