- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我试图在 JavaFX 中创建一种带有 Canvas 和工具栏的类似绘画/Photoshop 的应用程序。如果可能的话,我想要的是 Canvas 相当大,甚至是无穷无尽的。我希望用户能够在 Canvas 上平移并放大和缩小等。我的解决方案是将工具栏放在 BorderPane 中, Canvas 是常规 Pane (因此不是 JavaFX-Canvas),然后将 BorderPane 堆叠在 StackPane 中的 Pane 顶部。出现的问题是,当我想让 Pane 的尺寸变得非常大时,这会将 BorderPane 的内容推到屏幕外,因为它们都在同一个 StackPane 中。
这是 StackPane fxml:
<StackPane fx:controller="controller.MainController" xmlns:fx="http://javafx.com/fxml">
<Pane fx:id="aDrawPane">
</Pane>
<BorderPane fx:id="aBorderPane">
<top>
<VBox>
<ToolBar fx:id="aToolBar" orientation="HORIZONTAL">
<HBox fx:id="umlBox">
<Button text="Create" fx:id="createBtn"/>
<Button text="Package" fx:id="packageBtn"/>
<Button text="Edge" fx:id="edgeBtn"/>
<Button text="Draw" fx:id="drawBtn"/>
</HBox>
<HBox fx:id="utilBox">
<Button text="Select" fx:id="selectBtn"/>
<Button text="Move" fx:id="moveBtn"/>
</HBox>
<HBox fx:id="undoBox">
<Button text="Delete" fx:id="deleteBtn"/>
<Button text="Undo" fx:id="undoBtn"/>
<Button text="Redo" fx:id="redoBtn"/>
</HBox>
<HBox fx:id="recognizeBox">
<Button text="Recognize" fx:id="recognizeBtn"/>
</HBox>
</ToolBar>
</VBox>
</top>
<bottom>
<ToolBar>
<Pane HBox.hgrow="ALWAYS" />
<VBox alignment="CENTER">
<Slider fx:id="zoomSlider" min="10" max="200" value="100"/>
<Label text="Zoom"/>
</VBox>
<Pane HBox.hgrow="ALWAYS" />
</ToolBar>
</bottom>
</BorderPane>
</StackPane>
该 fxml 实际上也放置在该 fxml 内的选项卡中:
<VBox fx:controller="controller.TabController" xmlns:fx="http://javafx.com/fxml">
<MenuBar fx:id="menuBar">
<menus>
<Menu text="File">
<items>
<MenuItem text="New" onAction="#handleMenuActionNew"/>
<MenuItem text="Open" onAction="#handleMenuActionLoad"/>
<MenuItem text="Save" onAction="#handleMenuActionSave"/>
<SeparatorMenuItem/>
<CheckMenuItem fx:id="mouseMenuItem" text="Activate Mouse" onAction="#handleMenuActionMouse" selected="false"/>
<SeparatorMenuItem/>
<MenuItem text="Exit" onAction="#handleMenuActionExit"/>
</items>
</Menu>
<Menu text="Edit">
<items>
<MenuItem text="Copy"/>
<MenuItem text="Cut"/>
<MenuItem text="Paste"/>
</items>
</Menu>
<Menu text="View">
<items>
<CheckMenuItem fx:id="umlMenuItem" text="UML" onAction="#handleMenuActionUML" selected="true"/>
<CheckMenuItem fx:id="sketchesMenuItem" text="Sketches" onAction="#handleMenuActionSketches" selected="true"/>
<CheckMenuItem fx:id="gridMenuItem" text="Grid" onAction="#handleMenuActionGrid" selected="true"/>
</items>
</Menu>
</menus>
</MenuBar>
<TabPane fx:id="tabPane">
</TabPane>
<stylesheets>
<URL value="@main.css" />
</stylesheets>
</VBox>
因此 StackPane 被放置在 TabPane 内的选项卡内。所以我想要的是“aDrawPane”非常大(甚至感觉它是无穷无尽的),而用户一开始只关注它的一小部分,但能够平移和缩放它。我希望它位于工具栏“下方”。
我希望我已经解释清楚了。我正在寻找有关如何使用 JavaFX 库构建此类应用程序的指导,而不是如何实现绘图/缩放/平移功能的指导。
最佳答案
我认为您使问题过于复杂化了。首先,您的 Pane 顺序不正确。 BorderPane 现在位于 Pane “上方”。
BorderPane 已经有一个“CENTER”,用于您的案例。将您的 Pane 包装为 ScrollPane 并将其放在那里。
这是一个例子:
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.ScrollPane?>
<?import javafx.scene.control.Slider?>
<?import javafx.scene.control.ToolBar?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.layout.VBox?>
<BorderPane fx:id="aBorderPane" xmlns="http://javafx.com/javafx/8.0.60" xmlns:fx="http://javafx.com/fxml/1">
<top>
<VBox>
<ToolBar fx:id="aToolBar" orientation="HORIZONTAL">
<HBox fx:id="umlBox">
<Button fx:id="createBtn" text="Create" />
<Button fx:id="packageBtn" text="Package" />
<Button fx:id="edgeBtn" text="Edge" />
<Button fx:id="drawBtn" text="Draw" />
</HBox>
<HBox fx:id="utilBox">
<Button fx:id="selectBtn" text="Select" />
<Button fx:id="moveBtn" text="Move" />
</HBox>
<HBox fx:id="undoBox">
<Button fx:id="deleteBtn" text="Delete" />
<Button fx:id="undoBtn" text="Undo" />
<Button fx:id="redoBtn" text="Redo" />
</HBox>
<HBox fx:id="recognizeBox">
<Button fx:id="recognizeBtn" text="Recognize" />
</HBox>
</ToolBar>
</VBox>
</top>
<bottom>
<VBox alignment="CENTER" fillWidth="false">
<Slider fx:id="zoomSlider" max="200" min="10" value="100" />
<Label text="Zoom" />
<padding>
<Insets top="8.0" />
</padding>
</VBox>
</bottom>
<center>
<ScrollPane pannable="true" prefViewportHeight="400.0" prefViewportWidth="400.0" BorderPane.alignment="CENTER">
<content>
<Pane fx:id="aDrawPane" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="-Infinity" minWidth="-Infinity" prefHeight="8000.0" prefWidth="8000.0">
</Pane>
</content>
</ScrollPane>
</center>
<padding>
<Insets bottom="8.0" left="8.0" right="8.0" top="8.0" />
</padding>
</BorderPane>
在此示例中, Pane 将随其子项一起增大,这意味着当您在其中绘制/定位元素时, Pane 将增大/缩小。
如果你想模拟一个无限的空白空间,即使还没有绘制 item ,用户也可以滚动和移动,你必须以编程方式实现它,单独的 FXML 太有限了。
基本上,您将创建一个 AnchorPane,其中包含一个 Group 内的 drawPane 和 2 个 ScrollBar。然后编写代码以在 X/Y 方向上平移drawPane。
AnchorPane
-> Group (setManaged(false))
'-> drawPane
-> vertical ScrollBar
-> horizontal ScrollBar
该组将自动调整大小以包含其所有子组。它需要“不受管理”,以便其父级(AnchorPane)不会调整自身大小,以便您可以将其放入 GUI 的其余部分,而无需四处移动,从而有效地在 Canvas 中创建视口(viewport)。在这种布局中,组成为无限的虚拟 Canvas ,而drawPane成为某种逻辑边界(纸张、文档大小、打印大小...)。
关于JavaFX "endless" Pane ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38369078/
所以我试图在 JavaFX 中创建一种带有 Canvas 和工具栏的类似绘画/Photoshop 的应用程序。如果可能的话,我想要的是 Canvas 相当大,甚至是无穷无尽的。我希望用户能够在 Can
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve th
我对 JS 很了解,我也熟悉 jQuery,我正在尝试创建一个“无休止的”幻灯片(就像 http://thisismedium.com/ 上的那个),其中图像滚动——一个就在其他 - 当它到达终点时它
下面是我正在使用的代码,它应该从薪资数据中读取包含姓名和当前薪资以及增长百分比的信息,然后将新信息写入 NewData 文件。好吧,它读取第一行并无休止地一遍又一遍地重写到新文件中。它需要能够读取和写
我有一个实现了滚动的自定义 View ,但它似乎在图像上无休止地滚动。 即使我找到图像的边缘,它也会一直滚动到空白背景。 我不能使用 WebView,因为我还有一些 Canvas sutff。 有谁知
我在从 Socket 创建 AudioInputStream 时遇到问题。以下是重要部分: public class SoundStream extends Thread { private
我通过在 onScrollStateChanged(...) 方法中将更多项目加载到 arraylist 来实现无限 ListView 。如果我正在实现这个方案来获取超过 100 万个条目,我将在 a
I wrote some program that has to receive and send messages. But I have some troubles with streams
我试图在我的项目中使用 django-endless-pagination,但结果似乎没有使用 AJAX。我的目标是类似 twitter 的分页,向下滚动并在不刷新页面的情况下列出更多元素。 这是我的
我对以下 WHILE EXISTS 循环有问题。您能考虑一下为什么它是无限循环以及为什么它不更新值的原因是什么吗? declare @part varchar(20) while exists ((s
我正在尝试创建一个无休止的图像幻灯片,其功能如下: 在窗口上滑动图像 到达最后一个图像时,将从图像的开头开始 这是我当前的代码: var direction = '-'; function doScr
我正在试用 CommonsWare 的 android endlist 适配器。 https://github.com/commonsguy/cwac-endless 加载几个页面后,我旋转了屏幕,
我对无限滚动有疑问。每次加载更多数据时,它都会返回顶部 View 。我想要的是 RecyclerView 在加载新数据时保持在最后一个位置。我正在尝试实现此代码 https://github.com/
我有这种情况。我实现了 endless scrolling with RecyclerView .通常,当当前滚动位置下方只有 5 个项目时,应该加载新项目,但事实并非如此。 而是从 API 加载第一
我想将无尽的适配器功能添加到我的自定义适配器中。我该如何使用这个组合?谢谢。 最佳答案 您按照 GitHub repo for the project 中的说明进行操作. EndlessAdapter
我有一个包含 10,000 行的数据库表,我想将其显示在 ListView 中。我想显示前 20 个,当用户向下滚动到最后一个项目时,应该加载下一个 20 个(依此类推)。加载 ListView 中的
请帮我找到这个编码的解决方案 Coming Soon.. Your Own Classifieds Section Coming Soon..
我目前是 Android 开发新手,正在构建我的第一个应用程序。我陷入了一个特别棘手的问题,我正在尝试实现无尽的回收器 View 。 我(当前)使用回收器 View 只是为了获取当前日期并将其显示在日
所以,我写这个是为了监视文件夹中的新图片并打印找到的任何图片。它有效,但我假设有一种更强大/更有效的方法来解决这个问题,因为我希望它一次运行 5-6 小时。 我的主要问题是我不喜欢使用像这样的“ope
我是一名优秀的程序员,十分优秀!