我正在尝试确定在swing组件和线程之间传递数据和更新的最佳方法。以下是我面临的一个例子
这是用户与之互动的主要窗口,它包含JTabbedPanel
个JPanel
作为选项卡式面板的标签。它还包含一个JTextPane
,用于向用户显示一些信息。
public class MainView extends JFrame
{
JTextPane m_jtOutput;
JTabbedPane m_jtpTabs;
JSortPanel m_jpSortTab;
public LinkedList<DataPoint> data;
DataPoint curPoint;
public MainView()
{
m_jtpTabs = new JTabbedPane();
m_jpSortTab = new JSortPanel(this);
m_jtpTabs.addTab("Sort", m_jpSortTab);
this.add(m_jtpTabs);
this.add(m_jtOutPut);
}
public void newStatus(String inStat)
{
m_jtOutput.setText(inStat);
}
public DataPoint getCurPoint()
{
return curPoint;
}
}
这是主视图中JTabbedPanel
中显示的JPanel。它有一个工作线程,可以对数据进行一些排序。它还会对主视图输出文本窗格进行一些更新。
public class JSortPanel extends JPanel
{
JButton doSort;
MainView mainVw;
SortThread sortThread;
public JSortPanel(MainView inView)
{
mainVw = inView;
this.add(doSort); // also get the listener hooked up
sortThread = new SortThread(mainView);
}
public void doSortClicked(EventArgs e)
{
sortThread.start();
mainView.newStatus("Started sorting");
}
}
这是排序线程。它最初从主视图中读取数据,然后对其进行排序,定期将一些信息写入主视图文本窗格,以了解排序状态。
public class SortThread extends Thread
{
MainView mainVw;
LinkedList<DataPoint> data;
public SortThread(MainView inView)
{
mainVw = inView;
System.out.println("Cur data " + mainView.getCurData());
}
public void run()
{
data = mainVw.data;
while(true)
{
doASortingStep(data);
mainVw.newStatus("Did a sorting step");
}
}
}
我的问题是。
可以JSortPanel
安全地致电mainView.newStatus()
吗?它是否只能在事件处理程序的范围内调用它,例如当用户单击doSort
按钮时?
可以SortThread
安全地致电mainView.newStatus()
吗?那个电话会在Swing EDT上吗?
可以SortThread
调用mainView.getCurData()
并安全地获取返回值,我认为它也是基于前一个问题的答案而在EDT上?
如果所有电话都在EDT上,您能否举一个不在EDT上的电话示例?
如果JSortPanel
和SortThread
中的任何一个或两者都无法安全地呼叫mainView.newStatus(..)
,那么他们怎么办?
答案 0 :(得分:1)
在屏幕/其他设备上显示组件之前,通常可以安全地进行多线程处理。显示组件后,应通过SwingWorker或SwingUtilities.invokeLater在UIThread上完成所有更改