我昨天在JavaFX中构建了一个小应用程序。我想在Controller类中获取应用程序的场景。每次我试图在控制器类中获取场景时,我都会出错。我可以在Controller类中的Button上设置OnKeyPested-method,工作正常。但是只有当按钮被选中时,它才工作正常...我可以只在Main类方法replace eSceneContent中获取场景。我已经读过这个问题了,但是我在初始化方法中调用getScene()-方法??感谢任何想法!
主要类别:
public class Main extends Application {
private Stage stage;
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
stage = primaryStage;
gotoMenu();
primaryStage.show();
}
public void gotoMenu() {
try {
MenuController menu = new MenuController();
menu = (MenuController) replaceSceneContent("Menu.fxml");
menu.setApp(this);
} catch (Exception ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}
private Node replaceSceneContent(String fxml) throws Exception {
FXMLLoader loader = new FXMLLoader();
@SuppressWarnings("resource")
InputStream in = Main.class.getResourceAsStream(fxml);
loader.setBuilderFactory(new JavaFXBuilderFactory());
loader.setLocation(Main.class.getResource(fxml));
BorderPane page;
try {
page = (BorderPane) loader.load(in);
} finally {
in.close();
}
page.setOnKeyPressed(event -> {
switch (event.getCode()) {
case F11:
if (stage.isFullScreen()) {
stage.setFullScreen(false);
} else {
stage.setFullScreen(true);
}
break;
default:
break;
}
});
Scene scene = new Scene(page);
page.prefWidthProperty().bind(scene.widthProperty());
page.prefHeightProperty().bind(scene.heightProperty());
stage.setScene(scene);
return (Node) loader.getController();
}}
控制器类:
public class MenuController extends BorderPane implements Initializable {
Main application;
@FXML
private Button button;
public void setApp (Main application) {
this.application = application;
}
@Override
public void initialize(URL location, ResourceBundle resources) {
button.getScene().setOnKeyPressed(e -> {
switch(e.getCode()) {
case A:
System.out.println("A pressed!");
break;
default:
break;
}
});
}}}
这是我应用程序的1.1版。我在setOnKeyPressed事件处理程序中添加了一个if子句。控制器初始化完成后,一个方法将布尔控制器运行设置为true。最后我删除了InputStream,它不需要了。
如果有人需要一个例子:
主要类别:
public class Main extends Application {
private Stage stage;
private boolean controllerRunning = false;
MenuController menu;
public void setControllerRunning(boolean controllerRunning) {
this.controllerRunning = controllerRunning;
}
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
stage = primaryStage;
gotoMenu();
primaryStage.show();
}
public void gotoMenu() {
try {
menu = new MenuController();
menu = (MenuController) replaceSceneContent("Menu.fxml");
menu.setApp(this);
menu.keyFunctions();
} catch (Exception ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}
private Node replaceSceneContent(String fxml) throws Exception {
FXMLLoader loader = new FXMLLoader();
loader.setBuilderFactory(new JavaFXBuilderFactory());
loader.setLocation(Main.class.getResource(fxml));
BorderPane page;
try {
page = (BorderPane) loader.load();
} finally {
}
page.setOnKeyPressed(event -> {
if (controllerRunning) {
switch (event.getCode()) {
case A:
menu.printA();
break;
default:
break;
}
}
switch (event.getCode()) {
case F11:
if (stage.isFullScreen()) {
stage.setFullScreen(false);
} else {
stage.setFullScreen(true);
}
break;
default:
break;
}
});
Scene scene = new Scene(page);
page.prefWidthProperty().bind(scene.widthProperty());
page.prefHeightProperty().bind(scene.heightProperty());
stage.setScene(scene);
return (Node) loader.getController();
}}
控制器类:
public class MenuController extends BorderPane{
Main application;
@FXML
private Button button;
public void setApp (Main application) {
this.application = application;
}
public void keyFunctions() {
application.setControllerRunning(true);
}
public void printA() {
System.out.println("A!");
}
}
你能做到的
private Node replaceSceneContent(String fxml) throws Exception {
FXMLLoader loader = new FXMLLoader();
loader.setBuilderFactory(new JavaFXBuilderFactory());
loader.setLocation(Main.class.getResource(fxml));
BorderPane page = loader.load();
MenuController controller = loader.getController();
page.setOnKeyPressed(event -> {
switch (event.getCode()) {
case F11:
if (stage.isFullScreen()) {
stage.setFullScreen(false);
} else {
stage.setFullScreen(true);
}
break;
default:
break;
}
});
Scene scene = new Scene(page);
scene.setOnKeyPressed(event -> {
if (event.getCode() == KeyCode.A) {
controller.printA();
}
});
page.prefWidthProperty().bind(scene.widthProperty());
page.prefHeightProperty().bind(scene.heightProperty());
stage.setScene(scene);
return controller ;
}
具有
public class MenuController extends BorderPane{
// existing code...
public void printA() {
System.out.println("A!");
}
}
只是一个注释:MenuController
作为BorderPane
(或任何其他UI类)的子类是毫无意义的。我留了下来,以防你在其他地方需要它,但它完全违反了MVC模式。
此外,我不太清楚为什么你希望A
的密钥处理程序出现在场景中,而F11的密钥处理程序出现在场景的根目录中。看来这两个都应该在现场登记。但我还是把问题留给了你。
问题内容: 我昨天在JavaFX中构建了一个小应用程序。我想在Controller类中获取应用程序的场景。每次尝试在控制器类中获取场景时,都会出错。我可以在Controller类的Button上设置OnKeyPressed方法,效果很好。但是,只有在选择Button后,它才能正常工作。我只能在Main类方法replaceSceneContent中获得场景。我已经读过这个问题,但是我在initial
为什么我不能在这里回复一个糟糕的请求?在其他例子中,它工作得很好。
核心问题:如果绑定属性在声明绑定属性的方法之外更新,则对象无效侦听器不会触发。 以JavaFX UI控制器类中声明的方法为例: 如您所见,我声明了一个,它依赖于TextField的text属性,称为,并声明了一个,它在无效时请求计算。 如果我在initialize方法中编辑值,则会触发和更改侦听器,而如果我从UI编辑值,则只会触发更改侦听器。 有人能解释一下为什么会这样吗?
目标是打印标签的当前文本。标签在整个程序中不断变化,使用当前的方法,我只能检索标签的初始化值。 我用来检索控制器实例的内容:
问题内容: 我的代码中有一个ajax调用。我想通过通话实现的效果很好。我想从数据库中删除一些记录,当通过ajax调用该方法时,该记录实际上被删除了,但是就像在symfony方法中,它必须返回一个响应,这就是为什么当执行该方法时会给我错误 我的Ajax电话是 而执行的方法是 我如何从该方法成功返回?有任何想法吗?谢谢 问题答案: 替换为。也不要忘记在顶部写。
我正在使用Spring形式。我只需要得到Staemap作为响应,但我得到的是整个jsp页面作为响应。