2014-11-12 7 views
1

У меня есть SplitMenuButton, и я не могу найти способ вызвать событие, когда пользователь нажимает на стрелку рядом с кнопкой.JavaFX Split Menu Button Arrow Trigger Event

Я бы хотел, чтобы выпадающий список заполнялся элементами из базы данных при нажатии стрелки вниз.

Я не уверен, какое событие может это сделать, и я не могу найти информацию об этом.

ответ

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

Отклонитесь, я не уверен, что это действительно хорошая идея. Соединения с базами данных - это, как правило, длительные процессы (т. Е. Достаточно долго, чтобы быть визуально заметными в среде пользовательского интерфейса). Если вы запустите это в потоке приложения FX, вы собираетесь заблокировать пользовательский интерфейс от выполнения чего-либо во время получения данных, и это также верно в тот момент, когда пользователь только что пытался что-то сделать. Конечно, если вы запустите его в качестве фоновой задачи, тогда в меню появится всплывающее окно с предыдущими данными, а затем будет обновлено после загрузки данных. Я бы рекомендовал найти способ заполнить это до того, как пользователь запросит его.

+0

База данных представляет собой локальную базу данных SQLite, в которой данные не передаются по сети. В основном это 'select * from table', который, вероятно, вернет менее 100 результатов –

0

«Стрелка» - это еще одна кнопка, отображающая всплывающее меню с элементами меню.

Одним из простых способов узнать, нажата ли эта кнопка со стрелкой, является прослушивание отображаемого свойства всплывающего окна.

Как только вы узнаете, что всплывающее окно появляется, вы можете добавить свои предметы.

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