2015-06-26 2 views
2

Есть ли решение отключить узел в javaFX без отключения его дочерних элементов? Я хочу отключить все узлы в панели, кроме одного из них динамически. Я пробовал это решение и другие решения вроде этого, но не работает, и я также думаю, что он имеет плохую производительность!отключение узла без отключения его дочерних элементов в javafx

node.getParent().requestFocus(); 
    for(int i=0 ; i<pane.getChildren().size() ; i++){ 
     if(!pane.getChildren().get(i).isFocused()){ 
      pane.getChildren().get(i).setDisable(true); 

     } 

    } 

Отредактировано:

также я попытался это решение: Я добавил прозрачную панель к главной боли, а затем добавить специальный узел к нему. Но он не работает для сложных компонентов, потому что я должен хранить размеры и расположение своих детей!

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

+2

Я не вижу использования, где вы хотите отключить его родительский узел и включить дочерний узел. Можете ли вы объяснить сценарий, что ваша сторона? – Hareesh

+0

Что значит? –

+0

Я хочу, чтобы этот пользователь просто взаимодействовал с одним из узлов в сцене. Каждый узел, который я хочу! –

ответ

1

Ток Javadoc из BooleanProperty disableProperty() Узла говорит:»...... Настройка отключения истина заставит этот узел и любые подузлы стать инвалидами .......

https://docs.oracle.com/javase/8/javafx/api/javafx/scene/Node.html#setDisable-boolean-

https://docs.oracle.com/javase/8/javafx/api/javafx/scene/Node.html#disableProperty

Так вы не можете отключить один узел без своих детей.

+3

Просто потому, что это невозможно с 'disableProperty', это не значит, что это невозможно каким-либо другим способом. – Lii

0

Ниже приведен пример, как мы можем это сделать. Его просто маленький образец. Если вы вошли в любое из панелей, то кроме этого все панели будут отключены. Таким образом, панель, которая взаимодействует с пользователем, активна.

import javafx.application.Application; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.event.EventHandler; 
import javafx.geometry.Insets; 
import javafx.scene.Node; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.layout.HBox; 
import javafx.scene.layout.Pane; 
import javafx.scene.layout.StackPane; 
import javafx.scene.layout.VBox; 
import javafx.stage.Stage; 

/** 
* @version 1.0 Jun 29, 2015 
*/ 
public class EnableAndDisableTest extends Application{ 

    private ObservableList<Pane> rootPanes = FXCollections.observableArrayList(); 

    /** 
    * @see javafx.application.Application#start(javafx.stage.Stage) 
    * @param primaryStage 
    * @throws Exception 
    */ 
    @Override 
    public void start(Stage primaryStage) throws Exception{ 

     StackPane rootPane = new StackPane(); 

     VBox pane1 = new VBox(); 
     pane1.setPadding(new Insets(20)); 
     Button button = new Button("Button on Pane_1"); 
     pane1.getChildren().add(button); 
     pane1.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>(){ 
      @Override 
      public void handle(MouseEvent event){ 
       Pane pane = (Pane) event.getSource(); 
       enablePane(pane); 
      } 
     }); 

     VBox pane2 = new VBox(); 
     pane2.setPadding(new Insets(20)); 
     Button button2 = new Button("Button on Pane_2"); 

     pane2.getChildren().add(button2); 
     pane2.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>(){ 
      @Override 
      public void handle(MouseEvent event){ 
       Pane pane = (Pane) event.getSource(); 
       enablePane(pane); 
      } 
     }); 

     VBox pane3 = new VBox(); 
     Button button3 = new Button("Button on Pane_3"); 
     pane3.setPadding(new Insets(20)); 
     pane3.getChildren().add(button3); 
     pane3.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>(){ 
      @Override 
      public void handle(MouseEvent event){ 
       Pane pane = (Pane) event.getSource(); 
       enablePane(pane); 
      } 
     }); 

     rootPanes.addAll(pane1, pane2, pane3); 

     HBox horizontalPane = new HBox(); 
     horizontalPane.getChildren().addAll(rootPanes); 

     rootPane.getChildren().add(horizontalPane); 

     Scene scene = new Scene(rootPane); 
     primaryStage.setScene(scene); 

     primaryStage.show(); 

    } 

    private void enablePane(Pane pane){ 
     for(Pane rootPane : rootPanes){ 
      if(rootPane.equals(pane)){ 
       for(Node child : rootPane.getChildren()){ 
        child.setDisable(false); 
       } 
       rootPane.setStyle("-fx-background-color: blue;"); 
      } 
      else{ 
       for(Node child : rootPane.getChildren()){ 
        child.setDisable(true); 
       } 
       rootPane.setStyle("-fx-background-color: white;"); 
      } 
     } 
    } 

    public static void main(String[] args){ 
     launch(args); 
    } 

} 
+0

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

+0

его трудно, не зная код. Так что просто разместите свой код, чтобы мы могли полностью понять ситуацию. – Hareesh

Смежные вопросы