Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在线程中启动doLayout()怎么样?_Java_Multithreading_Swing - Fatal编程技术网

Java 在线程中启动doLayout()怎么样?

Java 在线程中启动doLayout()怎么样?,java,multithreading,swing,Java,Multithreading,Swing,你怎么看待这样的事情: public class HeavyJTable extends JTable implements Runnable { public HeavyJTable (AbstractTableModel m) { super(m); /* .... */ this.setAutoResizeMode(AUTO_RESIZE_OFF); this.setFillsViewportHeight(false); } @Override publi

你怎么看待这样的事情:

public class HeavyJTable extends JTable implements Runnable {
public HeavyJTable (AbstractTableModel m) {
    super(m);
    /* .... */
    this.setAutoResizeMode(AUTO_RESIZE_OFF);
    this.setFillsViewportHeight(false);
}

@Override
public void run() {
    final TableColumnModel columnModel = this.getColumnModel();
    int width = 60;
    for (int column = 0; column < this.getColumnCount(); column++) {
        TableCellRenderer renderer = this.getCellRenderer(0, column);
        Component comp = this.prepareRenderer(renderer, 0, column);
       if(comp == null)
            continue;
        width = Math.max(comp.getPreferredSize().width + 1, width);
        columnModel.getColumn(column).setPreferredWidth(width);
    }
    super.doLayout();
}

@Override
public void doLayout() {
    if (getColumnModel().getTotalColumnWidth() == getWidth()) { 
        return; //filter some useless refreshes
    } else
        new Thread(this).start();
}
公共类HeavyJTable扩展了JTable实现Runnable{
公共重表(抽象表模型m){
超级(m);
/* .... */
此.setAutoResizeMode(自动调整大小关闭);
此.setFillsViewPerthweight(false);
}
@凌驾
公开募捐{
final TableColumnModel columnModel=this.getColumnModel();
整数宽度=60;
for(int column=0;column
}

上下文:我在
JTabbedPane
的不同选项卡中有几个
JTable
,它们单独监听更新/插入/删除和更新自己的数据。所有这些表都可以通过微调器调整大小。因此,需要大量数据和大量刷新

所以我想把所有的绘画过程放在另一个线程中(每个可感知的部分都受到信号量的保护)


你觉得这个怎么样?还有其他更好的选择吗?我在考虑的是
SwingWorkers
。或者在不同的线程池中运行一组
doLayout()

Swing不是线程安全的,您不应该做任何(直接或间接)会从事件调度线程上下文之外更新或更改UI的事情。有关更多详细信息,请参阅

所以我想把所有的绘画过程放在另一个线程中(每个可感知的部分都受到信号量的保护)

不,绘画不是这样的。绘制始终在事件调度线程的上下文中完成(绘制事件排队到
EventQueue
)。有关更多详细信息,请参阅

上下文:我在JTabbedPane的不同选项卡中有几个JTable,它们单独监听更新/插入/删除和更新自己的数据。所有这些表都可以通过微调器调整大小。因此,需要大量数据和大量刷新

将数据的管理与视图分开。使用后台线程从EDT加载数据,然后在结果完成后重新同步

你觉得这个怎么样?还有其他更好的选择吗?我想的是荡秋千的人。或者在不同的线程池中运行一组doLayout()


SwingWorker
将是一个更好的解决方案,但您可以使用它来加载数据(在
doInBackground
方法中)并通过
过程
/
发布
功能或
完成
方法更新UI,具体取决于您的需要

是的,这就是为什么我问您有什么建议。我有一台基本的电脑,即使没有渲染,我的主线程也很忙,程序也需要其他服务和资源。因此,我不认为这是一个问题,在这种情况下,为表的视图指定一个线程还为时过早。担心设计/可管理性。如果你担心内存/性能,请评测你的应用程序,看看是否有什么需要担心的Hanks Vince,我会检查评测。但我已经在逻辑优化上花了很多时间。我非常确定,当我查看堆栈时,它来自视图。有没有办法跳过X
doLayout()
per
JTable
?Swing不是线程安全的——“所以我想把所有的绘制过程放到另一个线程中”——无法完成,这不是绘制工作的方式。重点是在EDT外部加载数据(使用
SwingWorker
s)并从EDT内部更新UI