需要帮忙的部分只是一处而已:
  void jButton1_actionPerformed(ActionEvent e) {
    System.out.println(jTextField4.getText());
    //将鼠标选中的那条记录的第4个字段更新为可编辑文本框中的字符串
    table.setValueAt(jTextField4.getText(),table.getSelectedRow(),3);
    table.revalidate();
  }
即此按钮事件处该如何实现即时刷新需求。

解决方案 »

  1.   

    不知道model里边有没有类似setvalueat()之类的改变数据的方法,我觉得用该改变model中的数据,而不是table中的数据。再就是加上一句table.updateUI()试一下。
      

  2.   

    有可能出现问题的是table的model,由于你的model中不是defaulttablemodel,你看一下其setValue的方法,是否满足要求,反正defaulttablemodel是行的!
      

  3.   

    to:pentax
    table.setValueAt()和table.getModel.setValueAt()一回事,见jtable代码:public void setValueAt(Object aValue, int row, int column) {
            getModel().setValueAt(aValue, row, convertColumnIndexToModel(column));
        }
      

  4.   

    我想你应该把值set到tablemodel中,我以前做过一个实验,
    table与tablemodel的值是不同的,在table中删除一列,
    在tablemodel中值仍然是存在的,而tablemodel的值才是
    真正的值,(我的理解,我没有深入研究过,我想是这样的)
    我建议你用一下tablemodel的setvalue方法试一下。
      

  5.   

    没有用……
    我将按钮事件设定如下,但是没有任何效果。改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();
      }
      

  6.   

    没有用……
    我将按钮事件设定如下,但是没有任何效果。改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();
      }
      

  7.   

    试试下面的程序,比较一下有什么主要的差别:
    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
      

  8.   

    唉,看来引用core in java里面的例子不行
    我还得自个写jtable阿
    哪位有现成的将数据库表中的数据用table显示出来的例子呢?
    当然model要是defaulttablemodel或者其扩展晚上结贴!!
      

  9.   

    从昨天晚上搞到现在,终于弄好了,测试通过!关键是在TreeModel实现中正确实现setValueAt(int,int)方法.另,我驱动用了Mssql driver.改好的代码如下:
    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);
      }
      

  10.   

    /* this class is the base class for the scrolling and the
       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
      

  11.   

    感谢上面各位的大力帮忙。
    总体而言,我已经搞清楚了是什么原因了。主要的是扩展AbstractTableModel时没有定义setValueAt方法,也就是说默认不可编辑model。其次是我用的是数据源,如果要改动的话,必须要支持结果集改变的,比如用驱动。但是奇怪得很,我用微软的驱动访问数据库的结果集很奇怪,读出放入数组里面可以正确显示,但是用上面的代码(即直接处理结果集)就不行,具体原因不明(生成rs后的代码和用数据源时相同)。
    算了,我想,我还是考虑用DefaultTableModel算了。
    不知道各位有无使用DefaultTableModel,Vector,JTable来显示数据库表数据的例子?无论多么简单,能否给我一个?
    多谢了!!!
      

  12.   

    我试过了,不是setvalue的问题,就象楼上的兄弟说的,
    是结果集没有改变,你看看你的这部分代码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)
    就行了。
      

  13.   

    我一直都是用DefaultTreeModel、Vector来作表,感觉用起来特别方便,想改数据只要改变一下Vector的内容即可,这样也方便对数据库的一次更新。
      

  14.   

    很容易啊
    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;
      }
    }