在swing组件和工作线程之间传递数据

时间:2014-09-03 17:04:30

标签: java multithreading swing

我正在尝试确定在swing组件和线程之间传递数据和更新的最佳方法。以下是我面临的一个例子

这是用户与之互动的主要窗口,它包含JTabbedPanelJPanel作为选项卡式面板的标签。它还包含一个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");
        }
    }
}

我的问题是。

  1. 可以JSortPanel安全地致电mainView.newStatus()吗?它是否只能在事件处理程序的范围内调用它,例如当用户单击doSort按钮时?

  2. 可以SortThread安全地致电mainView.newStatus()吗?那个电话会在Swing EDT上吗?

  3. 可以SortThread调用mainView.getCurData()并安全地获取返回值,我认为它也是基于前一个问题的答案而在EDT上?

    < / LI>
  4. 如果所有电话都在EDT上,您能否举一个不在EDT上的电话示例?

  5. 如果JSortPanelSortThread中的任何一个或两者都无法安全地呼叫mainView.newStatus(..),那么他们怎么办?

1 个答案:

答案 0 :(得分:1)

在屏幕/其他设备上显示组件之前,通常可以安全地进行多线程处理。显示组件后,应通过SwingWorker或SwingUtilities.invokeLater在UIThread上完成所有更改