Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java gui中新线程的问题_Java_Multithreading_Swing_Sudoku - Fatal编程技术网

Java gui中新线程的问题

Java gui中新线程的问题,java,multithreading,swing,sudoku,Java,Multithreading,Swing,Sudoku,我有一个线程问题。。。我成功地启动了线程,程序执行了它应该执行的操作,但是它在gui的主绘图开始之前不会启动。 所以这里是我的代码 public void getFile() { Runnable r = new Runnable() { public void run() { viewTimeBar(); } }; try { JFileChooser fileChooser = new JFil

我有一个线程问题。。。我成功地启动了线程,程序执行了它应该执行的操作,但是它在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();
}
如果board size大于8,则runnable应该启动viewTimeBar,但它在printBoard方法运行之前不会绘制

有人能帮我吗


好心的问候,Henning

即使它是一个r也是一个
可运行的
run()
方法只是一个普通的方法。您需要启动一个线程来执行runnable

替换

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


Runnable#run()
是一种常规方法。如果像调用普通方法一样调用它,则会得到一个普通方法,即在当前线程中按顺序执行代码。使用Runnable#run()是什么意思?当前,使用r.run()调用该方法,其中r是可运行的。。事实上,当我现在测试时,如果我使用runnable或只是对viewTimeBar的常规方法调用,该方法将不会运行……他说runnable#run()表示方法签名。是的,这很聪明!程序仍然没有按应该的方式更新。。。viewTimeBar与printBoard一起运行:/Swing编程环境中,这是错误的建议-Swing不是线程安全的!使用
SwingWorker
SwingUtilities.invokeLater
我以前从未使用过这些工具。你能给我看看吗?程序应该是这样工作的;获取文件->如果(电路板大小>8)进度条应显示->进度条应消失,然后打印电路板请参阅有关使用
SwingWorker
类的一些指导。
    if(runSudoku.boardSize > 8) {
        new Thread(r).start();
    }