
JTabel 获取表格中选中的数据, 那么有可以考虑使用下面两种方法来实现
方法一:ListSelectionListener 来获取用户在表格里选中的数据是最方便和最优的
因为: 支持单选, 也支持多行, 支持键盘上下移动进行选择
方法二: MouseListener 当鼠标点击某行数据后,输出该数据 ,可以实现
不推荐使用MouseListener来获取表格选中数据:
1 不够灵敏, 偶尔会失效, 比如刚打开窗口后 ,有时候迅速点击table MouseListener 就可能不会有反应
2 用户选中多行, 比如拖动或者键盘上下移动进行选择时,那么在MouseListener里获取多行比较麻烦不仅仅需要实现鼠标点击 ,还得需要实现拖动鼠标,释放鼠标 等多个方法,如果完善一点还需要实现键盘事件的方法
参考代码如下
import javaawt;import javaawtevent;
import javaxswing;
import javaxswingevent;
public class TableDemo extends JFrame {
String[] names = { "姓名", "等级" };
String[][] data = { { "张三", "A" }, { "李四", "B" }, { "王五", "C" } };
public TableDemo() {
JTable table = new JTable(data, names);
JScrollPane jsp = new JScrollPane(table);
add(jsp);
setSize(300, 200);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
// 推荐
tablegetSelectionModel()addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
if (!egetValueIsAdjusting()) {
//支持拖动多选
int[] rows = tablegetSelectedRows();
// int[] cols = tablegetSelectedColumns();//选中的列
for (int i : rows) {
Systemoutprintln("#方法一:\t" + tablegetValueAt(i, 0) + "\t" + tablegetValueAt(i, 1));
}
//支持单选
// int row=tablegetSelectedRow();//选中行
// //int col=tablegetSelectedColumn();//选中列
// Systemoutprintln("方法一:"+tablegetValueAt(row, 0)+"\t"+tablegetValueAt(row, 1));
}
}
});
tableaddMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
//单选
int row = tablerowAtPoint(egetPoint());// 选中行
// int col =tablecolumnAtPoint(egetPoint());//选中列
Systemoutprintln("方法二:\t" + tablegetValueAt(row, 0) + "\t" + tablegetValueAt(row, 1));
}
});
}
public static void main(String[] args) {
EventQueueinvokeLater(new Runnable() {
public void run() {
new TableDemo()setVisible(true);
}
});
}
}
public void inithavesold(){//建立查询已销售商品表格、模型
try {
Vector<String> columnName = new Vector<String>();//字段名
Vector<Vector<Object>> dataVector = new
Vector<Vector<Object>>(); //存储所有数据,里面每个小的Vector是存单行的
columnNameadd("编号");
columnNameadd("商品名");
columnNameadd("数量");
columnNameadd("价格");
columnNameadd("总盈利");
conn = DataBasegetconnection();
stmt = conncreateStatement();
rs = stmtexecuteQuery("select from havesold");
while(rsnext()){
Vector<Object> vec = new Vector<Object>();//就是这个存单行的,最后放到上面的大的Vector里面
for(int i=1;i<=5;i++){
vecadd(rsgetObject(i));
}
dataVectoradd(vec);
}
tmhavesold = new DefaultTableModel();//建立默认的JTable模型
tmhavesoldsetDataVector(dataVector, columnName);//设定模型数据和字段
DataBasefree(conn, stmt, rs);
} catch (SQLException e) {
eprintStackTrace();
}
jtablesetModel(tmhavesold);
}
这个可以实现。JTable的有一个方法是getTableModel()返回提供此 JTable 所显示数据的 TableModel
TableModel是一个接口,实际上返回的是DefaultTableModel类,它实现了TableModel接口。这个类中有一个方法是void addRow(Object[] rowData)。它就是将一行插入到JTable中。
不过JTable的setValueAt方法应该就可以实现。
楼主可以定义个一个线程类来完成。
比如你需要插入100行数据,可以在线程的run方法中写一个循环,在循环中写两行代码,一行是setValueAt,一行是刷新JTable,然后再让线程睡眠,这样一行一行的显示的效果就可以出来了!
或者楼主可以用进度条来打发等待的时间,就像打开netbeans的那个进度条一样,这个可以用JProgressBar类。楼主可以去查看一下源代码。如果楼主还是没有头绪,我干脆就写个例子得了!
关于组件的添加或者类似设置窗口的大小,布局管理器等我就不做解释了!
import javaxswing;
import javaawtevent;
import javaawt;
import javaxswingtable;
public class Test extends JFrame implements ActionListener
{
private JButton button1;
private JButton button2;
private JButton button3;
private DefaultTableModel model;
private JTable table;
private JProgressBar bar;
private JScrollPane scrollpane;
private JPanel panel;
public Test()
{
button1=new JButton("演示1");
button2=new JButton("演示2");
button3=new JButton("清空");
panel=new JPanel();
bar=new JProgressBar(0,100);
String[] colnames={"数据一","数据二"};
model=new DefaultTableModel(colnames,100);
table=new JTable(model);
scrollpane=new JScrollPane(table);
panelsetLayout(new FlowLayout());
button1addActionListener(this);
button2addActionListener(this);
button3addActionListener(this);
paneladd(button1);
paneladd(button2);
paneladd(button3);
paneladd(bar);
thissetLayout(new GridLayout(2,1));
thissetSize(500,600);
thissetDefaultCloseOperation(JFrameEXIT_ON_CLOSE);
thisadd(scrollpane);
thisadd(panel);
}
public void actionPerformed(ActionEvent e)
{
String command=egetActionCommand();
if(commandequals("演示1"))
{
ShowModel show=new ShowModel(true);
Thread thread=new Thread(show);
threadstart();
}
else if(commandequals("演示2"))
{
ShowModel show=new ShowModel(false);
Thread thread=new Thread(show);
threadstart();
}
else
{
String[] colnames={"数据一","数据二"};
model=new DefaultTableModel(colnames,100);
tablesetModel(model);
}
}
private class ShowModel implements Runnable
{
private boolean type;//当type为true时,则说明是“演示1”的线程,false则相反
public ShowModel(boolean type)
{
thistype=type;
}
public void run()
{
if(type)//这个就是让线程睡眠,并且设置JTable的值
{
try{
for(int i=0;i<100;i++)
{
TestthistablesetValueAt(StringvalueOf(i),i,0);
TestthistablesetValueAt(StringvalueOf(i),i,1);
Threadsleep(100);
}
}catch(Exception e)
{
eprintStackTrace();
}
}
else//这个就是进度条的演示
{
try{
TestthistablesetVisible(false);
for(int i=0;i<100;i++)
{
TestthistablesetValueAt(StringvalueOf(i),i,0);
TestthistablesetValueAt(StringvalueOf(i),i,1);
TestthisbarsetValue(i+1);
TestthisbarsetString(StringvalueOf(i+1)+"%");
Threadsleep(40);
if(i==99)
{
TestthistablesetVisible(true);
JOptionPaneshowMessageDialog(Testthis,"OK");
TestthisbarsetValue(0);
}
}
}catch(Exception e)
{
eprintStackTrace();
}
}
}
}
public static void main(String[] args)
{
Test test=new Test();
testsetVisible(true);
}
}
如果楼主不懂了就问我啊!!
查询数据库的,返回的是一行一行的数据,举个例子:
id name sex
1 张三 男
2 李四 男
在读取数据库记录的时候:
Vector<Vector<Ojbect>> data = new Vector<Vector<Object>>();
while(rsnext())
{
Vector<Object> row = new Vector<Object>(); //一行数据
rowadd(rsgetInt("id"));
rowadd(rsgetString("name"));
rowadd(rsgetString("sex"));
dataadd(row); //添加一行数据
}
JTablesetModel(new DefaultTableModel(data,name));
查看一下SQL Server的日志不就可以了:)
进入企业管理器,你的数据库点开,"管理">>"SQL Server日志",查看你那天的存档就可以了。
唉,我可没有说右击阿:)
你点开你的数据库,下面不是有一些选项么,"数据库","数据转换服务","管理"就是这个管理阿。
默认jtable的seteditable(false)
监听鼠标mouseevent(应该是这个),用分支判断是否双击
是的话,就seteditable(true),否,就不yong变什么了
以上就是关于JAVA点击Jtable表格如何将点击的那一行数据分别输出出来全部的内容,包括:JAVA点击Jtable表格如何将点击的那一行数据分别输出出来、Java SWING如何从数据库中读取多组数据通过JTable显示、Java中JTble表格中的数据如何逐行显示等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)