【问题标题】:Determine the fx:id of a pressed button确定按下按钮的 fx:id
【发布时间】:2017-12-21 09:36:02
【问题描述】:

我正在尝试设置三个不同按钮使用的方法。我想加载三个不同视图中的一个,具体取决于按下哪个视图。为此,我考虑将按钮本身作为参数传递。但我不能,因为 javaFX 无法识别带有新参数的方法。

如何获得来电者按钮的fx:id,以便区分它们?这就是我到目前为止所得到的。我只需要初始化pressed 变量,它就会做它的事情。

if (pressed == edgeModify){
    loader = new FXMLLoader(getClass().getResource("/digitalia/view/edgeView.fxml"));
} else if (pressed == sectionModify){
    loader = new FXMLLoader(getClass().getResource("/digitalia/view/sectionView.fxml"));
} else {
    loader = new FXMLLoader(getClass().getResource("/digitalia/view/LayerView.fxml"));
}

【问题讨论】:

  • 如果你想用不同的按钮动作做不同的事情,为什么不为每次按下按钮使用不同的按钮动作?
  • 我只是想,因为除了使用不同的 URL 之外,它可能会做完全相同的事情,我可以通过这种方式实现它。不过,单独做每一项可能会更容易。
  • @A.Gimeno 在这种情况下,您的不同处理程序可能只是单行方法,它们都调用一个通用方法,但将不同的 URL 作为参数传递。

标签: java button javafx


【解决方案1】:

你可以得到按钮的id如下:

Button btn = (Button) event.getSource();
String id = btn.getId();

更简单的方法是对按钮使用不同的处理程序。

【讨论】:

    【解决方案2】:

    为每个按钮使用不同的处理程序。看起来这很简单:

    @FXML
    private void loadEdgeView(ActionEvent event) {
        load("edgeView");
    }
    
    @FXML
    private void loadSectionView(ActionEvent event) {
        load("sectionView");
    }
    
    @FXML
    private void loadLayerView(ActionEvent event) {
        load("layerView");
    }
    
    private void load(String view) {
        FXMLLoader loader = new FXMLLoader("/digitalia/view/" + view + ".fxml");
        // ...
    }
    

    如果你真的想用一个方法来做到这一点,你可以利用按钮的userData;即:

    <Button text="Load Edge View" onAction="#loadView" userData="edgeView" />
    <Button text="Load Section View" onAction="#loadView" userData="sectionView" />
    <Button text="Load Layer View" onAction="#loadView" userData="layerView" />
    

    然后在控制器中:

    @FXML
    private void loadView(ActionEvent event) {
        Node node = (Node) event.getSource();
        String view = (String) node.getUserData();
        FXMLLoader loader = new FXMLLoader("/digitalia/view/" + view + ".fxml");
        // ...
    }
    

    我认为使用单独的处理程序更易于维护,而且冗长的代价很小。

    【讨论】:

      【解决方案3】:

      您可以像这样使用事件对象的来源:

      button.setOnAction(e -> {if (e.getSource() == button) System.out.println("button was pressed.");});
      

      在上面的示例中,您只需将pressede.getSource() 交换。

      【讨论】:

        【解决方案4】:
        @FXML void handleButtonAction(ActionEvent event) {
                Expression e = new Expression("");
        
                String eventString = event.toString();
                System.out.println(eventString);
                String[] cutAtId = eventString.split("id=");
                cutAtId = cutAtId[1].split(", ");
                eventString = cutAtId[0];
                System.out.println("eventString ===>>>" + eventString + "<<<<====");
        }
        

        【讨论】:

        • 虽然这可能有效,但它不如((Node) event.getSource()).getId() 好。此外,通常最好在代码之外添加一些解释性文本,而不是仅添加代码答案。
        猜你喜欢
        • 2012-08-29
        • 2019-08-28
        • 2015-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-09-24
        • 2013-10-17
        • 2010-12-05
        相关资源
        最近更新 更多