需要做一个jtable 在里面填充数据,
用户可以根据自己的需求选中其中一列或者一行,在提交的时候不提交这列或者行
我的想法是在每列上面加checkbox
在每列的前面加checkbox 在用户提交的时候判断这些checkbox的值原来是搞WEB的,搞GUI,不会啊,各位大哥大姐help me 我从SUN上下了一个例子是可以在每行前面加checkbox是implements AbstractTableModel的
 

解决方案 »

  1.   

    最好给个小DEMO,THANK YOU 
      

  2.   

    重写model的getColumnClass方法,对于需要用checkbox的列让起返回Boolen.class,这样就自动帮你生成一个checkbox了
      

  3.   


    model = new DefaultTableModel(new Object[] {
    "column1",
    "column2",
    "column3" }, 10) { @Override
    public Class<?> getColumnClass(int columnIndex) {
    if(columnIndex==0) {
    return Boolean.class;
    }
    return super.getColumnClass(columnIndex);
    }
    };
    table = new JTable(model);
      

  4.   

    这样是加一列的checkbox,
    有没加一行checkbox在每个标题上方加一个checkbox,提交的时候根据这个checkbox来判断用户是否需要这列
      

  5.   

    楼主可以自定义一个TableCellRenderer如下:public class CheckBoxHeader extends JCheckBox
    implements TableCellRenderer{}然后在table.getTableHeader().getColumnModel().getColumn(i).setHeaderRenderer(new CheckBoxHeader());
    就可以把列头变为CheckBox.
      

  6.   

    public class CheckBoxHeader extends JCheckBox 
    implements TableCellRenderer{ } 
    写了一个这个结果变成抽象类了,报错,
    有点理解你的意思,不过还是写不出来,对 swing 不熟,能不能给个小例子
      

  7.   

    参考如下代码:class CheckBoxHeaderTest extends JFrame 

    Object colNames[] = {"Col1", "Col2", "Col3", "Col4"}; 
    Object[][] data = null; 
    DefaultTableModel dtm; 
    public CheckBoxHeaderTest() 

    setLocation(400,100); 
    setDefaultCloseOperation(EXIT_ON_CLOSE); 
    dtm = new DefaultTableModel(data,colNames);  for(int x = 0; x < 5; x++) 

    dtm.addRow(new Object[]{new Boolean(false),"Row "+(x+1)+" Col 2", 
    "Row "+(x+1)+" Col 3","Row "+(x+1)+" Col 4"}); 
    }  JTable table = new JTable(); 
    JScrollPane sp = new JScrollPane();
    sp.setViewportView(table);
    MyItemListener myItemListener = new MyItemListener(); table.setModel(dtm); TableColumn tc = table.getColumnModel().getColumn(0);  tc.setCellEditor(table.getDefaultEditor(Boolean.class)); 
    tc.setCellRenderer(table.getDefaultRenderer(Boolean.class));  for(int i=1;i<table.getColumnCount();i++)
    table.getTableHeader().getColumnModel().getColumn(i).setHeaderRenderer(new MyTableHeaderRenderer(myItemListener)); getContentPane().add(sp); 
    pack();

    public static void main (String[] args){
    new CheckBoxHeaderTest().setVisible(true);
    }
    class MyItemListener implements ItemListener { 
    public void itemStateChanged(ItemEvent e) { 
    String state = (e.getStateChange() == ItemEvent.SELECTED) ? "checked" : "unchecked"; 
    int column = ((MyTableHeaderRenderer)(e.getItem())).getColumn(); 
    System.out.println("column:"+column + state);

    }  public class MyTableHeaderRenderer extends JCheckBox implements TableCellRenderer,MouseListener{ protected int column; protected boolean mousePressed = false; public MyTableHeaderRenderer(ItemListener itemListener) { this.addItemListener(itemListener);
    } public Component getTableCellRendererComponent(
    JTable table, Object value,
    boolean isSelected, boolean hasFocus, int row, int column) { if (table != null) {
    JTableHeader header = table.getTableHeader();
    if (header != null) {
    this.setForeground(header.getForeground());
    this.setFont(header.getFont());
    header.addMouseListener(this);
    }
    } setColumn(column);
    this.setHorizontalAlignment(SwingConstants.CENTER); this.setText(null);
    return this;
    }
    protected void setColumn(int column) {
    this.column = column;
    }
    public int getColumn() {
    return column;
    }
    private void handleClickEvent(MouseEvent e) {
    if (mousePressed) {
    mousePressed=false; JTableHeader header = (JTableHeader)(e.getSource());
    JTable tableView = header.getTable();
    TableColumnModel columnModel = tableView.getColumnModel();
    int viewColumn = columnModel.getColumnIndexAtX(e.getX());
    int column = tableView.convertColumnIndexToModel(viewColumn); if (viewColumn == this.column && e.getClickCount() == 1 && column != -1) {
    doClick();
    }
    }
    } public void mouseClicked(MouseEvent e) {
    handleClickEvent(e);
    ((JTableHeader)e.getSource()).repaint();
    } public void mousePressed(MouseEvent e) {
    mousePressed = true;
    } public void mouseReleased(MouseEvent e) { } public void mouseEntered(MouseEvent e) {
    } public void mouseExited(MouseEvent e) {
    } }} 
      

  8.   

    改为:
    for(int x = 0; x < 5; x++) 
            { 
                dtm.addRow(new Object[]{new Boolean(true),"Row "+(x+1)+" Col 2", 
                        "Row "+(x+1)+" Col 3","Row "+(x+1)+" Col 4"}); 
            } 
      

  9.   

    是第一行默认选中   public class MyTableHeaderRenderer extends JCheckBox implements TableCellRenderer,MouseListener{        protected int column;
            
            protected String columnName;        protected boolean mousePressed = false;        public MyTableHeaderRenderer(ItemListener itemListener) {
                this.addItemListener(itemListener);
            }        public Component getTableCellRendererComponent(
                    JTable table, Object value,
                    boolean isSelected, boolean hasFocus, int row, int column) {
                if (table != null) {
                    JTableHeader header = table.getTableHeader();
                    if (header != null) {
                        this.setForeground(header.getForeground());
                        this.setFont(header.getFont());
                        header.addMouseListener(this);
                    }
                }
                setColumn(column);
                setColumnName(column,table);            this.setHorizontalAlignment(SwingConstants.CENTER);
                this.setText((String) table.getTableHeader().getColumnModel().getColumn(column).getHeaderValue());            return this;
            }
            protected void setColumn(int column) {
                this.column = column;
            }
            protected void setColumnName(int column,JTable table) {
                this.columnName = table.getTableHeader().getColumnModel().getColumn(column).getHeaderValue().toString();
            }
            
            public String getColumnName(){
             return columnName;
            }
            
            
            public int getColumn() {
                return column;
            }
            private void handleClickEvent(MouseEvent e) {
                if (mousePressed) {
                    mousePressed=false;                JTableHeader header = (JTableHeader)(e.getSource());
                    JTable tableView = header.getTable();
                    TableColumnModel columnModel = tableView.getColumnModel();
                    int viewColumn = columnModel.getColumnIndexAtX(e.getX());
                    int column = tableView.convertColumnIndexToModel(viewColumn);                if (viewColumn == this.column && e.getClickCount() == 1 && column != -1) {
                        doClick();
                    }
                }
            }        public void mouseClicked(MouseEvent e) {
                handleClickEvent(e);
                ((JTableHeader)e.getSource()).repaint();
            }        public void mousePressed(MouseEvent e) {
                mousePressed = true;
            }        public void mouseReleased(MouseEvent e) {        }        public void mouseEntered(MouseEvent e) {
            }        public void mouseExited(MouseEvent e) {
            }    }我改了一些重写类里的方法,我想让重写后第一行的boolean都是true,也就是都是默认选中
      

  10.   

    我看错了,如果要行选中是:
    public MyTableHeaderRenderer(ItemListener itemListener) {
    doClick();
    this.addItemListener(itemListener);
    }
      

  11.   

    现在我想做的是不要点每个CHECKBOX的时候增加一个监听,而是自己写一个jbutton来获取那行上到底是哪行被选中了,返回一个vector 或者是String[]
      

  12.   

        class MyItemListener implements ItemListener { 
            public void itemStateChanged(ItemEvent e) { 
                String state = (e.getStateChange() == ItemEvent.SELECTED) ? "checked" : "unchecked"; 
                int column = ((MyTableHeaderRenderer)(e.getItem())).getColumn(); 
                System.out.println("column:"+column + state);
                if(state.equals("checked")){
                 vector.add(((MyTableHeaderRenderer)(e.getItem())).getColumnName());
                }else{
                 vector.remove(((MyTableHeaderRenderer)(e.getItem())).getColumnName());
                }
            } 
        } 我现在的做法是,我面板在提交后会重新回到这个面板只是数据不同了,如果点击一次check的时候把他的值加载到vector中,再判断,重复提交几次的话,就会在vector中增加几条记录比如第一次提交的时候vector 是col1
    二次提交的话,col1这个事件就会响应两次,vector 变成了[col1,col1]
    接着提交就是3次,好象总是面板在叠加
      

  13.   

     public Component getTableCellRendererComponent(
                    JTable table, Object value,
                    boolean isSelected, boolean hasFocus, int row, int column) {            if (table != null) {
                    JTableHeader header = table.getTableHeader();
                    if (header != null) {
                        this.setForeground(header.getForeground());
                        this.setFont(header.getFont());
                        header.addMouseListener(this);
                    }
                }
      

  14.   

    我是把这个离子改写了,就是用户可以根据上面复选框选择的值再点提交的话,他会跳转到后台,处理后,返回新的行名称和填充的内容,所以面板可能还会再加载一次  void ChangeHold_actionPerformed(ActionEvent e) {
       try {
          ArrayList newList = new ArrayList();
          vecData = util.changeHold(list, vecName, type);//list是代表现在填充的值,vecname是用户选中的列的集合,返回的是一个根据用户选中的值的列重新组装的一个VEC然后再把他封装到tablemodel中
        }
        catch (Exception ex) {
          JOptionPane.showMessageDialog(this, ex.getMessage());
        }
        jmodel = null;
        changeVector = new Vector();
        dtm.setDataVector(vecData, vecName);
        sTable.setModel(dtm);
        MyItemListener myItemListener = new MyItemListener();
        for (int i = 0; i < sTable.getColumnCount(); i++) {
          sTable.getTableHeader().getColumnModel().getColumn(i).setHeaderRenderer(new
              MyTableHeaderRenderer(myItemListener));
        }
        this.repaint();
      }
      

  15.   

    去掉
    MyItemListener myItemListener = new MyItemListener(); 
        for (int i = 0; i  < sTable.getColumnCount(); i++) { 
          sTable.getTableHeader().getColumnModel().getColumn(i).setHeaderRenderer(new 
              MyTableHeaderRenderer(myItemListener)); 
        } 
        this.repaint(); 
    试试..
      

  16.   

    去掉的话就没办法把head换成check了
      

  17.   

    那就加一个构造:
    public MyTableHeaderRenderer(ItemListener itemListener) { 
    doClick(); 
    //this.addItemListener(itemListener); 
    }
    再次加载时用这个.
      

  18.   

    我一直在想取消掉点击单选框的监听,只自己写一个jbutton的监听,来取tablehead的第几列被选中,再创建VECTOR
    这样更不容易出问题但是我怎么都获取不到tablehead中的text属性