java:JTable如何重新指定行数据?
已经指定行数据和列首名来新建了一个JTable组件,后来响应事件需要重新指定一个两维数组来作为它的行数据,列首名可以不变,请问用什么方法能做到?(请给出具体的例子)谢谢了...
已经指定行数据和列首名来新建了一个JTable组件,后来响应事件需要重新指定一个两维数组来作为它的行数据,列首名可以不变,请问用什么方法能做到?(请给出具体的例子)谢谢了!!如果可以会追加分!!!!!
展开
2个回答
展开全部
替楼上的补充:一般符合MVC pattern构建的Table都是其TableModel的一个listener,所以model里内容改变后只要通知作为view的table。
目前版本的javax.swing.table.TableModel接口只有获取其listener的接口,没有规范具体通知的接口,但在AbstractTableModel类里就实现了如下通知接口:
public void fireTableChanged(TableModelEvent e);
public void fireTableStructureChanged();
public void fireTableRowsUpdated(int firstRow, int lastRow);
public void fireTableRowsInserted(int firstRow, int lastRow);
public void fireTableRowsDeleted(int firstRow, int lastRow);
public void fireTableCellUpdated(int row, int column);
public void fireTableDataChanged();
在作为TableModel的listner,JTable是实现了TableModelListener中定义的接受和处理来自model通知的接口的,就是
public void tableChanged(TableModelEvent e); 事实上AbstractTableModel上述的几个通知方法内部实现中都回调用其listener的这个方法。
根据你的情况,在重新设定二维表后,该tablemodel可以fire相应的消息,比如若连column数目都变掉的话,则调用最彻底的fireTableStructureChanged,但相应计算开销会大。 如果没有model view分得那么清,那么直接相当于从cotroller调用view的tablechange(...)方法也是可以的。
需要注意的是JTable的tablechange()的实现虽然一般情况下是够用了,但有时候需要重载自己写。比如若table的column不是根据tablemodel自动生成的,而是自己修改过了columnmodel,即JTable的autoCreateColumnsFromModel为false,那么当model的column增加的时候,JTable的实现不会自动显示增加的那个列,需要重载自己写。
目前版本的javax.swing.table.TableModel接口只有获取其listener的接口,没有规范具体通知的接口,但在AbstractTableModel类里就实现了如下通知接口:
public void fireTableChanged(TableModelEvent e);
public void fireTableStructureChanged();
public void fireTableRowsUpdated(int firstRow, int lastRow);
public void fireTableRowsInserted(int firstRow, int lastRow);
public void fireTableRowsDeleted(int firstRow, int lastRow);
public void fireTableCellUpdated(int row, int column);
public void fireTableDataChanged();
在作为TableModel的listner,JTable是实现了TableModelListener中定义的接受和处理来自model通知的接口的,就是
public void tableChanged(TableModelEvent e); 事实上AbstractTableModel上述的几个通知方法内部实现中都回调用其listener的这个方法。
根据你的情况,在重新设定二维表后,该tablemodel可以fire相应的消息,比如若连column数目都变掉的话,则调用最彻底的fireTableStructureChanged,但相应计算开销会大。 如果没有model view分得那么清,那么直接相当于从cotroller调用view的tablechange(...)方法也是可以的。
需要注意的是JTable的tablechange()的实现虽然一般情况下是够用了,但有时候需要重载自己写。比如若table的column不是根据tablemodel自动生成的,而是自己修改过了columnmodel,即JTable的autoCreateColumnsFromModel为false,那么当model的column增加的时候,JTable的实现不会自动显示增加的那个列,需要重载自己写。
展开全部
这个不难,呵呵,这是俺的一种解决办法,希望对你有所帮助:
package com.test;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
/**
* @author xixi
*
*/
public class JTableTest extends JFrame{
public static void main(String[] args) {
JFrame f=new JTableTest();
f.setBounds(100, 100, 300, 251);
f.setVisible(true);
}
private JTable table ;
private DefaultTableModel tableModel;
private Object data[][];
private String title[]={"title1","title2","title3"};
{ data=new Object[2][3];
tableModel = new DefaultTableModel(data,title);
table = new JTable(tableModel);
JButton refreshDataButton=new JButton("刷新数据");
refreshDataButton.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
java.util.Random r = new java.util.Random();
data = new Object[][]{
{r.nextInt(),r.nextInt(),r.nextInt()}
,{r.nextInt(),r.nextInt(),r.nextInt()}
,{r.nextInt(),r.nextInt(),r.nextInt()}
,{r.nextInt(),r.nextInt(),r.nextInt()}
};
tableModel.setDataVector(data, title);//这一行是关键
}
});
JScrollPane scrol=new JScrollPane(table);
Container c=getContentPane();
c.add(scrol,BorderLayout.CENTER);
c.add(refreshDataButton,BorderLayout.SOUTH);
}
}
package com.test;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
/**
* @author xixi
*
*/
public class JTableTest extends JFrame{
public static void main(String[] args) {
JFrame f=new JTableTest();
f.setBounds(100, 100, 300, 251);
f.setVisible(true);
}
private JTable table ;
private DefaultTableModel tableModel;
private Object data[][];
private String title[]={"title1","title2","title3"};
{ data=new Object[2][3];
tableModel = new DefaultTableModel(data,title);
table = new JTable(tableModel);
JButton refreshDataButton=new JButton("刷新数据");
refreshDataButton.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
java.util.Random r = new java.util.Random();
data = new Object[][]{
{r.nextInt(),r.nextInt(),r.nextInt()}
,{r.nextInt(),r.nextInt(),r.nextInt()}
,{r.nextInt(),r.nextInt(),r.nextInt()}
,{r.nextInt(),r.nextInt(),r.nextInt()}
};
tableModel.setDataVector(data, title);//这一行是关键
}
});
JScrollPane scrol=new JScrollPane(table);
Container c=getContentPane();
c.add(scrol,BorderLayout.CENTER);
c.add(refreshDataButton,BorderLayout.SOUTH);
}
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询