我有MenuBar
和ToolBar
的应用程序。我在ControlsFX文档中发现,可以在不同的类中定义动作事件逻辑,并将其分配给按fxml定义的按钮,menuitems和togglebuttons。或多或少像php框架中的路由器(例如laravel)。
以下是说明
JavaFX中的操作可用于将功能和状态与控件分开。例如,如果您有两个或更多控件执行相同的功能(例如,一个在菜单中,另一个在工具栏上),请考虑使用Action对象来实现该功能。 Action对象提供动作 - 事件触发组件(如按钮,菜单项等)的集中处理。动作可以处理的状态包括文本,图形,长文本(即工具提示文本)和禁用。
问题是我无法获得足够的信息在我的应用程序中使用它。这是我到目前为止的一个简单例子
public class RootController implements Initializable {
@FXML
private MenuItem menuOne;
@FXML
private MenuItem menuTwo;
@FXML
private MenuItem menuThree;
@FXML
private Button tbOne;
@FXML
private Button tbTwo;
@FXML
private Button tbThree;
@Override
public void initialize(URL url, ResourceBundle rb) {
// TODO
}
}
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Menu?>
<?import javafx.scene.control.MenuBar?>
<?import javafx.scene.control.MenuItem?>
<?import javafx.scene.control.ToolBar?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.VBox?>
<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1">
<top>
<VBox BorderPane.alignment="CENTER">
<children>
<MenuBar>
<menus>
<Menu mnemonicParsing="false" text="File">
<items>
<MenuItem fx:id="menuOne" mnemonicParsing="false" text="One" />
</items>
</Menu>
<Menu mnemonicParsing="false" text="Edit">
<items>
<MenuItem fx:id="menuTwo" mnemonicParsing="false" text="Two" />
</items>
</Menu>
<Menu mnemonicParsing="false" text="Whatever">
<items>
<MenuItem fx:id="menuThree" mnemonicParsing="false" text="Three" />
</items>
</Menu>
</menus>
</MenuBar>
<ToolBar prefHeight="40.0" prefWidth="200.0">
<items>
<Button fx:id="tbOne" mnemonicParsing="false" text="One" />
<Button fx:id="tbTwo" layoutX="10.0" layoutY="13.0" mnemonicParsing="false" text="Two" />
<Button fx:id="tbThree" layoutX="66.0" layoutY="13.0" mnemonicParsing="false" text="Three" />
</items>
</ToolBar>
</children>
</VBox>
</top>
</BorderPane>
public class MainApp extends Application {
public static void main(String[] args) throws Exception {launch(args); }
public void start(Stage stage) throws Exception {
FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/root.fxml"));
loader.setController(new RootController());
Scene scene = new Scene((Parent)loader.load(), 400, 200);
stage.setTitle("ControlFX Action API");
stage.setScene(scene);
stage.show();
}
}
public class AppRouter {
public AppRouter(){
ActionMap.register(this);
}
public void testOne(){
System.out.println("testOne");
}
public void testTwo(){
System.out.println("testTwo");
}
public void testThree(){
System.out.println("testThree");
}
}
我的问题是如何将AppRouter
中的方法分配到RootController
我也很乐意接受另一个替代答案。
答案 0 :(得分:0)
假设您将在中创建一个
AppRouter
类的实例Application
类:
public class MainApp extends Application {
AppRouter appRouter = new AppRouter(); //here................
public static void main(String[] args) throws Exception {launch(args); }
public void start(Stage stage) throws Exception {
FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/root.fxml"));
loader.setController(new RootController());
Scene scene = new Scene((Parent)loader.load(), 400, 200);
stage.setTitle("ControlFX Action API");
stage.setScene(scene);
stage.show();
}
}
然后你可以有一个接受
AppRouter
的方法FXMLController
:
public class RootController implements Initializable {
@FXML
private MenuItem menuOne;
@FXML
private MenuItem menuTwo;
@FXML
private MenuItem menuThree;
@FXML
private Button tbOne;
@FXML
private Button tbTwo;
@FXML
private Button tbThree;
@Override
public void initialize(URL url, ResourceBundle rb) {
// TODO
}
public void acceptRouter(AppRouter router){
//register or call router methods here
}
}
如何将刚创建的控制器导入
MainApp
类?
FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/root.fxml"));
loader.setController(new RootController());
RootController controller = loader.getController(); //simple as this,although check the method name if it is the same cause i added this from phone
controller.acceptRouter(appRouter);