簡體   English   中英

SwingWorker doInBackground()不起作用

[英]SwingWorker doInBackground() doesn't work

在數據庫上執行某些任務時,我試圖顯示進度欄。 但是,進度欄凍結,並且我要在數據庫上執行的操作未執行。 我知道,為了確保Swing中的適當並發,我需要在輔助線程上執行數據庫任務。 我也了解我的錯誤與JOptionPane有關。 但是我無法提出解決方案。 這是“進度”對話框的代碼:

public class ProgressDialog extends JDialog {
/**
 * 
 */
    private static final long serialVersionUID = 1L;

    public ProgressDialog() {

        setModal(true);
        setTitle("Fortschritt");
        setSize(200, 100);
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);

        JProgressBar pb = new JProgressBar();
        pb.setIndeterminate(true);
        pb.setValue(0);
        add(pb);

        setVisible(true);
   }
}

這是我稱之為構造函數的代碼:

int result = JOptionPane.showConfirmDialog(GUIAutoTest.jtable,
    "Schaden mit Testkonfig = " + index + " anlegen ?", "Bestätigen",
    JOptionPane.YES_NO_OPTION);

if (result == JOptionPane.YES_OPTION) {
new SwingWorker<Void, Void>() {
    final  ProgressDialog pd = new ProgressDialog();
    @Override
    protected Void doInBackground() throws Exception {
        InitTestLauf itl;
        try {
            itl = new InitTestLauf(index);
            StartTestLauf stl = new StartTestLauf(itl.getIdTstLauf());
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void done() {
        System.out.println("done");
        pd.setVisible(false);
    }
}.execute();

JOptionPane.showMessageDialog(GUIAutoTest.jtable,
        "Schaden angelegt. " + "Schadennummer: " + StartTestLauf.getSchadenNr(),
        "Schaden angelegt", JOptionPane.PLAIN_MESSAGE);

沒關系,在doInBackground()塊內部發生了什么,甚至System.out.println(“ print something”)都沒有起作用。 我的錯誤在哪里?

提前致謝!

我舉了一個使用帶有對話框和swingworker的進度條的示例。

import javax.swing.JProgressBar;
import javax.swing.SwingWorker;
import java.util.List;

/**
 * Created on 13.06.17.
 */
public class DialogJunker {
    static class ProgressDialog extends JDialog {
        JProgressBar bar;
        ProgressDialog(){
            setModal(true);
            bar = new JProgressBar();
            add(bar);
            pack();
        }
        void setProgress(int i){
            bar.setValue(i);
        }
    }
    public static void main(String[] args){

        JFrame frame = new JFrame("diddly dialog");
        JButton button = new JButton("start");
        button.addActionListener(evt->{
            ProgressDialog log = new ProgressDialog();

            new SwingWorker<Void, Integer>(){
                @Override
                public Void doInBackground(){
                    for(int i = 0; i<100; i++){
                        try{
                            Thread.sleep(10);
                            publish(i);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    return null;
                }
                @Override
                public void done(){
                    log.setVisible(false);
                    log.dispose();
                }
                @Override
                protected void process(List<Integer> ints){
                    log.setProgress(ints.get(0));
                }


            }.execute();

            log.setVisible(true);

        });
        frame.add(button);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);

    }
}

此示例將顯示一個帶有進度條的對話框,該進度條將被更新,然后在完成時關閉該對話框。

在檢查完您的代碼后,我確實看到了問題。 您正在SwingWorker類中構造ProgressDialog ,但是將進度對話框設置為visible, 它會阻塞 請注意,我已經解決了很多問題。

  • 啟動揮桿工人后,我稱裝置可見。
  • 我發布結果,以便對話框實際得到更新。
  • 我保留對進度條的引用,因此實際上可以對其進行更新。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM