急求解决我写了一个JTable的动态添加行数据但占用CPU达到百分之50

qpowj 2011-04-14 01:10:54
急求原因,解决
下面贴出可运行源码

public class Qam {

private int ber;

private int cl;

private int evm;

private int freq;

private int freqOff;

private int lock;

private int mer;

private int symOff;

public int getBer() {
return ber;
}

public void setBer(int ber) {
this.ber = ber;
}

public int getCl() {
return cl;
}

public void setCl(int cl) {
this.cl = cl;
}

public int getEvm() {
return evm;
}

public void setEvm(int evm) {
this.evm = evm;
}

public int getFreq() {
return freq;
}

public void setFreq(int freq) {
this.freq = freq;
}

public int getFreqOff() {
return freqOff;
}

public void setFreqOff(int freqOff) {
this.freqOff = freqOff;
}

public int getLock() {
return lock;
}

public void setLock(int lock) {
this.lock = lock;
}

public int getMer() {
return mer;
}

public void setMer(int mer) {
this.mer = mer;
}

public int getSymOff() {
return symOff;
}

public void setSymOff(int symOff) {
this.symOff = symOff;
}

}

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JViewport;
import javax.swing.border.BevelBorder;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableModel;

@SuppressWarnings("serial")
public class QamFrameImp extends JFrame {

public JTable table;

private QamData data;

private JPanel endPl;

private JButton exitBtn;

private JScrollPane pane1;

private JTableHeader head;

public QamFrameImp() {
}

public void initFrame(Object obj) {
data = new QamData(this);
initComponents();
}

public void showFrame() {
data.start();
this.setVisible(true);
}

public void distFrame() {
data.stop();
Runtime.getRuntime().exit(0);
this.setVisible(false);
}

private void initComponents() {
this.setUndecorated(true);
this.setLocation(0, 0);
this.setExtendedState(JFrame.MAXIMIZED_BOTH);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel pl = new JPanel();//ImgPl(ImageConst.bg, 0, 0);
pl.setBorder(BorderFactory.createEmptyBorder(30, 0, 12, 18));
pl.setOpaque(false);
pl.setLayout(new BorderLayout());
pl.add(buildCenterPanel(), BorderLayout.CENTER);
pl.add(getEndPl(), BorderLayout.SOUTH);
this.add(pl);
}

private JPanel buildCenterPanel() {
JPanel panel = new JPanel();//ImgPl(ImageConst.qamTab, 0, 0);
panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 20));
panel.setOpaque(false);
panel.setLayout(new BorderLayout());
panel.add(getSp(), BorderLayout.CENTER);
return panel;
}

private JScrollPane getSp() {
Object[] column = { "序号", "频点", "锁定", "频率漂移", "符号率漂移", "载波电平", "MER",
"EVM", "BER" };
Object[][] rowData = {};
DefaultTableModel dtm = new DefaultTableModel(rowData, column);
if (pane1 == null) {
pane1 = new JScrollPane();
}
JViewport view = new JViewport();
view.setOpaque(false);
view.setBorder(null);
pane1.setViewport(view);
pane1.setOpaque(false);
pane1.setBorder(null);
JViewport colView = new JViewport();
colView.setOpaque(false);
pane1.setColumnHeader(colView);
pane1.setViewportView(getTab(dtm));
pane1.setPreferredSize(new Dimension(910, 625));
return pane1;
}

private JTable getTab(TableModel tm) {
if (table == null) {
table = new JTable(tm) {
@Override
public boolean isCellEditable(int arg0, int arg1) {
// TODO 自动生成方法存根
return false;
}
};
}
Render render = new Render();
head = table.getTableHeader();
head.setBorder(new BevelBorder(0));
head.setForeground(Color.white);
head.setFont(new Font(null, 0, 16));
head.setOpaque(false);
head.setDefaultRenderer(render);
head.setReorderingAllowed(false);
head.setDefaultRenderer(render);
table.setOpaque(false);
table.setBorder(null);
table.setDefaultRenderer(Object.class, render);
table.setRowHeight(25);
table.setFont(new Font(null, 0, 14));
table.setForeground(Color.black);
table.setSelectionForeground(Color.gray);
return table;
}

private JPanel getEndPl() {
if (endPl == null) {
endPl = new JPanel();
}
endPl.setBorder(BorderFactory.createEmptyBorder(30, 0, 10, 0));
endPl.setOpaque(false);
endPl.setLayout(new FlowLayout(FlowLayout.RIGHT, 10, 10));
endPl.add(getExitBtn());
return endPl;
}

private JButton getExitBtn() {
if (exitBtn == null) {
exitBtn = new JButton();
}
ImageIcon backImg = new ImageIcon("images/quit.png");
exitBtn.addActionListener(new Action(this));
exitBtn.setIcon(backImg);
exitBtn.setPreferredSize(new Dimension(backImg.getIconWidth() + 5,
backImg.getIconHeight() + 5));
exitBtn.setOpaque(false);
exitBtn.setBorderPainted(false);
exitBtn.setToolTipText("关闭");
return exitBtn;
}

public static void main(String[] args) {
QamFrameImp qamF = new QamFrameImp();
qamF.initFrame(null);
qamF.showFrame();
}

}

@SuppressWarnings("serial")
class Render extends DefaultTableCellRenderer {

@Override
public Component getTableCellRendererComponent(JTable tab, Object val,
boolean arg2, boolean arg3, int arg4, int arg5) {
// TODO 自动生成方法存根
if (val instanceof Icon) {
this.setIcon((Icon) val);
val = "";
} else {
this.setText(val + "");
this.setIcon(null);
}
tab.setGridColor(Color.black);
this.setHorizontalAlignment(JLabel.CENTER);
this.setOpaque(false);
return super.getTableCellRendererComponent(tab, val, arg2, arg3, arg4,
arg5);
}

}

class Action implements ActionListener {

private QamFrameImp qf;

public Action(QamFrameImp qf) {
this.qf = qf;
}

public void actionPerformed(ActionEvent arg0) {
// TODO 自动生成方法存根
qf.distFrame();
}
}

import java.util.Timer;
import java.util.TimerTask;

import javax.swing.table.DefaultTableModel;

public class QamData {

private Timer t;


private QamFrameImp qf;

private DefaultTableModel dtm;

public QamData(QamFrameImp qf) {
this.qf = qf;
}

private void setQam(Qam q) {
dtm = (DefaultTableModel) qf.table.getModel();
Object[] obj = { dtm.getRowCount() + 1, q.getFreq(), q.getLock(),
q.getFreqOff(), q.getSymOff(), q.getCl(), q.getMer(),
q.getEvm(), q.getBer() };
dtm.addRow(obj);
}

private void getQamData() {
Qam q = new Qam();
q.setBer(4);
q.setCl(1);
q.setEvm(2);
q.setFreq(3);
q.setFreqOff(5);
q.setLock(1);
q.setMer(6);
q.setSymOff(7);
setQam(q);

}

public void start() {
if (t == null) {
t = new Timer();
}
t.schedule(new TimerTask() {

@Override
public void run() {
// TODO 自动生成方法存根
getQamData();
}

}, 0, 10000);
}

public void stop() {
if (t != null) {
System.out.println("1111111");
t.cancel();
t = null;
}
}
}
...全文
129 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
li_buaa 2012-03-20
  • 打赏
  • 举报
回复
楼上能不能说的清楚些
sunkun1560 2011-04-22
  • 打赏
  • 举报
回复
tab.setGridColor(Color.black);

调用的位置错了,导致你的render循环调用,CPU就上去了。
qpowj 2011-04-14
  • 打赏
  • 举报
回复
自己顶上等待回答

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧