Java 扩展Swing组件以在EDT上运行

Java 扩展Swing组件以在EDT上运行,java,swing,Java,Swing,对于JavaSwing组件,扩展和重写它们的构造函数和调用以确保它们总是在事件调度线程上执行,这是一个好主意吗 @Override public void setBackground(final Color c) { if(SwingUtilities.isEventDispatchThread()) { super.setBackground(c); } else { //Force it to run on EDT through invoke

对于JavaSwing组件,扩展和重写它们的构造函数和调用以确保它们总是在事件调度线程上执行,这是一个好主意吗

@Override
public void setBackground(final Color c) {
    if(SwingUtilities.isEventDispatchThread()) {
        super.setBackground(c);
    } else {
        //Force it to run on EDT through invokeAndWait or invokeLater
    }
}
还有(愚蠢的问题);如果我在EDT中运行一个新的Runnable,它的run调用是否正常执行(传统的自顶向下)


这是向后看的。您应该测试使Swing调用与Swing GUI类本身无关的代码。您的第二位代码毫无意义,因为它一无所获。@HovercraftFullOfEels在Swing组件本身中执行还是创建这样做的扩展组件是一种好做法?我的观点是,如果开发人员不能正确地将内容放入正确的线程中,那么它会鼓励懒惰的编码。第二个代码也让我感到困惑,因为我看到它在第一个代码的else块中被调用。我只是想再次检查一下,它没有做任何特殊的事情,比如最后调用run或者其他什么(invokeLater),你不需要这样做。构建swing组件可以在任何线程上完成——对update/paint和其他一些组件的调用必须在swing事件线程上完成。第二点:您只是在构建一个可运行对象并调用run方法。你不是在开玩笑Thread@JochenBedersdorferswing组件的构造不调用paint吗?特别是当我传入数据模型时?我记得这里有一些问题和建议,它们应该在EDT中构造。@JochenBedersdorfer不,这是错误的。
@Override
public void actionPerformed(ActionEvent e) {
    Runnable r = new Runnable() {
        public void run() {
            // Update buttons
        }
    }
    r.run(); // Just runs
}