我正在用Java编程模拟器应用程序。有3个不同的类别。这些类中的某些更改必须更改GUI中的TextField(由SceneBuilder创建)。在gui中单击按钮,必须更改类中的对象。我使用SceneBuilder
制作了GUI,我知道如何使用Controller类。
有什么方法可以对对象类中的FXML
使用控制器类来填充TextField中的文本?像这样:
@Override
public void run() {
while (0 != 1) {
if (!stack.isEmpty())
controls.settfAI("INFECTED"); //controls is FXML controller // settfAI is id of text field
try {
sleep(3000);
} catch (InterruptedException e) {
CCLogger.cclogger(Watchman.class.getName(),Level.INFO,e);
}
}
}
第二个问题,当我单击按钮时,可以编写控件类中对象的更改吗?像这样:
@FXML
Button btnOne; //btnOne is id in SceneBuilder file
//...
// AmbulanceCar ambulanceCar=new AmbulanceCar();
public void clicked() {
ambulanceCar.go(); // send ambulance car in some location
}
我的程序有很多按钮和3个TextField,必须更改模拟器的状态。
更新: 我有城市和搬家的人。当人被感染时,Watchman必须在TextField中看到人的位置。我有带按钮和文本字段的fxml。我知道Watchman类必须具有fxml的Controler。我得到了控制者
Parent watchBtns = FXMLLoader.load(getclass().getResource("ControlGUI.fxml"));
URL contronLinkUrl=Paths.get("/ControlGUI.fxml").toUri().toURL();
FXMLLoader loader=FXMLLoader.load(contronLinkUrl);
然后,我将Controler发送给Watchman类,
city.getWatchman().setControler(loader.getcontroller());
在Watchman类中,我尝试使用以下代码编辑TextField:
public void setControler(ControlerControlGUI controlGUI)
{
controlerControlGUI=controlGUI;
System.out.println("Controler set!");
}
@Override
public void run()
{
System.out.println("Watchman started!");
while(0!=1)
{
try {
if(!stack.isEmpty())
{
controlerControlGUI.settfAI("INFECTED");
}
sleep(3000);
} catch (InterruptedException e) {
CCLogger.cclogger(Watchman.class.getName(),e);
}
}
}
现在我出错了
由以下原因引起:java.lang.ClassCastException:类javafx.scene.layout.AnchorPane无法转换为类javafx.fxml.FXMLLoader(javafx.scene.layout.AnchorPane位于加载程序“ app”的模块javafx.graphics中; javafx.fxml.FXMLLoader在加载程序'app'的模块javafx.fxml中
更新,如果下面的回答对您来说很复杂... 在控制器类中,您可以放置要控制的对象。就我而言,是这样的:
Person infectedPerson;
Ambulance ambulance;
//call in main function
public void setInfectedInfo(Person person,Ambulance amb)
{
infectedPerson=person;
ambulance=amb;
}
在另一个类中,我将这段代码用于为fxml和class设置相同的控制器,这两个控制器都将使用它们
Stack<Alarm> stack= new Stack<>();
Vector<Ambulance> ambulances=new Vector<>();
ControlerControlGUI controlerControlGUI;
public void setControler(ControlerControlGUI controlGUI)
{
controlerControlGUI=controlGUI;
}
在主类中,您可以放置:
FXMLLoader loader=new
FXMLLoader(getclass().getResource("ControlGUI.fxml"));
Parent watchBtns=loader.load();
city.getWatchman().setControler(loader.getcontroller());
watchBtns.setLayoutX(840);
watchBtns.setLayoutY(100);
groupCity.getchildren().add(watchBtns);
我将尝试解释最后的代码部分。首先,使用已定义控制器的fxml文件制作FXMLLoader。然后,您加载它。 (如果您不调用load(),将无法使用)。之后,您必须调用getcontroller才能在函数中具有相同的控制器,并且可以从外部调用控制器功能来控制GUI部分。