Events 如何在窗格上获取JavaFX2.0可见性事件?

Events 如何在窗格上获取JavaFX2.0可见性事件?,events,properties,javafx-2,visibility,pane,Events,Properties,Javafx 2,Visibility,Pane,经过几次尝试和研究,我还没有设法从窗格中获取事件的可见性。下面的示例似乎是我最好的尝试,但它不起作用。 欢迎提出任何工作建议 import javafx.application.Application; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.scene.Scene; import javafx.scene.control.Button;

经过几次尝试和研究,我还没有设法从窗格中获取事件的可见性。下面的示例似乎是我最好的尝试,但它不起作用。 欢迎提出任何工作建议

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;

public class VisibilityTestMain extends Application {

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

@Override
public void start(Stage stage) throws Exception {
    Pane root = new Pane();
    ChangeListener<Boolean> visibilityListener = new ChangeListener<Boolean>() {

        @Override
        public void changed(ObservableValue<? extends Boolean> arg0, Boolean oldValue, Boolean newValue) {
            System.out.println("####");
        }
    };
    root.visibleProperty().addListener(visibilityListener);

    Button button = new Button("Hello");
    button.setTranslateX(10);
    button.setTranslateY(20);
    root.getChildren().add(button);

    stage.setScene(new Scene(root, 50, 50));
    stage.show();

}
导入javafx.application.application;
导入javafx.beans.value.ChangeListener;
导入javafx.beans.value.observeValue;
导入javafx.scene.scene;
导入javafx.scene.control.Button;
导入javafx.scene.layout.Pane;
导入javafx.stage.stage;
公共类VisibilityTestMain扩展了应用程序{
公共静态void main(字符串[]args){
VisibilityTestMain.launch(args);
}
@凌驾
public void start(Stage)引发异常{
窗格根=新窗格();
ChangeListener visibilityListener=新的ChangeListener(){
@凌驾

public void changed(observevalue问题在于,您从未更改窗格的可见性,因此您的听众永远无法访问

请尝试以下代码:

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class VisibilityTestMain extends Application {

public static final Logger LOGGER = LoggerFactory.getLogger(VisibilityTestMain.class);
public static void main(String[] args) {
    VisibilityTestMain.launch(args);
}

@Override
public void start(Stage stage) throws Exception {
    final Pane root = new Pane();
    root.visibleProperty().addListener(new ChangeListener<Boolean>() {
        @Override
        public void changed(final ObservableValue<? extends Boolean> observableValue, final Boolean aBoolean, final Boolean aBoolean2) {
            System.out.println("####");
            //To change body of implemented methods use File | Settings | File Templates.
        }
    });

    Button button = new Button("Hello");
    button.setTranslateX(10);
    button.setTranslateY(20);
    root.getChildren().add(button);
    button.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(final ActionEvent actionEvent) {
            root.setVisible(false);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
            }
            root.setVisible(true);
        }
    });

    stage.setScene(new Scene(root, 50, 50));
    stage.show();

}
}
导入javafx.application.application;
导入javafx.beans.value.ChangeListener;
导入javafx.beans.value.observeValue;
导入javafx.event.ActionEvent;
导入javafx.event.EventHandler;
导入javafx.scene.scene;
导入javafx.scene.control.Button;
导入javafx.scene.layout.Pane;
导入javafx.stage.stage;
导入org.slf4j.Logger;
导入org.slf4j.LoggerFactory;
公共类VisibilityTestMain扩展了应用程序{
公共静态最终记录器Logger=LoggerFactory.getLogger(VisibilityTestMain.class);
公共静态void main(字符串[]args){
VisibilityTestMain.launch(args);
}
@凌驾
public void start(Stage)引发异常{
最终窗格根=新窗格();
root.visibleProperty().addListener(新的ChangeListener()){
@凌驾

public void已更改(final observevalue我认为您没有将窗格添加到场景中。我错了吗?@Fabinout通常是的,因为在我运行它时按钮是可见的。它应该使用以下行执行:
stage.setScene(新场景(根,50,50))
通过监听visibleProperty,您到底想实现什么?因为isVisible在构建窗格后立即返回true,并且这一点永远不会改变。@Sebastien我想执行一些功能特性。在其他库中,如swing,这是一个常见的基本事件。@Jakez您想如何访问visibil如果您不将此可见性切换到其他位置,则会发生y事件?谢谢您的回答,但是第一次显示如何?@Jakez让我们澄清一下,您最初无法到达可见性事件,是吗?从严格的功能角度来看,我的需要非常简单:它是接收所有新窗格可见性更改的事件(从操作员的角度来看,而不是从“visibleProperty”的角度来看),从第一个到最后一个。我过去已经在其他库中使用过这种功能;我甚至自己也实现了一些。不幸的是,它在JFX中似乎没有正确实现,因为没有提出第一个有效的显示。@Fabinout我很确定提问者想知道他(她)是如何实现的只能在面板应用程序可见时处理事件。这种类型的事件最初是由JavaFX程序在安装图形界面时生成的。此外,在JavaFX应用程序的任务中添加1秒暂停可能会严重影响提问者应用程序的性能。