Java SwingWorker无法按预期工作

时间:2017-02-03 21:50:25

标签: java swing swingworker

我正在编写一个程序,我将名称与列表匹配。如果我没有匹配,我会在SQLite DB上查找名称,将名称信息提取到文本字段中,然后显示卡片(cardlayout)。当我运行这个时,我只获得了最后一次不匹配的信息。在研究这个时,我想我可以使用SwingWorker解决这个问题。我把我的do-while放在一个SwingWorker类中并添加了一个publish(),我想在那里显示信息。我得到相同的结果,只显示最后一个不匹配。

以下是我的代码片段:

   public class processTeeTimes extends SwingWorker <Integer, String>
    {

        @Override
        protected Integer doInBackground() throws Exception
        {
       //   Process all tee times foursome at a time

            String memberGuest;                                     // Member or guest
            do                                                      // Process players in foursome
            {

                .
                .
                .


                    if (!firstOnGHIN())
                    {
                        System.out.print("No match - first (" + tsTime + "): ");
                        printGolfer();                      // Print no match
                        publish(golfer[0]);

                    }

                .
                .
                .

            }
            while (!EOF)


        }

        @Override
        protected void process(List<String> golferList)
        {
            for (int gIndex = 0; gIndex < golferList.size(); gIndex++)
            {
                textFieldRMLast.setText(golferList.get(gIndex));
                cards.show(panelCont, ROSTERMAINT); // Show roster maint card
            }
        }

        @Override
        protected void done()
        {
            .
            .
            .

            System.out.println("All done processing Tee Sheet");
        }

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:4)

  

我得到相同的结果,只显示最后一次不匹配。

因为这就是您的代码似乎正在做的事情:

for (int i = 0; i < n; i++)

您将数据放入JTextField,遇到更多数据时,它会立即用新文本替换以前的文本。如果要显示多行数据,则应使用显示多行数据的组件,例如JList或JTable。

如果您希望在JTextField中查看数据之间有延迟,请考虑在 @Override protected void process(List<String> golferList) { for (int gIndex = 0; gIndex < golferList.size(); gIndex++) { textFieldRMLast.setText(golferList.get(gIndex)); cards.show(panelCont, ROSTERMAINT); // Show roster maint card } } 方法中调用的do-while循环中放置Thread.sleep(...)。不要在上面的for循环中放置doInBackground(),因为上面的代码是在Swing事件线程上调用的。

请注意,如果此答案没有回答您的问题,那么是的,您需要创建并发布有效的MCVE