在 JavaFX 8 中创建可调整大小的可拖动窗格
Create a Sizeable Draggable Pane in JavaFX 8
我正在尝试创建一个 "workspace",用户可以在其中打开多个容器来显示不同的信息。这些需要可移动且可调整大小(例如 ScrollPane)。
我已经成功创建了大部分功能 - 但是有一件事确实给我带来了问题,我无法找出问题所在。
我创建了以下类:
public class WorkspaceMoveableSizeablePane extends Pane
public WorkspaceMoveableSizeablePane(Node view) {
getChildren().add(view);
init();
}
private void init() {
...set up the event handlers....
我尝试通过在我的 WorkspaceController 中包装现有窗格来使用此窗格:
@FXML private openSampleWorkspaceNode() {
FXMLLoader loader = new FXMLLoader();
Parent node = loader.load(
this.getClass().getResource("MyView.fxml").openStream());
WorkspaceMoveableSizeablePane dn = new WorkspaceMoveableSizeablePane(node);
pane.getChildren().add(dn);
}
当我以这种方式打开它时 - 我可以调整窗格的大小并拖动它,但是作为锚窗格的 "node" 上的子项保持在当前位置而不是被隐藏。
为了更正此问题,我将 AnchorPane 包装在 FXML 文件的 ScrollPane 中。这允许调整大小发生 - 正如预期的那样,超出范围的部分不可见并且出现了滚动条,但是拖动停止了。当我尝试跟踪鼠标拖动事件时,它实际上并没有触发,除非我正在调整 WorkspaceMoveableSizeablePane 的大小。
//Event Listener for MouseDragged
onMouseDraggedProperty().set(event -> {
System.out.println("You are in the Mouse Dragged Event");
if(isTopSelected){
dragPaneToNewLocation(event);
}else if(isResizingHeight) {
handleResizeHeight(event);
}else if(isResizingWidth) {
handleResizeWidth(event);
}
});
我将我的 FXML 还原为 AnchorPane 并如下更改了 WorkspaceMoveableSizeablePane 以查看是否有帮助:
public class WorkspaceMoveableSizeablePane extends ScrollPane
public WorkspaceMoveableSizeablePane(Node view) {
setContent(view);
init();
}
private void init() {
...set up the event handlers....
和之前一样,调整大小有效,但拖动无效。鼠标拖动事件从未触发。此外,我的滚动窗格是空白的,里面什么也没有。
所以我不知道如何继续这个尝试。
ScrollPane 的事件处理程序是否有限制?我应该听不同的事件吗?谢谢!!
问题是 ScrollPane 捕获了 MouseDragged 事件。
添加了事件过滤器,一切正常...
addEventFilter(MouseEvent.MOUSE_DRAGGED, event -> {
if(isTopSelected){
dragPaneToNewLocation(event);
}else if(isResizingHeight) {
handleResizeHeight(event);
}else if(isResizingWidth) {
handleResizeWidth(event);
}
});
我正在尝试创建一个 "workspace",用户可以在其中打开多个容器来显示不同的信息。这些需要可移动且可调整大小(例如 ScrollPane)。
我已经成功创建了大部分功能 - 但是有一件事确实给我带来了问题,我无法找出问题所在。
我创建了以下类:
public class WorkspaceMoveableSizeablePane extends Pane
public WorkspaceMoveableSizeablePane(Node view) {
getChildren().add(view);
init();
}
private void init() {
...set up the event handlers....
我尝试通过在我的 WorkspaceController 中包装现有窗格来使用此窗格:
@FXML private openSampleWorkspaceNode() {
FXMLLoader loader = new FXMLLoader();
Parent node = loader.load(
this.getClass().getResource("MyView.fxml").openStream());
WorkspaceMoveableSizeablePane dn = new WorkspaceMoveableSizeablePane(node);
pane.getChildren().add(dn);
}
当我以这种方式打开它时 - 我可以调整窗格的大小并拖动它,但是作为锚窗格的 "node" 上的子项保持在当前位置而不是被隐藏。
为了更正此问题,我将 AnchorPane 包装在 FXML 文件的 ScrollPane 中。这允许调整大小发生 - 正如预期的那样,超出范围的部分不可见并且出现了滚动条,但是拖动停止了。当我尝试跟踪鼠标拖动事件时,它实际上并没有触发,除非我正在调整 WorkspaceMoveableSizeablePane 的大小。
//Event Listener for MouseDragged
onMouseDraggedProperty().set(event -> {
System.out.println("You are in the Mouse Dragged Event");
if(isTopSelected){
dragPaneToNewLocation(event);
}else if(isResizingHeight) {
handleResizeHeight(event);
}else if(isResizingWidth) {
handleResizeWidth(event);
}
});
我将我的 FXML 还原为 AnchorPane 并如下更改了 WorkspaceMoveableSizeablePane 以查看是否有帮助:
public class WorkspaceMoveableSizeablePane extends ScrollPane
public WorkspaceMoveableSizeablePane(Node view) {
setContent(view);
init();
}
private void init() {
...set up the event handlers....
和之前一样,调整大小有效,但拖动无效。鼠标拖动事件从未触发。此外,我的滚动窗格是空白的,里面什么也没有。
所以我不知道如何继续这个尝试。
ScrollPane 的事件处理程序是否有限制?我应该听不同的事件吗?谢谢!!
问题是 ScrollPane 捕获了 MouseDragged 事件。
添加了事件过滤器,一切正常...
addEventFilter(MouseEvent.MOUSE_DRAGGED, event -> {
if(isTopSelected){
dragPaneToNewLocation(event);
}else if(isResizingHeight) {
handleResizeHeight(event);
}else if(isResizingWidth) {
handleResizeWidth(event);
}
});