我有SplitMenuButton
,当用户点击按钮旁边的箭头时,我似乎找不到触发事件的方法。
我希望下拉列表在单击下拉箭头时填充数据库中的项目。
我不确定哪个事件可以做到这一点,我也找不到任何相关信息。
答案 0 :(得分:2)
简短回答:使用showing
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在检索数据时做任何事情,而且在用户刚尝试做某事时也是如此。当然,如果您将其作为后台任务运行,则菜单将弹出以前的数据,然后在下载数据后再更新。我建议在用户请求之前找到填充它的方法。
答案 1 :(得分:0)
&#39;箭头&#39;只是用于显示带有菜单项的弹出窗口的另一个按钮。
了解是否按下此箭头按钮的一种简单方法是收听弹出窗口的显示属性。
一旦您知道弹出窗口正在显示,您就可以添加项目。
@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();
}