本帖最后由 xiezhiyong3621 于 2011-12-29 09:48:05 编辑

解决方案 »

  1.   

    每次更新 data 数组里的数据
    然后 repaint() 这个 JTable 不行么?
      

  2.   

    我很想知道你是怎么换数据的?
    其实可以用一个 TabelModel
    每次准备好数据后给JTabel  setModel(...);
      

  3.   

    我觉得应该给jtable设置table模型啊,不是有个javax.swing.table.*;包吗,里面有table的相关模型
    每次更新jtable时setModel就能刷新数据了!
      

  4.   

    我贴出代码:代码对你们肯定是没用的,因为引用了rxtx类的包。基本的操作大概是这样的。import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;import javax.swing.*;
    import javax.swing.table.*; 
    import com.item.dao.*;
    import com.item.model.*;import java.util.*;
    import java.util.List;
    public class TestFrame extends JFrame implements Observer{
    static int k=0;
    static JTable jt=new JTable();//定义成static的只能更新一次数据,然后就不行了,没界面显示了。
    static DefaultTableModel dtm=new DefaultTableModel();
    BorderLayout borderLayout1 = new BorderLayout();
    JScrollPane jScrollPane1 = new JScrollPane();
    public TestFrame()
    {
    try
    {
    jbInit();
    }
    catch(Exception ex)
    {
    ex.printStackTrace();
    }
    }

    public void update(Observable arg0, Object arg1) {
    String mr=Bytes2HexString((byte[])arg1);
        String str=mr.replace("CCFF34","");
    System.out.println(str.length()+"===="+str);         Type bean=new Type();
     TypeDAO tdao=new TypeDAO();
     List<Type> tlist=(List<Type>)tdao.selectType(bean);
         String[] header = {"tttt", "hhh", "jjjj"};
         Object[][] data = new Object[tlist.size()][header.length];
           for (int i =0; i < tlist.size(); i++) {
            Type tbean = (Type) tlist.get(i);
               data[i][0]=tbean.getTid();
               data[i][1]=tbean.getTname();
               data[i][2]=tbean.getTname();    
          }
           dtm.setDataVector(data, header);
           TestFrame.hideColumn(jt, 0);
      /*jt.repaint();
       jt.getUI();
       jt.invalidate();//都是无效的。
       jt.revalidate();*/

    SerialReader sr=new SerialReader();
    sr.openSerialPort("");
     
     
    }
    private void jbInit() throws Exception { 
    JPanel jp=new JPanel();
    JButton jb=new JButton(); 

    JButton jadd=new JButton();
    JButton jupdate=new JButton();
    JPanel jpt=new JPanel();
    this.setLayout(borderLayout1);
        jb.setText("Select");
        jb.addActionListener(new TestFrame_jb_actionAdapter(this));//使用按钮点击事件肯定是没问题
        jp.add(jb);
        jadd.setText("Add");
        jupdate.setText("Update");
        jpt.add(jadd);
        jpt.add(jupdate);
        jScrollPane1.getViewport().add(jt);
        this.add(jp,java.awt.BorderLayout.NORTH);
        this.add(jScrollPane1,java.awt.BorderLayout.CENTER);
        this.add(jpt,java.awt.BorderLayout.SOUTH);
        jt.setModel(dtm);
         Type bean=new Type();
     TypeDAO tdao=new TypeDAO();
     List<Type> tlist=(List<Type>)tdao.selectType(bean);
         String[] header = {"number", "type", "name"};
         Object[][] data = new Object[tlist.size()][header.length];
           for (int i =0; i < tlist.size(); i++) {
            Type tbean = (Type) tlist.get(i);
               data[i][0]=tbean.getTid();
               data[i][1]=tbean.getTid();
               data[i][2]=tbean.getTname();    
          }
           dtm.setDataVector(data, header);
           TestFrame.hideColumn(jt, 0);
     
    }
    public static void main(String[] args)
    {
    SerialReader sr=new SerialReader();
    sr.openSerialPort("");


    TestFrame frame=new TestFrame();
    frame.setVisible(true);
    frame.setSize(800,600);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
     public void jb_actionPerformed(ActionEvent e) {
     Type bean=new Type();
     TypeDAO tdao=new TypeDAO();
     List<Type> tlist=(List<Type>)tdao.selectType(bean);
     String[] header = {"tttt", "gggg", "hhhh"};
         Object[][] data = new Object[tlist.size()][header.length];
           for (int i =0; i < tlist.size(); i++) {
            Type tbean = (Type) tlist.get(i);
               data[i][0]=tbean.getTid();
               data[i][1]=tbean.getTname();
               data[i][2]=tbean.getTname();    
          }
           dtm.setDataVector(data, header);
           TestFrame.hideColumn(jt, 0);   }
      public static void hideColumn(JTable table, int index) {
          TableColumn tc = table.getColumnModel().getColumn(index);
          tc.setMaxWidth(0);
          tc.setPreferredWidth(0);
          tc.setWidth(0);
          tc.setMinWidth(0);
          table.getTableHeader().getColumnModel().getColumn(index).setMaxWidth(0);
          table.getTableHeader().getColumnModel().getColumn(index).setMinWidth(0);
      }
      public static String Bytes2HexString(byte[] b) { 
       String ret = ""; 
       for (int i = 0; i < b.length; i++) { 
         String hex = Integer.toHexString(b[i] & 0xFF); 
         if (hex.length() == 1) { 
           hex = '0' + hex; 
         } 
         ret += hex.toUpperCase(); 
       } 
       return ret; 
    } }
    class TestFrame_jb_actionAdapter
        implements ActionListener {
      private TestFrame adaptee;
      TestFrame_jb_actionAdapter(TestFrame adaptee) {
        this.adaptee = adaptee;
      }   public void actionPerformed(ActionEvent e) {
        adaptee.jb_actionPerformed(e);
      }
    }
      

  5.   

    使用 JScrollPane 的 setViewportView 方法。每次更新 jt 之后都调用方法 jsp.setViewportView(jt);
      

  6.   

    jsp.setViewportView(jt)跟jsp=new JScrollPane(jt);是一样的
      

  7.   

    楼主 再看看API文档  我爱莫能助
      

  8.   

    dtm.setDataVector(data, header);后面加个 jt.setModel(dtm); 试试
      

  9.   

    很显然你要fire DataModel change的事件就可以
    使用观察者模式看到的上位机数据有更新,就fire Table 的DataModelChanged 事件
    就这么简单!
      

  10.   

    楼主你要先确定你从串口已经拿到值了,只是swing无法实时更新
      

  11.   

    public void initTable(Vector data, Vector colName) {
      DefaultTableModel model = new DefaultTableModel(data, colName);
      chakantable.setModel(model);
    }
      

  12.   

    为什么要定义成static类型?有多个对象要共享它么?