首先不要每个都new,开销太大了,你只要更新TableModel里的数据就可以了
其次,早就说不要用Action事件监听了

解决方案 »

  1.   

    我不知道你在Action里想要做什么,所以没法给你什么建议
    说说你的要求
      

  2.   

    没完全理会你的意思。如果选取一个人名后,为什么要重新new JTable呢?应该是在你的JTable的Model上做操作即可,也就是把表模型进行删除,添加就行,视图JTable会自动得到通知进行变化的
      

  3.   

    to:reliveaction中要做的很简单,就是把一个数据对象中的属性进行变化,如:0->1,1->0.to:tomcatjava
    对,是您的意思,我怎么把表模型删除呢?我现在改为建立一个jtable了,然后填充数据了,但是我一触发事件,上一个表的东西好象还没有被覆盖,执行完一次jcheckbox的actionPerformed后,它又自动的执行了一次,这次就是上个表的事件.
      

  4.   

    你的数据对象中的属性是不是跟你选不选中是相关的?比如选中就是1,不选中就是0,或者是跟你的数据相关?是的话可以:
    办法1、在TableModel的setValueAt()里处理
    办法2、使用Observer方式监控你Model里的数据改变怎么把表模型删除:model = new TableModel();JTable.setModel(model);
    new个model就可以了
    其实这样也不是最简单的,因为你每个用户的数据结构都是一样的,所以
    假设你的用户数据每条是个UserData类型,你的TableModel里用UserData[]或ArrayList保存了该信息
    那么
    class MyTableModel extends .... implements ...{
    ArrayList userdatas = null;
    public void setUserDatas(ArrayList datas){
    userdatas = datas;
    }
    public ArrayList getUserDatas(){
    return userdatas;
    }
    }
    这样你要改变数据
    JTable.getModel().setUserDatas(你新的用户数据);
    JTable.updateUI();
    就可以了
      

  5.   

    Exception occurred during event dispatching:
    java.lang.NullPointerException
    at zzg.test.CheckBoxCellEditor$1.actionPerformed(JTest.java:347)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1445)
    at javax.swing.AbstractButton$ForwardActionEvents.actionPerformed(AbstractButton.java:1499)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:373)
    at javax.swing.JToggleButton$ToggleButtonModel.setPressed(JToggleButton.java:263)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:211)
    at java.awt.Component.processMouseEvent(Component.java:3710)
    at java.awt.Component.processEvent(Component.java:3539)
    at java.awt.Container.processEvent(Container.java:1159)
    at java.awt.Component.dispatchEventImpl(Component.java:2588)
    at java.awt.Container.dispatchEventImpl(Container.java:1208)
    at java.awt.Component.dispatchEvent(Component.java:2492)
    at javax.swing.plaf.basic.BasicTableUI$MouseInputHandler.repostEvent(BasicTableUI.java:433)
    at javax.swing.plaf.basic.BasicTableUI$MouseInputHandler.mouseReleased(BasicTableUI.java:479)
    at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:226)
    at java.awt.Component.processMouseEvent(Component.java:3710)
    at java.awt.Component.processEvent(Component.java:3539)
    at java.awt.Container.processEvent(Container.java:1159)
    at java.awt.Component.dispatchEventImpl(Component.java:2588)
    at java.awt.Container.dispatchEventImpl(Container.java:1208)
    at java.awt.Component.dispatchEvent(Component.java:2492)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:2446)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:2211)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:2120)
    at java.awt.Container.dispatchEventImpl(Container.java:1195)
    at java.awt.Window.dispatchEventImpl(Window.java:921)
    at java.awt.Component.dispatchEvent(Component.java:2492)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:334)
    at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:126)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:88)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:80)
      

  6.   

    现在的问题发展成:
    public JTest()
    {
              setSize(200, 200);          
              m_table = new JTable();
              m_table.setAutoCreateColumnsFromModel(false);
              m_table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
              JTableHeader header = m_table.getTableHeader();
              header.setUpdateTableInRealTime(false);
    }我的想法是,在List中什么都不选的时候,jtable中什么都不显示,所以在初始化jtable时还不能传那些变量.但是事件处理方法的声明在初始化函数中.也就是下面这段.
    renderer = new CheckBoxCellRenderer();
    editor = new CheckBoxCellEditor(m_table,manageUserWarehouse,m_data);
    TableColumn column = new TableColumn(0, 30, renderer, editor);
    m_table.addColumn(column);
    因此,我又将这段放进了setData()方法中,这个方法的作用就是:在我点击完List上的人名后调用,向tablemodle中放入这个用户的权限列表.
      

  7.   

    public void setTableData(TXIManageUserWarehouse manageUserWarehouse)
    {
              this.manageUserWarehouse=manageUserWarehouse;//这个就是我要改变属性的那个对象
              if(m_data==null)
              {
                   m_data = new TableData(manageUserWarehouse);
                   m_table.setModel(m_data);
                   //第一列的属性
                   renderer = new CheckBoxCellRenderer();
                   editor = new CheckBoxCellEditor(m_table,manageUserWarehouse,m_data);
                   TableColumn column = new TableColumn(0, 30, renderer, editor);
                   m_table.addColumn(column);
                   m_table.updateUI();
                   m_table.repaint();          }
              else
              {
                   m_data.setManageUserWarehouse(manageUserWarehouse);
                   m_data.setDefaultData();
                   m_table.setModel(m_data);
                   //第一列的属性
                   renderer = new CheckBoxCellRenderer();
                   editor = new CheckBoxCellEditor(m_table,manageUserWarehouse,m_data);
                   TableColumn column = new TableColumn(0, 30, renderer, editor);
                   m_table.addColumn(column);
                   m_table.updateUI();
                   m_table.repaint();          }
    }
    在这个方法中确保只建立一个tablemodel对象.这样坐就可以传值了,但是带来的问题是点一次人名列表,jtable中列数就会成倍增长,因为是m_table.addColumn(column)把列又加了一次进来.真是晕了.两天了.
      

  8.   

    晕,我的QQ和MSN因为长时间不用没了
      

  9.   

    不麻烦的话源码mail:[email protected],我看看吧
      

  10.   

    楼主所说我以前也做过,
    不知道是不是没理解楼主意思,
    我觉得选种List,并在jtable中显示相关的数据并不复杂,
    应该跟你的tableModel设计有很大的关系,如果模型数据变动后刷新一下表格即可。
    看看我以前的这个构造函数:
    <code>
    /**
       * Table面板初始化(包括按钮面板)
       * @param packTb PackTb Tb对象
       * @param hasButtonPanel boolean 是否带按钮面板
       * @param hasColumnEnabled boolean 是否显示行头
       * @param hasRowEnabled boolean 是否显示默认行
       * @param hasSignColumn boolean 是否显示标志列(默认为锁定和不可编辑状态)
       * @param sheetTable SheetTable 分页控件对象
       * @throws Exp 异常
       */
      public XTable(PackTb packTb, boolean hasButtonPanel, boolean hasColumnEnabled,
                    boolean hasRowEnabled, boolean hasSignColumn,
                    SheetTable sheetTable) throws Exp {
        _packTb = packTb;
        setTb(packTb.getTb()); //存TB对象
        setSheetTable(sheetTable); //存SheetTable对象
        columnModel = new XTableColumnModel(packTb); //实例化XTableColumnModel
        int i;
        for (i = 0; i < columnModel.getColumnCount(); i++) {
          columnTableVector.addElement(columnModel.getColumn(i));
        }
        testTableEntityList = columnModel.getRowList(); //取Tb数据
        initComponents(); //组件初始化
        if (hasButtonPanel) {
          _buttonPanel.add(buttonPane.getButtonField()); //按钮面板添加
        }
        mainTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); //设置表选择模型
        mainTable.setVirtualColumnEnabled(hasColumnEnabled); //是否显示行头
        mainTable.setVirtualRowEnabled(hasRowEnabled); //是否显示默认行
        setRowHeight(18);
        EntityTableColumn signColumn = ( (EntityTableColumn) columnModel.getColumn(
            0)); //标志列
        signColumn.setHidden(!hasSignColumn); //是否隐藏标志列
        refresh();
      }
    </code>
    模型数据及相关的属性全部封装到了PackTb类中,模型数据对象根据List的选择
    改变,只要刷新jtable就能显示正确的数据了。
      

  11.   

    谢谢您的回复,给予了我很大启发,现在tabledata弄成了就建立一个对象,以后的更新都是往对象中赋值,更新.表格就变了.
      

  12.   

    可以把事件去掉或者说过滤掉的
    看看 java 核心编程1