需要帮忙的部分只是一处而已:
void jButton1_actionPerformed(ActionEvent e) {
System.out.println(jTextField4.getText());
//将鼠标选中的那条记录的第4个字段更新为可编辑文本框中的字符串
table.setValueAt(jTextField4.getText(),table.getSelectedRow(),3);
table.revalidate();
}
即此按钮事件处该如何实现即时刷新需求。
void jButton1_actionPerformed(ActionEvent e) {
System.out.println(jTextField4.getText());
//将鼠标选中的那条记录的第4个字段更新为可编辑文本框中的字符串
table.setValueAt(jTextField4.getText(),table.getSelectedRow(),3);
table.revalidate();
}
即此按钮事件处该如何实现即时刷新需求。
table.setValueAt()和table.getModel.setValueAt()一回事,见jtable代码:public void setValueAt(Object aValue, int row, int column) {
getModel().setValueAt(aValue, row, convertColumnIndexToModel(column));
}
table与tablemodel的值是不同的,在table中删除一列,
在tablemodel中值仍然是存在的,而tablemodel的值才是
真正的值,(我的理解,我没有深入研究过,我想是这样的)
我建议你用一下tablemodel的setvalue方法试一下。
我将按钮事件设定如下,但是没有任何效果。改model和table都没有用
void jButton1_actionPerformed(ActionEvent e) {
System.out.println(jTextField4.getText());
//将鼠标选中的那条记录的第4个字段更新为可编辑文本框中的字符串
int i = table.getSelectedRow();
int j = 3;
table.getModel().setValueAt(jTextField4.getText(),i,j);
table.updateUI();
table.revalidate();
tableJScrollPane.getViewport().add(table,null);
tableJScrollPane.revalidate();
}
我将按钮事件设定如下,但是没有任何效果。改model和table都没有用
void jButton1_actionPerformed(ActionEvent e) {
System.out.println(jTextField4.getText());
//将鼠标选中的那条记录的第4个字段更新为可编辑文本框中的字符串
int i = table.getSelectedRow();
int j = 3;
table.getModel().setValueAt(jTextField4.getText(),i,j);
table.updateUI();
table.revalidate();
tableJScrollPane.getViewport().add(table,null);
tableJScrollPane.revalidate();
}
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class Test extends JFrame {
public Test(){
final JTable r = new JTable(10,10);
JButton d = new JButton("Refresh");
final JTextField t = new JTextField("askldasdfsadfsadf");
d.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
r.setValueAt(t.getText(),r.getSelectedRow(),3);
r.revalidate();
}
});
getContentPane().add(r);
getContentPane().add(d,BorderLayout.SOUTH);
getContentPane().add(t,BorderLayout.NORTH);
pack();
show();
}
public static void main(String[] args){new Test();}
}
我想还是model
我还得自个写jtable阿
哪位有现成的将数据库表中的数据用table显示出来的例子呢?
当然model要是defaulttablemodel或者其扩展晚上结贴!!
package question;/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2002</p>
* <p>Company: </p>
* @author unascribed
* @version 1.0
*/import java.awt.*;
import javax.swing.*;
import com.borland.jbcl.layout.*;
import java.awt.event.*;
import javax.swing.border.*;
import java.sql.*;
import javax.swing.event.*;
import java.util.*;
import javax.swing.table.*;
public class DialogServerLog extends JDialog {
private JPanel jPMain = new JPanel();
private XYLayout xYLayout1 = new XYLayout();
private JPanel jPTableView = new JPanel();
private XYLayout xYLayout2 = new XYLayout();
private XYLayout xYLayout3 = new XYLayout();
private JPanel jPAllDo = new JPanel();
private JTextField jTextField1 = new JTextField();
private JTextField jTextField2 = new JTextField(); private JScrollPane tableJScrollPane;
private JTable table;//数据库表显示
private String[] value = new String[4];//Table中的一条数据各个字段
private JTextField jTextField3 = new JTextField();
private JTextField jTextField4 = new JTextField();
private boolean SCROLLABLE = true;//数据库是否支持滚动光标,此处支持为true
private ResultSet rs;
private Connection con;
private Statement stmt;
private JButton jButton1 = new JButton();
private ResultSetTableModel model;
XYLayout xYLayout4 = new XYLayout(); //*/
public static void main(String[] args ) {
DialogServerLog ds = new DialogServerLog();
ds.show();
}
//*/
public DialogServerLog() {
setTitle(" 服务器日志信息维护");
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
} );
try {
//驱动改了,因为JDBC-ODBC不支持更新结果集。
String dbUrl = "jdbc:microsoft:sqlserver://172.16.1.85:1433";
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
Properties prop=new Properties();
prop.put("DatabaseName","pubs");
prop.put("Password","");
prop.put("User","sa");
prop.put("ServerName","172.16.1.85");
prop.put("SelectMethod","direct");
con = DriverManager.getConnection(dbUrl,prop);
if (SCROLLABLE) {
stmt = con.createStatement(
ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
}
else {
stmt = con.createStatement();
}
String query = "SELECT * FROM serverLog";
rs = stmt.executeQuery(query);
if (SCROLLABLE)
model = new ScrollingResultSetTableModel(rs);
else
model = new CachingResultSetTableModel(rs); table = new JTable(model);
tableJScrollPane = new JScrollPane(table);//容器 jbInit();
}
catch(Exception e) {
e.printStackTrace();
}
}
private void jbInit() throws Exception {
this.setSize(new Dimension(565, 430));
this.getContentPane().setLayout(xYLayout4);
jPMain.setLayout(xYLayout1);
jPTableView.setLayout(xYLayout2);
jPTableView.setBorder(BorderFactory.createLoweredBevelBorder());
jPAllDo.setLayout(xYLayout3);
jPAllDo.setBorder(BorderFactory.createEtchedBorder());
/*这儿好像有问题,被注释掉了
///鼠标选择一条记录,用文本框显示各字段
table.getSelectionModel().addListSelectionListener(
new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
if (!e.getValueIsAdjusting()) {
for(int i=0;i<value.length;i++) {//提取此记录中的各字段
value[i] = table.getValueAt(table.getSelectedRow(),i).toString();
}
jTextField1.setText(value[0]);
jTextField2.setText(value[1]);
jTextField3.setText(value[2]);
jTextField4.setText(value[3]);
}
}
});*/
table.getTableHeader().setReorderingAllowed(false);
jTextField1.setEditable(false);
jTextField2.setEditable(false);
jTextField3.setEditable(false); jButton1.setText("测试是否正常可以更新第四字段");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
jButton1_actionPerformed(e);
}
});
jPMain.add(jPTableView, new XYConstraints(5, 5, 548, 224));
jPTableView.add(tableJScrollPane, new XYConstraints(-1, -1, 547, 223));
jPMain.add(jPAllDo, new XYConstraints(5, 241, 549, 149));
jPAllDo.add(jTextField2, new XYConstraints(356, 13, 151, -1));
jPAllDo.add(jTextField1, new XYConstraints(99, 13, 150, -1));
jPAllDo.add(jTextField3, new XYConstraints(99, 48, 151, -1));
jPAllDo.add(jButton1, new XYConstraints(168, 90, -1, 38));
jPAllDo.add(jTextField4, new XYConstraints(354, 48, 153, -1));
this.getContentPane().add(jPMain, new XYConstraints(0, 0, 565, -1)); } void jButton1_actionPerformed(ActionEvent e) {
System.out.println(jTextField4.getText());
//改动,删掉了一行。
//将鼠标选中的那条记录的第4个字段更新为可编辑文本框中的字符串
table.getModel().setValueAt(jTextField4.getText(),table.getSelectedRow(),3);
}
caching result set table model. It stores the result set
and its metadata.
*/abstract class ResultSetTableModel extends AbstractTableModel
{ public ResultSetTableModel(ResultSet aResultSet)
{ rs = aResultSet;
try
{ rsmd = rs.getMetaData();
}
catch(SQLException e)
{ System.out.println("Error " + e);
}
} public String getColumnName(int c)
{ try
{ return rsmd.getColumnName(c + 1);
}
catch(SQLException e)
{ System.out.println("Error " + e);
return "";
}
} public int getColumnCount()
{ try
{ return rsmd.getColumnCount();
}
catch(SQLException e)
{ System.out.println("Error " + e);
return 0;
}
} protected ResultSet getResultSet()
{ return rs;
}
//改动,把private 改为了protected.
protected ResultSet rs;
private ResultSetMetaData rsmd;
} /* this class uses a scrolling cursor, a JDBC 2 feature
*/class ScrollingResultSetTableModel extends ResultSetTableModel
{ public ScrollingResultSetTableModel(ResultSet aResultSet)
{ super(aResultSet);
} public Object getValueAt(int r, int c)
{ try
{ ResultSet rs = getResultSet();
rs.absolute(r + 1);
return rs.getString(c + 1);
}
catch(SQLException e)
{ System.out.println("Error " + e);
return null;
}
} public int getRowCount()
{ try
{ ResultSet rs = getResultSet();
rs.last();
return rs.getRow();
}
catch(SQLException e)
{ System.out.println("Error " + e);
return 0;
}
} /*改动*/
public void setValueAt(Object obj,int rowIndex,int colIndex)
{String val=(String)obj;
if((rowIndex<getRowCount())&&colIndex<getColumnCount()){
try{
//System.out.println("Value:"+val);
//ResultSet rs = getResultSet();
//更新改列的值
this.rs.absolute(rowIndex+1);
this.rs.updateString(colIndex+1,val);
this.rs.updateRow();
this.rs.close();
//重取一次,否则ResultSet中的值不更新,可能有其他办法
this. rs=stmt.executeQuery("Select * from serverLog");
//通知UI重画该列
this.fireTableCellUpdated(rowIndex,colIndex);
// val=this.rs.getString(colIndex+1);
//System.out.println("new Value:"+val);
}catch(SQLException sqlex)
{System.out.println("Exception when update:"+sqlex.getMessage());}
}
}
}/* this class caches the result set data; it can be used
if scrolling cursors are not supported
*/class CachingResultSetTableModel extends ResultSetTableModel
{ public CachingResultSetTableModel(ResultSet aResultSet)
{ super(aResultSet);
try
{ cache = new ArrayList();
int cols = getColumnCount();
ResultSet rs = getResultSet(); /* place all data in an array list of Object[] arrays
We don't use an Object[][] because we don't know
how many rows are in the result set
*/ while (rs.next())
{ Object[] row = new Object[cols];
for (int j = 0; j < row.length; j++)
row[j] = rs.getString(j + 1);
cache.add(row);
}
}
catch(SQLException e)
{ System.out.println("Error " + e);
}
}
public Object getValueAt(int r, int c)
{ if (r < cache.size())
return ((Object[])cache.get(r))[c];
else
return null;
}
public int getRowCount()
{ return cache.size();
} private ArrayList cache;
}
}
//end
总体而言,我已经搞清楚了是什么原因了。主要的是扩展AbstractTableModel时没有定义setValueAt方法,也就是说默认不可编辑model。其次是我用的是数据源,如果要改动的话,必须要支持结果集改变的,比如用驱动。但是奇怪得很,我用微软的驱动访问数据库的结果集很奇怪,读出放入数组里面可以正确显示,但是用上面的代码(即直接处理结果集)就不行,具体原因不明(生成rs后的代码和用数据源时相同)。
算了,我想,我还是考虑用DefaultTableModel算了。
不知道各位有无使用DefaultTableModel,Vector,JTable来显示数据库表数据的例子?无论多么简单,能否给我一个?
多谢了!!!
是结果集没有改变,你看看你的这部分代码model = new ScrollingResultSetTableModel(rs);
else
model = new CachingResultSetTableModel(rs);只要rs不变,model中的数值就不变,呵呵,真不容易。
DefaultTableModel,Vector,JTable来显示数据库表数据的例子?对了,你可以把resultset中的数据取出来,放到vector中
然后调用
public void setDataVector(Vector dataVector,
Vector columnIdentifiers)
和jtable的public void setModel(TableModel dataModel)
就行了。
DefaultTableModel tm = new DefaultTableModel();
for (int i = 0; i < 5; i++)
tm.addColumn("Column " + Integer.toString(i));
for (int i = 0; i < 10; i++) {
Vector row = new Vector();
for (int j = 0; j < tm.getColumnCount(); j++) {
row.add("Item " + Integer.toString(j));
tm.addRow(row);
}
}
JTable table = new JTable();
table.setModel(tm);
JScrollPane scrollPane = new JScrollPane();
scrollPane.getViewport().add(table, null);
如果想要JTable的单元格不可编辑的话,可以在DefaultTableModel上扩展一下,把jtable的model设成下面这样的就行了
public class CellUneditableTableModel extends DefaultTableModel{
/**
* Override superclass mothed
* @see TableModel
*/
public boolean isCellEditable(int row, int column) {
return false;
}
}