【发布时间】:2019-06-08 08:56:02
【问题描述】:
我的应用程序中有一些 JavaFX Popup。当这些弹出窗口中的任何一个被关注时,我需要将它置于所有其他弹出窗口之上,无论它在 Window.getWindows() 中的索引如何。
我尝试调用像toFront 这样的方法,但它不在Popup 类中。我还尝试在Window.getWindows() 中更改焦点Popup 的索引,但这也没有用,因为我不知道如何在ObservableList 中交换两个元素的索引。
例如
假设我有两个Popup,分别称为p1 和p2,在每个节点中我分别有节点n1 和n2,用于移动这些弹出窗口,所以每当n1 被拖动@987654335 @ 应该在顶部,当 n2 被拖动时,p2 应该在顶部。
这是我的最小示例:
import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.stage.Popup;
import javafx.stage.Stage;
public class Example extends Application{
public static void main(String... arguments){
launch(arguments);
}
public void applyTo(Pane node, Popup parent){
final double[] dragDelta = new double[2];
node.setOnMousePressed(e -> {
dragDelta[0] = parent.getX() - e.getScreenX();
dragDelta[1] = parent.getY() - e.getScreenY();
//code to bring parent Popup to front
});
node.setOnMouseDragged(e -> {
parent.setX(e.getScreenX() + dragDelta[0]);
parent.setY(e.getScreenY() + dragDelta[1]);
});
}
@Override
public void start(Stage primaryStage) throws Exception{
Button b1 = new Button("Open p1");
Button b2 = new Button("Open p2");
HBox n1 = new HBox(new Label("This is p1"));
HBox n2 = new HBox(new Label("This is p2"));
n1.setMinSize(200, 120);
n2.setMinSize(200, 120);
n1.setStyle("-fx-background-color: blue; -fx-background-radius: 4px;");
n2.setStyle("-fx-background-color: red; -fx-background-radius: 4px;");
n1.setAlignment(Pos.CENTER);
n2.setAlignment(Pos.CENTER);
Popup p1 = new Popup();
Popup p2 = new Popup();
p1.getContent().add(n1);
p2.getContent().add(n2);
applyTo(n1, p1);
applyTo(n2, p2);
b1.setOnAction(event -> {
if(!p1.isShowing()) p1.show(primaryStage);
else p1.hide();
});
b2.setOnAction(event -> {
if(!p2.isShowing()) p2.show(primaryStage);
else p2.hide();
});
HBox root = new HBox(10, b1, b2);
root.setAlignment(Pos.CENTER);
primaryStage.setScene(new Scene(root, 500, 200));
primaryStage.show();
}
}
那么解决这个问题的方法是什么?
【问题讨论】:
-
@nicomp ,我问过当有很多弹出窗口时如何将任何弹出窗口置于前面,而不是如何聚焦/取消聚焦,因为如果我想检查一个弹出窗口是否聚焦,我会将鼠标按下事件添加到我在弹出窗口中使用的节点以使弹出窗口可移动。即焦点不是这里的问题。
-
setAlwaysOnTop() ?
-
@nicomp
setAlwaysOnTop()也不适用于Popup -
我没有说您的代码无效。我指出了解决您的问题的方法以及使修复为您工作的方法。实施的决定取决于您。我不同意“荒谬”的表征。有时我们必须做我们必须做的事情。
标签: java user-interface javafx javafx-11