你的数据对象中的属性是不是跟你选不选中是相关的?比如选中就是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(); 就可以了
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)
现在的问题发展成: 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中放入这个用户的权限列表.
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)把列又加了一次进来.真是晕了.两天了.
说说你的要求
对,是您的意思,我怎么把表模型删除呢?我现在改为建立一个jtable了,然后填充数据了,但是我一触发事件,上一个表的东西好象还没有被覆盖,执行完一次jcheckbox的actionPerformed后,它又自动的执行了一次,这次就是上个表的事件.
办法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();
就可以了
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)
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中放入这个用户的权限列表.
{
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)把列又加了一次进来.真是晕了.两天了.
不知道是不是没理解楼主意思,
我觉得选种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就能显示正确的数据了。
看看 java 核心编程1