JavaFX线程问题

时间:2015-11-28 00:06:40

标签: java multithreading graphics javafx

我真的尽力不在这里寻求帮助,除非我非常渴望学校作业失败,成为一名新的编码员。话虽这么说,我花了最近3天试图找出线程问题。我试图在一个单独的包中实例化一个javafx类,并继续运行到可怕的“java.lang.IllegalStateException:仅在事件线程上允许此操作; currentThread = main”异常。

public static void printTemplateArray(char[] tmpArr,
        Set<Character> guesses) {
    char[] qMark = new char[tmpArr.length];
    for (int i = 0; i < tmpArr.length; i++) {
        if (tmpArr[i] == ' ') {
            qMark[i] = ' ';
        } else if (guesses.contains(tmpArr[i])) {
            qMark[i] = tmpArr[i];// copy already guessed char
        } else {
            qMark[i] = '?';
        }
    }

    System.out.print(qMark);
}

主要课程:

I have tried calling theGamePreBoard.start(new Stage()), which doesnt work, and i have also tried calling its start method during construction of that object with a new Stage() passed in during construction. Please help!!! 

How can i instantiate this PreBoard() class and get it's start method to run without throwing this?

PreBoard课程:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package battleship.model;
import battleship.viewcon.*;
import javafx.stage.Stage;

/**
 *
 * @author foolishklown
 */
public class MainApp {
    Player player1;
    Player player2;
    Board board1;
    Board board2;
    BattleshipGame theGame;
    PreBoard theGamePreBoard;     

    public void go() {                
        theGame = new BattleshipGame();        
        theGamePreBoard = new PreBoard();
        theGamePreBoard.start(new Stage());
        System.out.println(theGamePreBoard);
        theGamePreBoard.setBattleshipGame(theGame);         
    }

    public static void main(String[] args) {
        MainApp app = new MainApp();
        app.go();        
    }
}

1 个答案:

答案 0 :(得分:1)

我不认为这与线程有任何关系:我没有看到为什么你会在这个应用程序中创建另一个线程的任何原因。您似乎缺少的部分是JavaFX应用程序的实际生命周期。 (您可能需要了解JavaFX如何管理线程,但这里有点偶然。)

Application类代表整个应用程序。您的应用程序通常应该只有一个Application子类,以及该类的一个实例。当您调用静态Application.launch()方法时(或者从命令行执行Application子类时,JavaFX会为您创建实例,这会为您有效地调用launch)。

调用launch时,将启动JavaFX工具包(包括FX应用程序线程)。为您创建Application子类的实例,然后在FX应用程序线程上的该实例上调用start(...)

那么这意味着start(...)方法是JavaFX应用程序的入口点(启动)。由于这里最常见的事情是在窗口中显示某些内容,因此为方便起见,会将一个窗口(Stage)传递给此方法:但是如果您愿意,可以忽略它并创建自己的窗口。

典型的start(...)方法应该很短,并且通常只创建一些UI(可能在另一个类或FXML文件中定义),将该UI放在场景中,并在一个阶段中显示场景。在更复杂的应用程序中,您将在此处创建模型类的实例,创建一些视图和控制器,为控制器提供对模型的引用,以及组合视图。

对于一个简单的结构示例,请参阅我对Java: How do I start a standalone application from the current one when both are in the same package?的回答(我认为这是一个类似的问题)。