用Applet!
这个这个我是不会,有达人会吗?把swing组件放到awt上,谁来搞定?如果是JApplet,那么把JCheckBox作为表格第0列的Renderer和Editor就可以了

解决方案 »

  1.   

    写错了,是JApplet,和JCheckBox和JTable的组合.谢谢了.有例子吗?
      

  2.   

    jtable.getSelectionModel().addSelectionInterval();
    jtable.getSelectionModel().setSelectionInterval();
    看看这俩个方法
      

  3.   

    jtable.getSelectionModel().setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
    这个可以实现按住Ctrl不连续的选多行
      

  4.   

    package zzg.test;
    import java.awt.*;
    import java.awt.event.*;
    import java.util.*;
    import java.io.*;import javax.swing.*;
    import javax.swing.border.*;
    import javax.swing.event.*;
    import javax.swing.table.*;
    import authority.model.TXIManageUserWarehouse;
    class a implements TableModelListener
    {
         
         
         public void tableChanged(TableModelEvent tableModelEvent)
         {
               System.out.print("1");
         }
    }public class JTest extends JFrame
    {
      protected JTable m_table;
      protected TableData m_data;
      protected TXIManageUserWarehouse manageUserWarehouse=new TXIManageUserWarehouse(true);
      
      public JTest() {
        super("Expense Report");
        setSize(200, 200);
        
        m_data = new TableData(manageUserWarehouse);
        //m_data.addTableModelListener(new a());
        
        m_table = new JTable();
        m_table.setAutoCreateColumnsFromModel(false);
        m_table.setModel(m_data);
        m_table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        //第一列的属性
        TableCellRenderer renderer = new CheckCellRenderer();
        TableCellEditor editor = new ChangeButtonEditor(new JCheckBox(),m_table,manageUserWarehouse,m_data);
       /**
        TableCellEditor editor = new DefaultCellEditor(new JCheckBox(){
             public void actionPerformed(ActionEvent e)
             {
                  System.out.print("zzz");
             }
        }
             );
        */
        TableColumn column = new TableColumn(0,30,renderer, editor);
        m_table.addColumn(column);
        //第二列的属性
        renderer = new DefaultTableCellRenderer();
        editor = new DefaultCellEditor(new JTextField());
        column = new TableColumn(1,180,renderer, editor);
        m_table.addColumn(column);
        m_table.getSelectionModel().addSelectionInterval(ListSelectionModel.SINGLE_SELECTION,ListSelectionModel.SINGLE_SELECTION);;
        m_table.getSelectionModel().setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);    JTableHeader header = m_table.getTableHeader();
        header.setUpdateTableInRealTime(false);    JScrollPane ps = new JScrollPane();
        ps.setSize(220, 220);
        ps.getViewport().add(m_table);
        getContentPane().add(ps, BorderLayout.CENTER);    WindowListener wndCloser = new WindowAdapter() {
          public void windowClosing(WindowEvent e) {
            System.exit(0);
          }
        };
        addWindowListener(wndCloser);    setVisible(true);
      }
      public static void main(String argv[]) {
        new JTest();
      }
    }class CheckCellRenderer extends JCheckBox implements TableCellRenderer
    {
      protected static Border m_noFocusBorder;
      
          public CheckCellRenderer() {
        super();
        m_noFocusBorder = new EmptyBorder(1, 2, 1, 2);
        setOpaque(true);
        setBorder(m_noFocusBorder);
      }
      

  5.   

    public Component getTableCellRendererComponent(JTable table,
       Object value, boolean isSelected, boolean hasFocus,
       int row, int column)
      {
        if (value instanceof Boolean) {
          Boolean b = (Boolean)value;
          setSelected(b.booleanValue());
        }    setBackground(isSelected && !hasFocus ?
          table.getSelectionBackground() : table.getBackground());
        setForeground(isSelected && !hasFocus ?
          table.getSelectionForeground() : table.getForeground());    setFont(table.getFont());
        setBorder(hasFocus ? UIManager.getBorder(
          "Table.focusCellHighlightBorder") : m_noFocusBorder);    return this;
      }
      
      
    }class TableData extends AbstractTableModel
    {
      protected Vector m_vector;
      protected Vector temp_vector;
      protected TXIManageUserWarehouse manageUserWarehouse;
      
      
      public TableData(TXIManageUserWarehouse manageUserWarehouse) {
        this.manageUserWarehouse=manageUserWarehouse;
        m_vector = new Vector();
        setDefaultData();
      }  public void setDefaultData() {
        m_vector.removeAllElements();
        temp_vector=manageUserWarehouse.getWarehousegroup();
        for(int i=0;i<temp_vector.size();i++)
        {
          Vector v=new Vector();
          String originPower="";
          int temp=((TXIManageUserWarehouse.warehouseProperty)temp_vector.elementAt(i)).getOriginpower();
          String warehouseName=((TXIManageUserWarehouse.warehouseProperty)temp_vector.elementAt(i)).getWarehousename();
          if(0==temp)
               originPower="true";
          else if(1==temp)
               originPower="false";
          
          v.add(Boolean.valueOf(originPower));
          v.add(warehouseName);
          m_vector.addElement(v);
        }
      }  public int getRowCount() {
        return m_vector==null ? 0 : m_vector.size();
      }  public int getColumnCount() {
        return 2;
      }  public String getColumnName(int column) {
        if(column==0)
          return "选择";
        else
          return "仓库名";
      }  public boolean isCellEditable(int nRow, int nCol) {
           if(0==nCol)
                return true;
           else
                return false;
      }  public Object getValueAt(int nRow, int nCol) {
        Vector record=(Vector)m_vector.elementAt(nRow);
        return record.elementAt(nCol);
      }  public void setValueAt(Object value, int nRow, int nCol) {
        Vector record=(Vector)m_vector.elementAt(nRow);
        record.setElementAt(value,nCol);
        //fireTableCellUpdated(nRow,nCol);
      }  public void insert(int row) {
        if (row < 0)
          row = 0;
        if (row > m_vector.size())
          row = m_vector.size();
        Vector v=new Vector();
        v.addElement(new Boolean(false));
        v.addElement(new String(""));
        m_vector.insertElementAt(v,row);
      }  public boolean delete(int row) {
        if (row < 0 || row >= m_vector.size())
          return false;
        m_vector.remove(row);
          return true;
      }
    }class ChangeButtonEditor extends DefaultCellEditor {
         
         private int hererow;
         private JCheckBox m_checkBox;
         private int targetPower;//中间变量
         private TXIManageUserWarehouse manageUserWarehouse;
         
         
         int index;//点击的位置
         public ChangeButtonEditor(JCheckBox checkBox,final JTable m_table,final TXIManageUserWarehouse manageUserWarehouse,final TableData m_data) {
              super(checkBox);
              m_checkBox=checkBox;
             this.manageUserWarehouse=manageUserWarehouse;
             m_checkBox.setOpaque(false);
             
             m_checkBox.addActionListener(new ActionListener() {
                 public void actionPerformed(ActionEvent event) {
                     //dataModel.setValueAt((Integer.parseInt(dataModel.getValueAt(hererow,3).toString()) +1)%3+"",hererow,3);
                     //button.setText(dataModel.getValueAt(hererow,3).toString());
                     index = m_table.getSelectedRow();
                     Vector temp_vector=manageUserWarehouse.getWarehousegroup();
                     int targetPower=((TXIManageUserWarehouse.warehouseProperty)temp_vector.elementAt(index)).getTargetpower();
                     if(0==targetPower)
                     {
                          targetPower=1;
                          
                     }
                     else if(1==targetPower)
                     {
                          targetPower = 0;
                          
                     }
                     ((TXIManageUserWarehouse.warehouseProperty)temp_vector.elementAt(index)).setTargetpower(targetPower);
                     
                     if(1==targetPower)
                          m_data.setValueAt(Boolean.TRUE,index,0);
                     else if(0==targetPower)
                          m_data.setValueAt(Boolean.FALSE,index,0);
                     m_table.setModel(m_data);
                     
                    //m_data.setValueAt(Integer.valueOf(String.valueOf(targetPower)),index,0);
                      System.out.println("==========="+String.valueOf(targetPower)+"=============");
                     System.out.println("-------"+String.valueOf(index)+"--------");
                     
                 }
             });
         }     public Component getTableCellEditorComponent(JTable table, Object value,
                 boolean isSelected, int row, int column) {
             hererow=row;
             /**
             Component component = getComponent();
                 if (component instanceof JCheckBox){ 
                     m_checkBox = (JCheckBox)component;                                               
                               
                     
                     table.setValueAt(Boolean.valueOf(String.valueOf(m_checkBox.isSelected())),row,column);
                     return m_checkBox;
                  }
                  else
                      return component;
               */
             return m_checkBox;
         }     public Object getCellEditorValue() {
             return null ;
         }     public boolean stopCellEditing() {
             return super.stopCellEditing();
             //return true;
         }     protected void fireEditingStopped() {
              //super.fireEditingStopped();
         }
    }
      

  6.   

    package com.xicrm.authority.model;import java.util.Vector;import java.util.Hashtable;
    /**
     * <p>Title: </p>
     * <p>Description: </p>
     * <p>Copyright: Copyright (c) 2003</p>
     * <p>Company: </p>
     * @author not attributable
     * @version 1.0
     */public class TXIManageUserWarehouse 
    {
       String resource = null;
       String user=null;
       //仓库id,仓库名称,初值,终值,放在hashtable中,再把hashtable放在vector中
       Vector warehousegroup = new Vector();
       warehouseProperty wp=new warehouseProperty();
       String bizObjectPN = null;
       String deptTableName = null;
       String deptAuthoTableName = null;
       String backPN = null;   String bizFieldPN1 = null;
       String bizFieldPN2 = null;
       String bizFieldPN3 = null;
       String bizFieldPN4 = null;
       public class warehouseProperty
       {
            int warehouseId=0;
            String warehouseName="";
            int originPower=0;
            int targetPower=0;
            warehouseProperty(){}
            public void setWarehouseId(int warehouseId)
            {
                 this.warehouseId = warehouseId;
            }        public int getWarehouseId()
            {
                 return warehouseId;
            }        public void setWarehousename(String warehouseName)
            {
                 this.warehouseName = warehouseName;
            }        public String getWarehousename()
            {
                 return warehouseName;
            }        public void setOriginpower(int originPower)
            {
                 this.originPower = originPower;
            }        public int getOriginpower()
            {
                 return originPower;
            }        public void setTargetpower(int targetPower)
            {
                 this.targetPower = targetPower;
            }        public int getTargetpower()
            {
                 return targetPower;
            }
       }
       
       
       //Hashtable Power=new Hashtable();
       //int originPower;//从用户权限表中赋值,固定值=0;从权限列表中赋值,固定值=1
       //int targetPower;//从权限表中赋值,初值=0,在界面中改变=1
          public TXIManageUserWarehouse()
       {
            
       }
       //用户的权限存在一张表中,权限列表在一张表中,是两张表.
       public TXIManageUserWarehouse(boolean flag)
       {
            warehouseProperty wp=new warehouseProperty();
            wp.setWarehouseId(0);
            wp.setWarehousename("仓库0");
            wp.setOriginpower(0);
            wp.setTargetpower(0);
            warehousegroup.add(wp);
            wp=new warehouseProperty();
            wp.setWarehouseId(1);
            wp.setWarehousename("仓库1");
            wp.setOriginpower(0);
            wp.setTargetpower(0);
            warehousegroup.add(wp);
            wp=new warehouseProperty();
            wp.setWarehouseId(2);
            wp.setWarehousename("仓库2");
            wp.setOriginpower(0);
            wp.setTargetpower(0);
            warehousegroup.add(wp);
            wp=new warehouseProperty();
            wp.setWarehouseId(3);
            wp.setWarehousename("仓库3");
            wp.setOriginpower(1);
            wp.setTargetpower(0);
            warehousegroup.add(wp);
            wp=new warehouseProperty();
            wp.setWarehouseId(4);
            wp.setWarehousename("仓库4");
            wp.setOriginpower(1);
            wp.setTargetpower(0);
            warehousegroup.add(wp);
            //wp=null;
            
            
            /**
            Hashtable tempHt=new Hashtable();
            tempHt.put("warehouseid",Integer.valueOf("0"));
            tempHt.put("warehousename",(String)"仓库0");
            tempHt.put("originPower",Integer.valueOf("0"));
            tempHt.put("targetPower",Integer.valueOf("0"));
            warehousegroup.add(tempHt);
            tempHt=null;
            tempHt.put("warehouseid",Integer.valueOf("1"));
            tempHt.put("warehousename",(String)"仓库1");
            tempHt.put("originPower",Integer.valueOf("0"));
            tempHt.put("targetPower",Integer.valueOf("0"));
            warehousegroup.add(tempHt);
            tempHt=null;
            tempHt.put("warehouseid",Integer.valueOf("2"));
            tempHt.put("warehousename",(String)"仓库2");
            tempHt.put("originPower",Integer.valueOf("0"));
            tempHt.put("targetPower",Integer.valueOf("0"));
            warehousegroup.add(tempHt);
            tempHt=null;
            tempHt.put("warehouseid",Integer.valueOf("3"));
            tempHt.put("warehousename",(String)"仓库3");
            tempHt.put("originPower",Integer.valueOf("1"));
            tempHt.put("targetPower",Integer.valueOf("0"));
            warehousegroup.add(tempHt);
            tempHt=null;
            tempHt.put("warehouseid",Integer.valueOf("4"));
            tempHt.put("warehousename",(String)"仓库4");
            tempHt.put("originPower",Integer.valueOf("1"));
            tempHt.put("targetPower",Integer.valueOf("0"));
            warehousegroup.add(tempHt);
            tempHt=null;
            
            /**
            //从用户权限表中得到的值
            if(flag)
            {
                 originPower=0;
                 targetPower=0;
            }
            //从权限列表中得到的值
            else
            {
                 originPower=1;
                 targetPower=0;
            }
            */
       }
       /*
       public void setOriginPower(int originPower)
       {
            this.originPower=originPower;
       }
       public int getOriginPower()
       {
            return this.originPower;
       }
       public void setTargetPower(int targetPower)
       {
            this.targetPower=targetPower;
       }
       public int getTargetPower()
       {
            return this.targetPower;
       }
       */
       public void setWarehousegroup(Vector warehousegroup)
       {
          this.warehousegroup = warehousegroup;
       }
       public Vector getWarehousegroup()
       {
          return warehousegroup==null?null:warehousegroup;
       }
       public void setResource(String resource)
       {
          this.resource = resource;
       }
       public String getResource()
       {
          return resource==null?"":resource;
       }
       public void setUser(String user)
       {
          this.user = user;
       }
       public String getUser()
       {
          return user==null?"":user;
       }
      

  7.   

    有几个方法,放不上取了,您就把那几个属性上了吧.就一个是有用的.大哥您给看看吧.我的这checkbox,显示的不正确呀.点击后显示就乱了.
      

  8.   

    import authority.model.TXIManageUserWarehouse没有这个包,实在是帮不了你了
      

  9.   

    看了你的代码,郁闷的不行自做主张改了点东西
    如下:
    1、ChangeButtonEditor类改成CheckBoxCellEditorclass CheckBoxCellEditor extends DefaultCellEditor {    private static JCheckBox m_checkBox = new JCheckBox();    public CheckBoxCellEditor() {
            super(m_checkBox);
            m_checkBox.setOpaque(false);
            m_checkBox.setHorizontalAlignment(JLabel.CENTER);
        }    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
            if (value instanceof Boolean)
            {
                Boolean b = (Boolean) value;
                m_checkBox.setSelected(b.booleanValue());
            }        m_checkBox.setBackground(isSelected ? table.getSelectionBackground() : table.getBackground());
            m_checkBox.setForeground(isSelected ? table.getSelectionForeground() : table.getForeground());
            /**
             * Component component = getComponent(); if (component instanceof JCheckBox){ m_checkBox = (JCheckBox)component;
             * 
             * 
             * table.setValueAt(Boolean.valueOf(String.valueOf(m_checkBox.isSelected())),row,column); return m_checkBox; } else return component;
             */        return m_checkBox;
        }    public Object getCellEditorValue() {
            return new Boolean(m_checkBox.isSelected());
        }
    }2、CheckCellRenderer改成CheckBoxCellRendererclass CheckBoxCellRenderer extends JCheckBox implements TableCellRenderer {
        protected static Border m_noFocusBorder;    public CheckBoxCellRenderer() {
            super();
            m_noFocusBorder = new EmptyBorder(1, 2, 1, 2);
            setHorizontalAlignment(JLabel.CENTER);
            setOpaque(true);
            setBorder(m_noFocusBorder);
        }    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            if (value instanceof Boolean)
            {
                Boolean b = (Boolean) value;
                setSelected(b.booleanValue());
            }        setBackground(isSelected ? table.getSelectionBackground() : table.getBackground());
            setForeground(isSelected ? table.getSelectionForeground() : table.getForeground());        setFont(table.getFont());
            setBorder(hasFocus ? UIManager.getBorder("Table.focusCellHighlightBorder") : m_noFocusBorder);        return this;
        }}看看是不是你要的?
    另:CheckBox在Table里一般使用中间对齐方式,这是一个使用习惯,当然你一定要左对齐也没问题
      

  10.   

    大哥,还有一点小问题.程序开始时,默认的几个checkbox是选中的,在点击它们后,又会出现一个把另一个给修改的问题,请您再看一下.谢谢.您也可以说一下,这是为什么会出现一个把另一个修改的现象呢.
      

  11.   

    改完应该不会有这个bug,出现这个bug是你自己写的那个CellEditor有问题,处理方式有错
      

  12.   

    TableCellRenderer renderer = new CheckCellRenderer();
        TableCellEditor editor = new ChangeButtonEditor(new JCheckBox(),m_table,manageUserWarehouse,m_data);
    这两句你改了吗?应该改成
    TableCellRenderer renderer = new CheckBoxCellRenderer();
    TableCellEditor editor = new CheckBoxCellEditor();
      

  13.   

    采用m_checkBox.addActionListener方式的话,因为事件响应的不确定性,所以你无法判断Table的换行和JCheckBox的Action哪个先被调用,如果JCheckBox的Action先被调用,显然这时候table.getSelectedRow();取到的并不是你正在修改的当前行,所以,你把上次选中行的数据也改变了。
      

  14.   

    public Component getTableCellEditorComponent(JTable table, Object value,
                                                      boolean isSelected, int row,
                                                      int column)
         {
              //关键位置,要加入这一段,就可以修改点一个checkbox同时也改另一个的bug.
              if (value instanceof Boolean)
              {
                   Boolean b = (Boolean) value;
                   m_checkBox.setSelected(b.booleanValue());
              }          m_checkBox.setBackground(isSelected ? table.getSelectionBackground() :
                                       table.getBackground());
              m_checkBox.setForeground(isSelected ? table.getSelectionForeground() :
                                       table.getForeground());          return m_checkBox;
         }
    您让改了这一段以后就好了.这个就能解决您上面所说的问题吗?
      

  15.   

    会不会是换行时 没有结束编辑器的关系
    是的话可以在选择时间中调用checkbox的stopCellEditing方法
      

  16.   

    其实你的值的改变根本不用你自己管,Table本身有完善的机制来处理它,上面那行代码解决的是显示问题,跟你的问题没关系
              if (value instanceof Boolean)
              {
                   Boolean b = (Boolean) value;
                   m_checkBox.setSelected(b.booleanValue());
              }
    把编辑器的显示值设为你数据里面的值
      

  17.   

    删掉的这段是你出错的地方
             m_checkBox.addActionListener(new ActionListener() {
                 public void actionPerformed(ActionEvent event) {
                     //dataModel.setValueAt((Integer.parseInt(dataModel.getValueAt(hererow,3).toString()) +1)%3+"",hererow,3);
                     //button.setText(dataModel.getValueAt(hererow,3).toString());
                     index = m_table.getSelectedRow();
                     Vector temp_vector=manageUserWarehouse.getWarehousegroup();
                     int targetPower=((TXIManageUserWarehouse.warehouseProperty)temp_vector.elementAt(index)).getTargetpower();
                     if(0==targetPower)
                     {
                          targetPower=1;
                          
                     }
                     else if(1==targetPower)
                     {
                          targetPower = 0;
                          
                     }
                     ((TXIManageUserWarehouse.warehouseProperty)temp_vector.elementAt(index)).setTargetpower(targetPower);
                     
                     if(1==targetPower)
                          m_data.setValueAt(Boolean.TRUE,index,0);
                     else if(0==targetPower)
                          m_data.setValueAt(Boolean.FALSE,index,0);
                     m_table.setModel(m_data);
                     
                    //m_data.setValueAt(Integer.valueOf(String.valueOf(targetPower)),index,0);
                      System.out.println("==========="+String.valueOf(targetPower)+"=============");
                     System.out.println("-------"+String.valueOf(index)+"--------");
                     
                 }
             });