程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了为什么从不接收更改事件就永远不更改通知者大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决为什么从不接收更改事件就永远不更改通知者?

开发过程中遇到为什么从不接收更改事件就永远不更改通知者的问题如何解决?下面主要结合日常开发的经验,给出你关于为什么从不接收更改事件就永远不更改通知者的解决方法建议,希望对你解决为什么从不接收更改事件就永远不更改通知者有所启发或帮助;

我认为她的意思是,如果您不真正虑代码,那么可以引入无限循环。

大多数人在创建表时可能会使第1列,第2列可编辑,使第3列不可编辑,因为第3列仅是两列之间的区别。

因此,当他们编写tableModelListener时,他们将检查updatE事件,但忘记检查以查看更新了哪一列,因为他们认为该表不允许他们更新第3列。

他们忘记了,当tableModelListener更新第3列时,将生成另一个updatE事件,从而导致无限循环。当然,像您的示例一样,适当的编码将防止循环。

通常,它不应引起异常。

第二点是关于业务规则。业务规则应在一个地方定义,在这种情况下为模型。数据本身和数据更新应在一个地方进行。

解决方法

我发布了Java TableModelListener和Live FeedListener的答案?,但我收到– kLeopatra的评论

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.
@H_616_23@

可以告诉我什么是更改通知者,接收更改事件,可能发生的情况,她真正的意思,因为当我尝试所有我知道我只从非常快的循环中收到RepaintManager异常的事情时,

我再也没有例外

  • 我将其乘以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,1.010},{"TableModelListener",25.05,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,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(),1);
                table.getModel().SETVALueAt(random.nexTint(256) + random.nextDouble(),1,1);
                table.getModel().SETVALueAt(random.nexTint(512) + random.nextDouble(),1);

                table.getModel().SETVALueAt(random.nexTint(128),2);
                table.getModel().SETVALueAt(random.nexTint(128),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,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);
            }
        });
    }
}
@H_616_23@
                

大佬总结

以上是大佬教程为你收集整理的为什么从不接收更改事件就永远不更改通知者全部内容,希望文章能够帮你解决为什么从不接收更改事件就永远不更改通知者所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。