是否有解决方案在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);
}
}
编辑:
我也试过这个解决方案: 我为主要疼痛添加了透明窗格,然后为其添加特殊节点。但它对复杂的组件不起作用,因为我应该保留它的孩子的大小和位置!
我确实希望用户与整个场景的一个节点进行交互,其他节点应该被禁用。
答案 0 :(得分:1)
Node的 BooleanProperty disableProperty()的当前javadoc说:“...... 将disable设置为true将导致此节点和任何子节点被禁用 .......
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
所以无法禁用没有子节点的节点。
答案 1 :(得分: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 );
}
}