gui中新线程的问题

时间:2014-04-04 09:12:58

标签: java multithreading swing sudoku

我遇到线程问题...我设法启动线程并且程序执行它应该执行的操作,但它不会启动直到gui启动的主画。 所以这是我的代码;

public void getFile() {
    Runnable r = new Runnable() {
        public void run() {
            viewTimeBar();
        }
    };

    try {
        JFileChooser fileChooser = new JFileChooser();
        int returnVal = fileChooser.showOpenDialog(this);
        if(returnVal == JFileChooser.APPROVE_OPTION) {
            runSudoku = new RunSudoku(fileChooser.getSelectedFile().getName(), 0);
        }
        if(runSudoku.boardSize > 8) {
            r.run();
        }
        runSudoku.runBoard();

        printBoard(runSudoku.sudokuBoard, 0);
        getNextSolution.setText("Solutions: " + (runSudoku.validBoards.size()) + ", press get solution");
        getSolution.setEnabled(true);

    } catch(Exception e) {
        printError();
    }
}

public void viewTimeBar() {
    if(sudokuPanel != null) {
       remove(sudokuPanel);
    }

    JPanel timer = new JPanel();
    JLabel pleaseWait = new JLabel("Please wait while we try to find solutions!", SwingConstants.CENTER);
    timer.add(pleaseWait, BorderLayout.NORTH);

    JProgressBar progressBar = new JProgressBar();
    progressBar.setSize(10, 400);
    progressBar.setIndeterminate(true);
    progressBar.setStringPainted(true);
    timer.add(progressBar, BorderLayout.CENTER);
    timer.setVisible(true);
    add(timer, BorderLayout.SOUTH);
    validate();
}

如果电路板尺寸大于8,则可运行的shoud启动viewTimeBar,但它不会绘制,直到printBoard方法运行。

任何可以帮助我的人?​​

亲切的问候,亨宁

1 个答案:

答案 0 :(得分:1)

即使它是一个Runnablerun()方法也只是一种常规方法。你需要启动一个执行runnable的线程。

替换

    if(runSudoku.boardSize > 8) {
        r.run();
    }

通过

    if(runSudoku.boardSize > 8) {
        new Thread(r).start();
    }