向懂swing的朋友求助!!! 本帖最后由 xiezhiyong3621 于 2011-12-29 09:48:05 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 每次更新 data 数组里的数据然后 repaint() 这个 JTable 不行么? 我很想知道你是怎么换数据的?其实可以用一个 TabelModel每次准备好数据后给JTabel setModel(...); 我觉得应该给jtable设置table模型啊,不是有个javax.swing.table.*;包吗,里面有table的相关模型每次更新jtable时setModel就能刷新数据了! 我贴出代码:代码对你们肯定是没用的,因为引用了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); } } 使用 JScrollPane 的 setViewportView 方法。每次更新 jt 之后都调用方法 jsp.setViewportView(jt); jsp.setViewportView(jt)跟jsp=new JScrollPane(jt);是一样的 楼主 再看看API文档 我爱莫能助 dtm.setDataVector(data, header);后面加个 jt.setModel(dtm); 试试 很显然你要fire DataModel change的事件就可以使用观察者模式看到的上位机数据有更新,就fire Table 的DataModelChanged 事件就这么简单! 楼主你要先确定你从串口已经拿到值了,只是swing无法实时更新 public void initTable(Vector data, Vector colName) { DefaultTableModel model = new DefaultTableModel(data, colName); chakantable.setModel(model); } 为什么要定义成static类型?有多个对象要共享它么? M个值的数组中,选取N个数的全排列组合 怎么测试,求思路!!! 我和高手对决的一个小问题。 socket客户端与服务器通信中用同步还是异步好? 关于SQL动态参数的问题 一道**的题,大家近来帮看看~~~ java运行时奇怪的错误 请问怎么让程序不在任务栏中显示? 君子之交淡若水,我没有分送给大家了,请别介意。想与各位交个朋友,谁会VRML请留下你的联系方式好吗?我的QQ:57319528,Email:nitxht@163 下载了一个HttpClients包,可是不知道应该把它放在哪 java 如何读取路由器的外网IP java图形用户界面如何去掉顶部的边框
然后 repaint() 这个 JTable 不行么?
其实可以用一个 TabelModel
每次准备好数据后给JTabel setModel(...);
每次更新jtable时setModel就能刷新数据了!
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);
}
}
使用观察者模式看到的上位机数据有更新,就fire Table 的DataModelChanged 事件
就这么简单!
DefaultTableModel model = new DefaultTableModel(data, colName);
chakantable.setModel(model);
}