Java gui中新线程的问题
我有一个线程问题。。。我成功地启动了线程,程序执行了它应该执行的操作,但是它在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
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();
}