gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:06:18 25 4
gpt4 key购买 nike

您对这样的事情有何看法:

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();
}

}

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

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

你对此有何看法?还有其他更好的选择吗?我正在考虑 SwingWorkers。或者在不同的线程池中运行doLayout()组。

最佳答案

Swing 不是线程安全的,您永远不应该(直接或间接)执行任何会从事件调度线程上下文外部更新或更改 UI 的操作。请参阅Concurrency in Swing了解更多详情

So I wanted to put all the painting process in another thread (each sensible part is protected by semaphores).

不,这不是绘画的原理。绘制始终在事件调度线程的上下文中完成(绘制事件排队到 EventQueue 中)。请参阅Painting in AWT and Swing了解更多详情

The context : I have several JTable in a differents tabs of a JTabbedPane that listen updates/inserts/deletes and updates their own data alone. All those table are resizeable from a spinner. So it's a lot of data and a lot of refreshes.

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

What do you think about this ? Is there any other better options ? I'm thinking about SwingWorkers. Or running sets of doLayout() in different pools of thread.

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

关于java - 在线程中启动 doLayout() 怎么样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34710458/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com