2012-05-01 31 views
7

Có cách nào dễ dàng để ngăn chặn một accordion trong JavaFX 2.1 từ hoàn toàn sụp đổ? Tôi có một accordion với một vài mục nhưng nếu người dùng nhấp vào mục accordion hoạt động nó sụp đổ accordion.Ngăn chặn một accordion trong JavaFX từ sụp đổ

Tôi có thể sử dụng trình nghe nhấp chuột để kiểm tra xem có thực hiện kiểm tra và hành động tương ứng hay không nhưng điều này có vẻ đơn giản hơn việc thực hiện.

+1

Hiện nay, một yêu cầu tính năng trên JavaFX-jira cho điều này [# RT-28.141] (http://javafx-jira.kenai.com/browse/RT-28141) – drzymala

Trả lời

7

Thêm người nghe vào ngăn accordion hiện đang được mở rộng và ngăn người dùng thu gọn người dùng bằng cách sửa đổi thuộc tính có thể thu gọn của nó.

Đây là một ứng dụng mẫu:

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

Sử dụng tài sản sụp đổ vô hiệu hóa hoạt hình – Strassenrenner

2

Dưới đây là một giải pháp cho việc bảo đảm accordion sẽ không bao giờ hoàn toàn sụp đổ. Sự khác biệt từ câu trả lời ban đầu tuyệt vời của @ jewelsea là rất ít - tôi không thích thực tế là mũi tên xuống mặc định đã biến mất khỏi mặt accordion TitledPane mở, bởi vì thuộc tính "đóng mở" của nó đang được đặt thành false. Tôi đã chơi với nó nhiều hơn một chút để đạt được cảm giác "tự nhiên" hơn cho giao diện của mình.

/* 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); 
      }); 
     } 
    }); 
Các vấn đề liên quan