我有一个需要在ScrollPane中放大的应用程序,但是按照我目前的方法,我仍然面临着两个挑战.为了复制问题,我编写了一个小应用程序ZoomApp,您将找到下面的代码.它的有限功能允许在某些任意形状上放大和缩小(使用Ctrl +鼠标滚轮).当缩放的内容超出窗口范围时,滚动条应该显示.
挑战1. 当内部组缩小尺寸时出现滚动条时,ScrollEvent不再到达我的ZoomHandler.相反,我们开始向下滚动窗口,直到它到达底部,当再次缩放按预期工作时.我想也许吧
scrollPane.setPannable(false);
Run Code Online (Sandbox Code Playgroud)
会有所作为,但没有.如何避免这种不良行为?
挑战2. 我将如何去到中心innerGroup滚动窗格内,不诉诸画一个像素的左上角innerGroup与所需三角洲平方?
作为旁注,根据JavaDoc for ScrollPane:"如果应用程序希望滚动基于节点的可视边界(对于缩放内容等),则需要将滚动节点包装在一个组中".这就是为什么我在ScrollPane中有一个innerGroup 和一个outerGroup的原因.
这个JavaFX新手非常赞赏任何指导我解决方案的建议.
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.SceneBuilder;
import javafx.scene.control.ScrollPane;
import javafx.scene.input.ScrollEvent;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
/**
* Demo of a challenge I have with zooming inside a {@code ScrollPane}.
* <br>
* I am running JavaFx 2.2 on a Mac. {@code java -version} yields:
* <pre> …Run Code Online (Sandbox Code Playgroud) 在我目前正在使用的应用程序上,有必要从同一JavaFX 8 DatePicker中选择一个日期或句点.
这样做的首选方法如下:
选择单个日期 - 与DatePicker的默认行为相同.
选择句点 - 按住鼠标按钮选择开始/结束日期,然后拖动到所需的结束/开始日期.释放鼠标按钮后,您已定义了期间.您无法选择除显示日期之外的日期这一事实是可以接受的.
编辑应适用于单日期(2014年12月24日)和期间(例如:2014年12月24日 - 2014年12月27日)
上面所选时间段(减去文本编辑器的内容)的可能呈现方式如下所示:

其中橙色表示当前日期,蓝色表示选定的时间段.图片来自我制作的原型,但是使用2个DatePickers而不是一个来选择周期.
我看了一下源代码
com.sun.javafx.scene.control.skin.DatePickerContent
Run Code Online (Sandbox Code Playgroud)
有一个
protected List<DateCell> dayCells = new ArrayList<DateCell>();
Run Code Online (Sandbox Code Playgroud)
为了找到一种方法来检测当鼠标被释放时(或者可能检测到拖动)鼠标选择日期结束的时间.
但是我不太清楚如何去做.有什么建议?
我附上了我迄今为止所做的简单原型代码(使用2而不是所需的1个日期选择器).

import java.time.LocalDate;
import javafx.beans.property.SimpleObjectProperty;
public interface PeriodController {
/**
* @return Today.
*/
LocalDate currentDate();
/**
* @return Selected from date.
*/
SimpleObjectProperty<LocalDate> fromDateProperty();
/**
* @return Selected to date.
*/
SimpleObjectProperty<LocalDate> toDateProperty();
}
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import javafx.util.StringConverter;
public class DateConverter extends StringConverter<LocalDate> {
private DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy"); // TODO …Run Code Online (Sandbox Code Playgroud)