ControlFX动作用法

时间:2016-10-04 17:12:35

标签: javafx-8 controlsfx

我有MenuBarToolBar的应用程序。我在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
}
}

root.fxml

<?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();
}
}

AppRouter

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

中的按钮和菜单项

更新

我也很乐意接受另一个替代答案。

1 个答案:

答案 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);