首页 文章

防止JavaFX中的手风琴崩溃

提问于
浏览
8

是否有一种简单的方法可以防止JavaFX 2.1中的手风琴完全折叠?我有一个带有一些条目的手风琴但是如果用户点击活动的手风琴入口,它会折叠手风琴 .

我可以使用鼠标点击监听器来检查检查并采取相应的行动,但这感觉它应该比完成更简单 .

2 回答

  • 8

    这是确保手风琴永远不会彻底崩溃的另一种解决方案 . 与@jewelsea的原始答案的区别很小 - 我不喜欢这样一个事实,即默认的向下箭头正从开放的手风琴TitledPane脸上消失,因为它的“可折叠”属性被设置为假 . 我玩了一下,为我的界面带来了更“自然”的感觉 .

    /* Make sure the accordion can never be completely collapsed */
        accordeon.expandedPaneProperty().addListener((ObservableValue<? extends TitledPane> observable, TitledPane oldPane, TitledPane newPane) -> {
            Boolean expand = true; // This value will change to false if there's (at least) one pane that is in "expanded" state, so we don't have to expand anything manually
            for(TitledPane pane: accordeon.getPanes()) {
                if(pane.isExpanded()) {
                    expand = false;
                }
            }
            /* Here we already know whether we need to expand the old pane again */
            if((expand == true) && (oldPane != null)) {
                Platform.runLater(() -> {
                    accordeon.setExpandedPane(oldPane);
                });
            }
        });
    
  • 4

    将侦听器添加到当前展开的折叠式窗格,并通过修改其可折叠属性来防止用户折叠它 .

    这是一个示例应用程序:

    import javafx.application.Application;
    import javafx.application.Platform;
    import javafx.beans.value.*;
    import javafx.scene.Scene;
    import javafx.scene.control.*;
    import javafx.scene.layout.*;
    import javafx.stage.Stage;
    
    public class AccordionSample extends Application {
      public static void main(String[] args) { launch(args); }
      @Override public void start(Stage primaryStage) {
        // create some titled panes to go in an accordion.
        TitledPane adminPane = new TitledPane("Animals", 
          VBoxBuilder.create().style("-fx-padding: 10").spacing(10).children(
            ButtonBuilder.create().text("Zebra").maxWidth(Double.MAX_VALUE).build(),
            ButtonBuilder.create().text("Shrew").maxWidth(Double.MAX_VALUE).build()
          ).build()            
        );
        TitledPane viewPane = new TitledPane("Vegetables", 
          VBoxBuilder.create().style("-fx-padding: 10").spacing(10).children(
            ButtonBuilder.create().text("Eggplant").maxWidth(Double.MAX_VALUE).build(),
            ButtonBuilder.create().text("Carrot").maxWidth(Double.MAX_VALUE).build()
          ).build()            
        );
    
        // create an accordion, ensuring the currently expanded pane can not be clicked on to collapse.
        Accordion accordion = new Accordion();
        accordion.getPanes().addAll(adminPane, viewPane);
        accordion.expandedPaneProperty().addListener(new ChangeListener<TitledPane>() {
          @Override public void changed(ObservableValue<? extends TitledPane> property, final TitledPane oldPane, final TitledPane newPane) {
            if (oldPane != null) oldPane.setCollapsible(true);
            if (newPane != null) Platform.runLater(new Runnable() { @Override public void run() { 
              newPane.setCollapsible(false); 
            }});
          }
        });
        for (TitledPane pane: accordion.getPanes()) pane.setAnimated(false);
        accordion.setExpandedPane(accordion.getPanes().get(0));
    
        // layout the scene.
        StackPane layout = new StackPane();
        layout.setStyle("-fx-padding: 10; -fx-background-color: cornsilk;");
        layout.getChildren().add(accordion);
        primaryStage.setScene(new Scene(layout));
        primaryStage.show();
      }
    }
    

相关问题