2014-05-21 101 views
0

我確實實現了一個新階段的彈出窗口,現在我試圖關閉它,不管我在哪裏點擊(不包括彈出本身)。這工作得很好。儘管當我點擊背景上的另一個元素(例如按鈕)時,彈出式窗口消失了,但我仍然想要獲取按鈕的事件。有關如何實現這一目標的任何建議?我彙總了一個簡短的例子。JavaFX的:窗口關閉事件防止按鈕操作

package application; 

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

public class Main extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     try { 
      BorderPane root = new BorderPane(); 
      Scene scene = new Scene(root, 400, 400); 
      scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm()); 
      primaryStage.setScene(scene); 

      // the popup 
      Pane p = new Pane(); 
      p.setPrefSize(100, 100); 
      p.setStyle("-fx-background-color: #660066"); 
      final Stage popUp = new Stage(); 
      Scene popUpScene = new Scene(p); 

      popUp.setScene(popUpScene); 

      Button btnShow = new Button("Show popUp"); 
      root.setCenter(btnShow); 
      btnShow.setOnMouseClicked(new EventHandler<Event>() { 

       @Override 
       public void handle(Event event) { 
        ChangeListener stageFocusListener = new ChangeListener<Boolean>() { 
         @Override 
         public void changed(ObservableValue<? extends Boolean> arg0, Boolean oldPropertyValue, Boolean newPropertyValue) { 
          if (!newPropertyValue) { 
           popUp.hide(); 
          } 
         } 
        }; 
        popUp.focusedProperty().addListener(stageFocusListener); 
        popUp.show(); 

       } 
      }); 

      Button btnTest = new Button("test"); 
      root.setRight(btnTest); 
      btnTest.setOnMouseClicked(new EventHandler<Event>() { 

       @Override 
       public void handle(Event event) { 
        System.out.println("Button test clicked"); 
       } 
      }); 

      primaryStage.show(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

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

回答

0

你可以把隱藏事件隊列,而不會干擾按鈕

if (!newPropertyValue) { 
    Platform.runLater(new Runnable() { 
     @Override 
     public void run() { 
      popUp.hide(); 
     } 
    }); 
} 
+0

的作品就像一個魅力的事件處理程序!謝謝! – blaster