有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JavaFX拆分菜单按钮箭头触发事件

我有一个SplitMenuButton,当用户单击按钮旁边的箭头时,我似乎找不到触发事件的方法

我希望在单击下拉箭头时,下拉列表中填充数据库中的项目

我不确定哪个活动可以做到这一点,我也找不到任何关于这一点的信息


共 (2) 个答案

  1. # 1 楼答案

    简短回答:用^{} property注册一个侦听器

    import javafx.application.Application;
    import javafx.beans.property.IntegerProperty;
    import javafx.beans.property.SimpleIntegerProperty;
    import javafx.scene.Scene;
    import javafx.scene.control.MenuItem;
    import javafx.scene.control.SplitMenuButton;
    import javafx.scene.layout.BorderPane;
    import javafx.stage.Stage;
    
    public class SplitMenuButtonTest extends Application {
    
        @Override
        public void start(Stage primaryStage) {
    
            IntegerProperty count = new SimpleIntegerProperty();
    
            SplitMenuButton splitMenuButton = new SplitMenuButton();
            splitMenuButton.setText("Action");
            splitMenuButton.showingProperty().addListener((obs, wasShowing, isNowShowing) -> {
                if (isNowShowing) {
                    int c = count.get() + 1;
                    count.set(c);
                    splitMenuButton.getItems().clear();
                    for (int choice = 1; choice <= 3; choice++) {
                        MenuItem mi = new MenuItem("Choice "+choice+" (" + c + ")");
                        splitMenuButton.getItems().add(mi);
                    }
                }
            });
    
            BorderPane root = new BorderPane(null, splitMenuButton, null, null, null);
            primaryStage.setScene(new Scene(root, 350, 150));
            primaryStage.show();
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    }
    

    顺便说一句,我不确定这真的是个好主意。数据库连接通常是长时间运行的过程(即,足够长,在UI环境中可以在视觉上看到)。如果您在FX应用程序线程上运行这个程序,那么在检索数据时,您将阻止UI执行任何操作,而且在用户刚刚尝试执行某些操作时也是如此。当然,如果您将其作为后台任务运行,则菜单将弹出以前的数据,然后在下载数据后更新。我建议在用户请求之前找到一种填充方法

  2. # 2 楼答案

    “箭头”只是另一个按钮,用于显示带有菜单项的弹出窗口

    一个简单的方法是通过收听弹出窗口的显示属性来判断是否按下了这个箭头按钮

    一旦你知道弹出窗口出现,你可以添加你的项目

    @Override
    public void start(Stage primaryStage) {
        SplitMenuButton m = new SplitMenuButton();
        m.showingProperty().addListener((ov,b,b1)->{
            if(b1){
                System.out.println("popup visible");
                MenuItem menuItem = new MenuItem("New Option");
                if(m.getItems().stream().noneMatch(i->i.getText().equals(menuItem.getText()))){
                    menuItem.setOnAction(e -> System.out.println("New Option added"));
                    m.getItems().add(menuItem);
                }
            }
        });
        m.setText("Click the arrow ->");                
        m.getItems().add(new MenuItem("First option"));
    
        StackPane root = new StackPane(m);
        Scene scene = new Scene(root, 300, 250);
        primaryStage.setScene(scene);
        primaryStage.show();
    }