如果您想了解JAVAFX在JavaFx画布上的MouseScroll上绘制和缩放SVG线放大和缩小和javafx画布的知识,那么本篇文章将是您的不二之选。我们将深入剖析JAVAFX在JavaFx画布上
如果您想了解JAVAFX在JavaFx画布上的MouseScroll上绘制和缩放SVG线放大和缩小和javafx 画布的知识,那么本篇文章将是您的不二之选。我们将深入剖析JAVAFX在JavaFx画布上的MouseScroll上绘制和缩放SVG线放大和缩小的各个方面,并为您解答javafx 画布的疑在这篇文章中,我们将为您介绍JAVAFX在JavaFx画布上的MouseScroll上绘制和缩放SVG线放大和缩小的相关知识,同时也会详细的解释javafx 画布的运用方法,并给出实际的案例分析,希望能帮助到您!
本文目录一览:- JAVAFX在JavaFx画布上的MouseScroll上绘制和缩放SVG线放大和缩小(javafx 画布)
- ios – uiscrollview放大和缩小功能无法正常工作
- Java vs JavaFX Script vs FXML.哪种更好的JavaFX编程方式?
- Java 开发桌面程序学习(九)——JavaFxTemplate JavaFx 模版 更简单进行 JavaFx 程序开发
- JavaFX 11:“缺少JavaFX运行时组件”
JAVAFX在JavaFx画布上的MouseScroll上绘制和缩放SVG线放大和缩小(javafx 画布)
我解决了问题! 对于任何有兴趣的人,我将在下面发布我的消息!诀窍是缩放GraphicalContext,计算totalScale缩放并重画Lines;)。现在,如果您还没有选择行按钮,也可以重新定位画布。如果要在缩放后绘制直线,则需要使用在画布上完成的totalScaling来定义X-Y坐标。
public class Controller {
public StackPane pane;
public Canvas canvas;
public ToggleButton lineButton;
private Stage stage;
private ObservableList<SVGPath> paths;
private GraphicsContext gc;
//because we dont have any getScale Methods for GrapficsContext we neet to calculate by ourselves
private double scale = 1.0;
private double totalScale = 1.0;
public void run() {
//pane same size as the start-canvas in order to calculate the scale
pane.setMinSize(canvas.getWidth(),canvas.getHeight());
gc = canvas.getGraphicsContext2D();
paths = FXCollections.observableArrayList();
gc.setStroke(Color.BLACK);
gc.setLineWidth(1.0);
Line line = new Line();
Line drag = new Line();
canvas.setOnMousePressed(e->{
if(lineButton.isSelected()){
//set the X-Y Positions in relation to our scaling we may have done
line.setStartX(e.getX() / totalScale);
line.setStartY(e.getY() / totalScale);
}
else{
//calculate an drag Action in order to reposition the canvas
drag.setStartX(e.getX() / totalScale);
drag.setStartY(e.getY() / totalScale);
}
});
canvas.setOnMouseReleased(e->{
if(lineButton.isSelected()){
line.setEndX(e.getX() / totalScale);
line.setEndY(e.getY() / totalScale);
//gc.strokeLine(line.getStartX(),line.getStartY(),line.getEndX(),line.getEndY());
SVGPath svgline = linetosvg(line);
draw(svgline);
paths.add(svgline);
}
else{
drag.setEndX(e.getX() / totalScale);
drag.setEndY(e.getY() / totalScale);
//calculate the Delta in Movement we did,slower Movement f we are very close or far from the object on tha Canvas
double deltaX = totalScale>=1?Math.abs(drag.getEndX() - drag.getStartX()) / totalScale:Math.abs(drag.getEndX() - drag.getStartX()) * totalScale;
double deltaY = totalScale>=1?Math.abs(drag.getEndY() - drag.getStartY()) / totalScale:Math.abs(drag.getEndY() - drag.getStartY()) * totalScale;
canvas.setTranslateX(drag.getStartX() < drag.getEndX() ? canvas.getTranslateX() + deltaX : canvas.getTranslateX() - deltaX);
canvas.setTranslateY(drag.getStartY() < drag.getEndY() ? canvas.getTranslateY() + deltaY : canvas.getTranslateY() - deltaY);
}
});
canvas.setOnScroll(e->{
if (e.getDeltaY() == 0) {
return;
}
double scaleFactor =
(e.getDeltaY() > 0)
? 1.1
: 1/1.1;
//delete everything,because we need to redraw
gc.clearRect(0,canvas.getWidth(),canvas.getHeight());
//In order to make the zooming fluenter...
scale = scale==1?scale * scaleFactor:1.0;
//scale the GraphicalContext and rezize the Canvas in order to display everything
gc.scale(scale,scale);
canvas.setWidth(canvas.getWidth()*scale);
canvas.setHeight(canvas.getHeight()*scale);
//count every scale in order to calc the totalScaling done
totalScale = totalScale * scale;
for (int i = 0; i < paths.size(); i++) {
draw(paths.get(i));
}
});
}
public SVGPath linetosvg(Line line){
SVGPath p = new SVGPath();
final StringBuilder fxPath = new StringBuilder();
fxPath.append("M ").append(line.getStartX()).append(" ").append(line.getStartY()).append(" ")
.append("L ").append(line.getEndX()).append(" ").append(line.getEndY());
p.setContent(fxPath.toString());
return p;
}
public void draw (SVGPath path){
gc.beginPath();
gc.setFill(path.getFill());
gc.setStroke(path.getStroke());
gc.setLineWidth(path.getStrokeWidth());
gc.appendSVGPath(path.getContent());
gc.stroke();
gc.fill();
}
public Stage getStage() {
return stage;
}
public void setStage(Stage stage) {
this.stage = stage;
}
public ObservableList<SVGPath> getPaths() {
return paths;
}
public void setPaths(ObservableList<SVGPath> paths) {
this.paths = paths;
}
}
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception{
FXMLLoader loader = new FXMLLoader(getClass().getResource("sample.fxml"));
Parent root = loader.load();
primaryStage.setTitle("Hello World");
primaryStage.setScene(new Scene(root));
Controller controller = loader.getController();
controller.run();
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
输出
No Zoom
with Zoom
Draw new Lines after Zoom
ios – uiscrollview放大和缩小功能无法正常工作
在添加缩放效果之前,我有以下代码,它按照我的意愿工作,
-(void)viewDidLoad { [scrollView setScrollEnabled:YES]; [scrollView setContentSize:CGSizeMake(320,1690)]; }
所以我做了一些研究,最后得到了以下代码来启用捏缩放,
-(void)viewDidLoad { scrollView.scrollEnabled = YES; [scrollView setContentSize:CGSizeMake(320,1690)]; scrollView.delegate = self; // scrollView.contentSize = instimage.frame.size; scrollView.minimumZoomScale = scrollView.frame.size.width / instimage.frame.size.width; scrollView.maximumZoomScale = 2.0; [scrollView setZoomScale:scrollView.minimumZoomScale]; [[NSRunLoop currentRunLoop] runMode:NSRunLoopCommonModes beforeDate:[NSDate distantFuture]]; } - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView { return instimage; } - (CGRect)centeredFrameForScrollView:(UIScrollView *)scroll andUIView:(UIView *)rView { CGSize boundsSize = scroll.bounds.size; CGRect frametoCenter = rView.frame; // center horizontally if (frametoCenter.size.width < boundsSize.width) { frametoCenter.origin.x = ((boundsSize.width - frametoCenter.size.width) / 2); }else { frametoCenter.origin.x = 0; } return frametoCenter; } - (void)scrollViewDidZoom:(UIScrollView *)scrollV { instimage.frame = [self centeredFrameForScrollView:scrollV andUIView:instimage];; }
现在我有以下问题,我无法弄清楚是什么问题,
>当在任何夹点之前刚刚加载视图时,scrollview不会一直滚动到图像的末尾.
>当捏合放大时,它会向左和向右滚动并向上和向下滚动图像,但它仍然不会一直向下滚动到图像的末尾,但仍然比它最初在开始时所做的更多.
>当我缩小时,整个事情就停止了.你不能放大或缩小,它甚至不再滚动.完全锁定.
我做了一些研究,发现了以下帖子.
https://stackoverflow.com/a/6384834/1103257
但我不知道在哪里可以找到NSDefaultRunLoopMode,甚至不知道如何搜索它以确定是否可以解决它.
解决方法
在你的.h文件中
@interface scrollViewController : UIViewController <uiscrollviewdelegate>{ float oldScale; IBOutlet UIScrollView *scrollView; IBOutlet UIImageView *image; } @end
然后将图像连接到uiimageview,其中包含要放大和缩小的照片,并且位于滚动视图中.然后将scrollview连接到界面上的uiscrollview.
在.m文件中
@implementation scrollViewController -(void)viewDidLoad { [super viewDidLoad]; scrollView.scrollEnabled = YES; scrollView.minimumZoomScale=1.0; scrollView.maximumZoomScale=4.0; [scrollView setContentSize:CGSizeMake(320,1700)]; scrollView.delegate=self; } - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView { return image; } - (void)scrollViewDidEndZooming:(UIScrollView *)scrollV withView:(UIView *)view atScale:(float)scale { [scrollView setContentSize:CGSizeMake(scale*320,scale*1700)]; } @end
希望这可以帮助.
Java vs JavaFX Script vs FXML.哪种更好的JavaFX编程方式?
>简单的Java文件,与我们在Swing中使用的方法相同
>我不知道的JavaFX脚本
> FXML是基于xml的UI设计文件
哪个更好?为什么?
解决方法
>如果您更熟悉java中的编码UI,则可以使用此方法.但是,我个人不喜欢这种方法,因为当你的应用程序过于复杂时,它会使代码变得复杂.
> JavaFX Script在JavaFX 2.0之前使用,不再使用
>在Javafx 2.0中引入了基于FXML的UI设计.这些帮助程序员使用MVC方法对javafx应用程序进行编码.可以找到一个非常好的FXML介绍here.
来自Oracle docs的一节,Why Use FXML
From a Model View Controller (MVC) perspective,the FXML file that contains the description of the user interface is the view. The controller is a Java class,optionally implementing the Initializable class,which is declared as the controller for the FXML file. The model consists of domain objects,defined on the Java side,that you connect to the view through the controller.
FXML可以使用Scene Builder轻松设计,Scene Builder是javafx应用程序的Drag n Drop UI设计器.使用FXML具有以下优点:
>您的应用程序遵循MVC结构,就像企业JavaEE应用程序一样.
>表示层(UI)与应用层(逻辑)隔离,这样可以在需要时轻松更改应用程序的外观,就像网站一样!
> FXML为您的应用程序带来了可扩展性和可维护性.
我对你的建议是使用FXML.如果您不了解它们,请了解它们.这将是值得的!
Java 开发桌面程序学习(九)——JavaFxTemplate JavaFx 模版 更简单进行 JavaFx 程序开发
JavaFxTemplate
使用说明
项目基于 maven,请确保 maven 配置成功,否则,可能会出现问题
项目内置了 commons-io 的 jar 包,Jfoenix 的 jar 包以及常用的工具类 JFxUtils
,具体使用请看注释!
原本是想将 JFxUtils
单独出来,打成一个 jar 包,不过,项目引用之后一起打成 jar 包,项目的 jar 包跑不起来,报找不到类的错误。
复制该项目,修改项目名,之后修改 pom.xml 中的 groupId,artifactId,version。 打开 IDEA,Main.java 的里面需要重新导入一下包名,之后即可成功运行。
打 jar 包的时候,需要注意,把 META-INF 的路径设置在 out 目录下,否则,运行 jar 包会失败,如下图
JFxUtils 使用说明
介绍
这是一个 JFX 的工具库,Intent 可以简单地实现打开一个新窗口并传递数据,DialogBuilder 可以简单地生成对话框,MyUtils 有些常用的功能
使用
- MyUtils 封装了一些常用的的方法
- Intent 与 BaseController 打开新窗口,并传递数据
- DialogBuilder 基于 Jfoenix,快速生成 material Design 风格的对话框
Intent 的使用
使用 Intent,可以打开一个新窗口,还能传递数据
如何使用?
打开一个新窗口
步骤:new 一个 Intent,调用 start 方法即可
下面是几种不同的构造方法
- Intent(String fxmlName)
- Intent(String fxmlName, String title)
- Intent(String fxmlName, String title,String iconName)
- Intent(String fxmlName, int width, int height)
- Intent(String fxmlName, int width, int height, String title)
- Intent(String fxmlName, int width, int height, String title, String iconName)
PS:
fxmlName
fxml 的名字,不需要写扩展名iconName
图标名,需要写扩展名
例子:
- 简单例子
//在一个controller中
//fxml名字为test
//默认宽高 600*400
Intent intent = new Intent("test");
//打开新窗口
intent.start();
- 设置标题
Intent intent = new Intent("test","hello world");
intent.start();
- 设置宽高
Intent intent = new Intent("test",800,400);
intent.start();
打开新窗口并传递数据
本工具中,有一个 BaseController
,想要传递数据,就得让 controller
继承这个 BaseController
,之后,new 一个 intent
, 使用 addData
方法传入数据
可以传递的数据类型有 int
,boolean
,String
,List
,Object
- addData(String key, int data)
- addData(String key, boolean data)
- addData(String key, String data)
- addData(String key, List<?> data)
- addData(String key, Object data)
在 controller 中 getIntent 得到 intent 的实例,之后通过以下方法获得数据
- getDataInteger(String key)
- getDataBoolean(String key)
- getDataString(String key)
- getDataList(String key,Class<T> clazz)
- getDataObject(String key) 需要转型
例子:
//某个controller中打开新窗口,并传递list数据
Intent intent = new Intent("test",800,400);
intent.addData("list",studentlist);
intent.start();
//test对应的controller,接收list数据
package wan.dormsystem.controller;
import java.net.URL;
import java.util.List;
import java.util.ResourceBundle;
import wan.dormsystem.bean.Student;
/**
* @author StarsOne
* @date Create in 2019/6/21 0021 16:44
* @description
*/
public class TestController extends BaseController {
@Override
public void initialize(URL location, ResourceBundle resources) {
//这里一定要有判断,不然会有空指针异常
if (getIntent() != null) {
List<Student> list = getIntent().getDataList("list", Student.class);
for (Student student : list) {
System.out.println(student.toString());
}
}
}
}
DialogBuilder
DialogBuilder 使用
MyUtils
- closeWindow (Control control) 关闭窗口
- Image getImg (String fileName) 获得图片
- void setLinkAutoAction (Hyperlink hyperlink) 设置链接自动跳转
- void setLinkAction (Hyperlink hyperlink, LinkActionHander hander) 设置链接点击事件
更多使用详情,可以直接去 JavaFxTemplate 中的具体类中查看
JavaFX 11:“缺少JavaFX运行时组件”
我正在尝试在Windows 10下使用jgrasp 2在JavaFX 11和Java 11下运行示例JavaFX代码(取自Java Illuminated的第五版).
我已经仔细阅读了“ JavaFX入门”指南(https://openjfx.io/openjfx-docs/),尽管取得了一些进步,但我还是很困惑.
我下载了最新的ZIP文件,将其解压缩,并更新了CLAsspATH,以包含编译所需的jar文件的路径.我可以成功编译该文件.但是,当我尝试运行时,出现以下错误消息:
Error: JavaFX runtime components are missing,and are required to run this application
“入门”指南说,可以通过在运行时调用中添加以下选项来解决此问题:
–module-path “[path]\lib” –add-modules=javafx.controls,javafx.fxml
我已经添加了选项,但是仍然收到错误消息.
先前的StackOverflow文章通常以上面的选项设置结尾; las,我不知道该怎么办.
我想并没有多少人熟悉此IDE,因此我将按照基本步骤发布我遵循的步骤:
> Download并安装jgrasp版本2.0.5_05 Beta.
>因为我已经安装了一些JDK,所以默认情况下选择了JDK 10.0.2,所以我的第一步是找到一种使用JDK 11的方法.可以在Settings-> jgrasp启动设置,可以在其中设置Java可执行文件的路径:
然后,我重新启动了jgrasp.您可以在工具->中验证IDE使用的是哪个JDK.系统信息-> Java版本.
>打开HelloFX示例类.我从the OpenJFX docs开始最基本的示例.可以找到代码here.
>构建->鉴于JavaFX不再是JDK的一部分,按预期进行编译会引发很多错误:
>按照OpenJFX文档,我们需要从here下载JavaFX SDK,然后将库添加到类路径.转到设置->路径/类路径->在工作区中,按“新建”,然后从下载的SDK / lib文件夹(至少javafx-base.jar,javafx-graphics.jar和javafx-controls.jar)中逐一添加不同的JavaFX jar.
>构建->编译现在应该可以工作了.
>下一步:构建->跑.这将失败:
----jgrasp exec: java HelloFX
Error: JavaFX runtime components are missing,and are required to run this application
----jgrasp wedge: exit code for process is 1.
----jgrasp: operation complete.
那是预料之中的.根据文档,我们需要设置module-path和add-modules参数.
>首次尝试:使用运行参数.设置后:
--module-path /Users/<user>/Downloads/javafx-sdk-11.0.2/lib --add-modules javafx.controls
再次运行失败,并显示与上面完全相同的错误消息,但控制台日志中有一个区别:
----jgrasp exec: java HelloFX --module-path /Users/<user>/Downloads/javafx-sdk-11.0.2/lib --add-modules javafx.controls
怎么了!!好吧…如果您在命令行上尝试该操作,它也会失败,因为参数的顺序错误,因此vm参数应该放在类名之前.
结论:运行参数不是VM参数!
>第二次尝试:为了提供VM参数,我发现的选项是编辑设置->编译器设置->工作区.默认情况下,它使用的是通用的jdk(集成调试器).您可以查看它,并看到它在运行中使用:
java %s -ea %s %<FLAGS2> %<MAIN_CLASS> %<ARGS>
因此,我们需要找到一种设置FLAGS2的方法,而不是ARGS.
幸运的是,在“环境”选项卡旁边,有一个“标志/ Args”选项卡,我们可以在FLAGS2中设置vm参数:
--module-path /Users/<user>/Downloads/javafx-sdk-11.0.2/lib --add-modules javafx.controls
>应用,关闭对话框,然后Build->运行课程,现在可以使用了!
如果您看到控制台日志,则它完全包含您在命令行上运行时将使用的命令:
----jgrasp exec: java --module-path /Users/<user>/Downloads/javafx-sdk-11.0.2/lib --add-modules javafx.controls HelloFX
----jgrasp: operation complete.
我想下一步将运行一个更复杂的项目…
我们今天的关于JAVAFX在JavaFx画布上的MouseScroll上绘制和缩放SVG线放大和缩小和javafx 画布的分享就到这里,谢谢您的阅读,如果想了解更多关于ios – uiscrollview放大和缩小功能无法正常工作、Java vs JavaFX Script vs FXML.哪种更好的JavaFX编程方式?、Java 开发桌面程序学习(九)——JavaFxTemplate JavaFx 模版 更简单进行 JavaFx 程序开发、JavaFX 11:“缺少JavaFX运行时组件”的相关信息,可以在本站进行搜索。
本文标签: