Java 为什么在接收更改事件时从不更改通知程序
我发布了一个答案,但我得到了一个评论-克利奥帕特拉Java 为什么在接收更改事件时从不更改通知程序,java,swing,events,jtable,Java,Swing,Events,Jtable,我发布了一个答案,但我得到了一个评论-克利奥帕特拉 nonono - you never change the notifier in receiving a change event. As to probable effects, think: nasty loops. As to code sanity, think: indecent intimacy. It's the task of the model itself to internally update related v
nonono - you never change the notifier in receiving a change event.
As to probable effects, think: nasty loops. As to code sanity, think:
indecent intimacy. It's the task of the model itself to internally
update related values if necessary.
有人能解释一下通知程序在接收变更事件时发生了什么变化,可能会发生什么,她真正的意思是什么,因为我尝试了我所知道的一切,我只接收来自快速循环的RepaitManager异常
我再也没有例外了,在哪里
- 我将其乘以50 x 1000矩阵
- 使用prepareRenderer(更改正值/负值的颜色)
- 刷新率为175毫秒
import java.awt.*;
import java.awt.event.ActionEvent;
import java.util.Random;
import java.util.concurrent.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.DefaultTableModel;
public class ChangeNotifiersOnEvent extends JFrame implements Runnable {
private static final long serialVersionUID = 1L;
private boolean runProcess = true;
private Random random = new Random();
private javax.swing.Timer timerRun;
private Executor executor = Executors.newCachedThreadPool();
private String[] columnNames = {"Source", "Hit", "Last", "Ur_Diff"};
private JTable table;
private Object[][] data = {{"Swing Timer", 2.99, 5, 1.01},
{"Swing Worker", 7.10, 5, 1.010}, {"TableModelListener", 25.05, 5, 1.01}};
private DefaultTableModel model = new DefaultTableModel(data, columnNames);
public ChangeNotifiersOnEvent() {
table = new JTable(model) {
private static final long serialVersionUID = 1L;
@Override
public Class getColumnClass(int column) {
return getValueAt(0, column).getClass();
}
};
model.addTableModelListener(new TableModelListener() {
@Override
public void tableChanged(TableModelEvent tme) {
if (tme.getType() == TableModelEvent.UPDATE) {
if (tme.getColumn() == 1 && tme.getLastRow() == 2) {
double dbl = ((Double) table.getModel().getValueAt(2, 1))
- ((Integer) table.getModel().getValueAt(2, 2));
table.getModel().setValueAt(dbl, 2, 3);
} else if (tme.getColumn() == 1 && tme.getLastRow() == 0) {
prepareUpdateTableCell();
} else if (tme.getColumn() == 1 && tme.getLastRow() == 1) {
executor.execute(new MyTask(MyTask.UPDATE_TABLE_COLUMN));
}
}
}
});
table.setRowHeight(30);
table.setFont(new Font("Serif", Font.BOLD, 20));
table.getColumnModel().getColumn(0).setPreferredWidth(180);
table.setPreferredScrollableViewportSize(table.getPreferredSize());
JScrollPane scrollPane = new JScrollPane(table);
add(scrollPane, BorderLayout.CENTER);
new Thread(this).start();
}
private void prepareUpdateTableCell() {
timerRun = new javax.swing.Timer(10, UpdateTableCell());
timerRun.setRepeats(false);
timerRun.start();
}
private Action UpdateTableCell() {
return new AbstractAction("Update Table Cell") {
private static final long serialVersionUID = 1L;
@Override
public void actionPerformed(ActionEvent e) {
double dbl = ((Double) table.getModel().getValueAt(0, 1))
- ((Integer) table.getModel().getValueAt(0, 2));
table.getModel().setValueAt(dbl, 0, 3);
}
};
}
@Override
public void run() {
while (runProcess) {
try {
Thread.sleep(250);
} catch (Exception e) {
e.printStackTrace();
}
changeTableValues();
}
}
private void changeTableValues() {
Runnable doRun = new Runnable() {
@Override
public void run() {
table.getModel().setValueAt(random.nextInt(128) + random.nextDouble(), 0, 1);
table.getModel().setValueAt(random.nextInt(256) + random.nextDouble(), 1, 1);
table.getModel().setValueAt(random.nextInt(512) + random.nextDouble(), 2, 1);
table.getModel().setValueAt(random.nextInt(128), 0, 2);
table.getModel().setValueAt(random.nextInt(128), 1, 2);
table.getModel().setValueAt(random.nextInt(128), 2, 2);
}
};
SwingUtilities.invokeLater(doRun);
}
private class MyTask extends SwingWorker<Void, Integer> {
private static final String UPDATE_TABLE_COLUMN = "update";
private String namePr;
private double dbl;
MyTask(String str) {
this.namePr = str;
}
@Override
protected Void doInBackground() throws Exception {
dbl = ((Double) table.getModel().getValueAt(1, 1))
- ((Integer) table.getModel().getValueAt(1, 2));
return null;
}
@Override
protected void done() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
table.getModel().setValueAt(dbl, 1, 3);
}
});
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
ChangeNotifiersOnEvent frame = new ChangeNotifiersOnEvent();
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.setLocation(150, 150);
frame.pack();
frame.setVisible(true);
}
});
}
}
import java.awt.*;
导入java.awt.event.ActionEvent;
导入java.util.Random;
导入java.util.concurrent.*;
导入javax.swing.*;
导入javax.swing.event.*;
导入javax.swing.table.DefaultTableModel;
公共类changeNotifierSoneEvent扩展JFrame实现Runnable{
私有静态最终长serialVersionUID=1L;
私有布尔runProcess=true;
私有随机=新随机();
私有javax.swing.Timer timerRun;
private Executor Executor=Executors.newCachedThreadPool();
私有字符串[]columnNames={“Source”、“Hit”、“Last”、“Ur_Diff”};
专用JTable表;
私有对象[][]数据={{“Swing Timer”,2.99,5,1.01},
{“Swing Worker”,7.10,5,1.010},{“TableModelListener”,25.05,5,1.01};
private DefaultTableModel=new DefaultTableModel(数据、列名);
公共ChangeNotifiersOnEvent(){
表=新JTable(型号){
私有静态最终长serialVersionUID=1L;
@凌驾
公共类getColumnClass(int列){
返回getValueAt(0,列).getClass();
}
};
addTableModelListener(新的TableModelListener(){
@凌驾
公共作废表已更改(TableModelEvent tme){
if(tme.getType()==TableModelEvent.UPDATE){
if(tme.getColumn()==1&&tme.getLastRow()==2){
double dbl=((double)table.getModel().getValueAt(2,1))
-((整数)table.getModel().getValueAt(2,2));
table.getModel().setValueAt(dbl,2,3);
}else if(tme.getColumn()==1&&tme.getLastRow()==0){
prepareUpdateTableCell();
}else if(tme.getColumn()==1&&tme.getLastRow()==1){
executor.execute(新的MyTask(MyTask.UPDATE_TABLE_COLUMN));
}
}
}
});
表3.设置行高(30);
表.setFont(新字体(“衬线”,Font.BOLD,20));
table.getColumnModel().getColumn(0).setPreferredWidth(180);
table.setPreferredScrollableViewportSize(table.getPreferredSize());
JScrollPane scrollPane=新的JScrollPane(表);
添加(滚动窗格,BorderLayout.CENTER);
新线程(this.start();
}
私有void prepareUpdateTableCell(){
timerRun=newjavax.swing.Timer(10,UpdateTableCell());
timerRun.setRepeats(假);
timerRun.start();
}
私有操作UpdateTableCell(){
返回新的AbstractAction(“更新表格单元格”){
私有静态最终长serialVersionUID=1L;
@凌驾
已执行的公共无效操作(操作事件e){
double dbl=((double)table.getModel().getValueAt(0,1))
-((整数)table.getModel().getValueAt(0,2));
table.getModel().setValueAt(dbl,0,3);
}
};
}
@凌驾
公开募捐{
while(运行进程){
试一试{
睡眠(250);
}捕获(例外e){
e、 printStackTrace();
}
changeTableValues();
}
}
私有void changeTableValues(){
Runnable doRun=new Runnable(){
@凌驾
公开募捐{
table.getModel().setValueAt(random.nextInt(128)+random.nextDouble(),0,1);
table.getModel().setValueAt(random.nextInt(256)+random.nextDouble(),1,1);
table.getModel().setValueAt(random.nextInt(512)+random.nextDouble(),2,1);
table.getModel().setValueAt(random.nextInt(128),0,2);
table.getModel().setValueAt(random.nextInt(128),1,2);
table.getModel().setValueAt(random.nextInt(128),2,2);
}
};
SwingUtilities.invokeLater(多伦);
}
私有类MyTask扩展SwingWorker{
私有静态最终字符串更新\u TABLE\u COLUMN=“UPDATE”;
私有字符串namePr;
私有双dbl;
MyTask(字符串str){
this.namePr=str;
}
@凌驾
受保护的Void doInBackground()引发异常{
dbl=((双精度)table.getModel().getValueAt(1,1))
-((整数)table.getModel().getValueAt(1,2));
返回null;
}
@凌驾
受保护的void done(){
SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
table.getModel().setValueAt(dbl,1,3);
}
});
}
}
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
ChangeNotifiersOnEvent框架=新的ChangeNotifiersOnEvent();
frame.setDefaultCloseOperation(关闭时退出);
帧设置位置(150150);
frame.pack();
frame.setVisible(true);
}
});
}
}
我想她的意思是,如果你不认真考虑你的代码