javafx显示image_JavaFX技巧20:有很多要显示的吗? 使用画布!

javafx显示image

JavaFX应用程序似乎有两种:第一种使用带有节点和CSS样式的场景图,第二种使用单个画布。 但是,将这两种方法混合使用是完全合法的。 尤其是当您的应用程序必须显示大量详细信息时,您很容易最终创建成千上万个节点。 即使JavaFX的整体性能非常出色,当所有这些节点都需要样式设置时(特别是由于可视化的动态性质而需要反复进行样式设置时),您很有可能会使系统崩溃。

对我来说,这是一个顿悟,当我意识到在FlexGanttFX中保证高性能的唯一方法是对每个包含画布的单元使用ListView。 不幸的是,该框架的代码太复杂,无法在一个小博客中与您共享。因此,我写了一个小例子来说明基本概念。 下图显示了运行示例时的结果。 ListView显示的数据涵盖了我生命中的岁月,并且每年的每一天都有随机生成的值。

bildschirmfoto-2015-06-15-um-19-25-50

最重要的类称为CanvasCell 。 它是一个专门的列表视图单元,其中包含标签和画布。 标签用于显示年份,画布用于绘制图表。

import java.util.Collections;
import java.util.List;import javafx.geometry.Pos;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.control.ContentDisplay;
import javafx.scene.control.Label;
import javafx.scene.control.ListCell;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.paint.CycleMethod;
import javafx.scene.paint.LinearGradient;
import javafx.scene.paint.Stop;public class CanvasCell extends ListCell<YearEntry> {private Label yearLabel;private ResizableCanvas canvas;public CanvasCell() {/** Important, otherwise we will keep seeing a horizontal scrollbar.*/setStyle("-fx-padding: 0px;");yearLabel = new Label();yearLabel.setStyle("-fx-padding: 10px; -fx-font-size: 1.2em; -fx-font-weight: bold;");StackPane.setAlignment(yearLabel, Pos.TOP_LEFT);/** Create a resizable canvas and bind its width and height to the width* and height of the table cell.*/canvas = new ResizableCanvas();canvas.widthProperty().bind(widthProperty());canvas.heightProperty().bind(heightProperty());StackPane pane = new StackPane();pane.getChildren().addAll(yearLabel, canvas);setGraphic(pane);setContentDisplay(ContentDisplay.GRAPHIC_ONLY);}@Overrideprotected void updateItem(YearEntry entry, boolean empty) {if (empty || entry == null) {yearLabel.setText("");canvas.setData(Collections.emptyList());canvas.draw();} else {yearLabel.setText(Integer.toString(entry.getYear()));canvas.setData(entry.getValues());canvas.draw();}}/** Canvas is normally not resizable but by overriding isResizable() and* binding its width and height to the width and height of the cell it will* automatically resize.*/class ResizableCanvas extends Canvas {private List<Double> data = Collections.emptyList();public ResizableCanvas() {/** Make sure the canvas draws its content again when its size* changes.*/widthProperty().addListener(it -> draw());heightProperty().addListener(it -> draw());}@Overridepublic boolean isResizable() {return true;}@Overridepublic double prefWidth(double height) {return getWidth();}@Overridepublic double prefHeight(double width) {return getHeight();}public void setData(List<Double> data) {this.data = data;}/** Draw a chart based on the data provided by the model.*/private void draw() {GraphicsContext gc = getGraphicsContext2D();gc.clearRect(0, 0, getWidth(), getHeight());Stop[] stops = new Stop[] { new Stop(0, Color.SKYBLUE),new Stop(1, Color.SKYBLUE.darker().darker()) };LinearGradient gradient = new LinearGradient(0, 0, 0, 300, false,CycleMethod.NO_CYCLE, stops);gc.setFill(gradient);double availableHeight = getHeight() * .8;double counter = 0;for (Double value : data) {double x = getWidth() / 365 * counter;double barHeight = availableHeight * value / 100;double barWidth = getWidth() / 365 + 1;gc.fillRect(x, getHeight() - barHeight, barWidth, barHeight);counter++;}}}
}

对于数据,我们使用一个非常简单的类来存储年份和值列表。

import java.util.ArrayList;
import java.util.List;/*** Just some fake model object.*/
public class YearEntry {private int year;public YearEntry(int year) {this.year = year;}public int getYear() {return year;}private List<Double> values = new ArrayList<>();/*** Stores the values shown in the chart.*/public List<Double> getValues() {return values;}
}

以下清单显示了主类。

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.ListView;
import javafx.stage.Stage;public class CanvasApp extends Application {@Overridepublic void start(Stage stage) throws Exception {/** Create some random data for my life span.*/ObservableList<YearEntry> data = FXCollections.observableArrayList();for (int year = 1969; year < 2015; year++) {YearEntry entry = new YearEntry(year);for (int day = 0; day < 365; day++) {entry.getValues().add(Math.random() * 100);}data.add(entry);}ListView<YearEntry> listView = new ListView<>(data);listView.setCellFactory(param -> new CanvasCell());listView.setFixedCellSize(200);Scene scene = new Scene(listView);stage.setTitle("Canvas Cell");stage.setScene(scene);stage.setWidth(600);stage.setHeight(600);stage.show();}public static void main(String[] args) {launch(args);}
}

翻译自: https://www.javacodegeeks.com/2015/06/javafx-tip-20-a-lot-to-show-use-canvas.html

javafx显示image

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/337991.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言中|的含义

点击上方蓝字关注我&#xff0c;了解更多咨询||在c语言中的意思是逻辑OR&#xff08;或&#xff09;运算&#xff0c;运算符两端有一个变量为真&#xff0c;则结果为真。比如a||b表示a和b做逻辑OR&#xff08;或&#xff09;运算&#xff0c;只要有任何一个变量为“真”&#x…

30 校准_校准or质控,傻傻分不清楚

今天发个福利&#xff0c;应kkz的要求&#xff0c;聊一聊我对IVD校准和质控的个人理解。非专业科普文&#xff0c;欢迎交流&#xff5e;先来讲个小故事&#xff1a;我小的时候&#xff0c;家里用的挂钟每隔一段时间就要调准一下。那个时候没有网络&#xff0c;爸妈是对着中央新…

C语言查找数组最大最小值

点击上方蓝字关注我&#xff0c;了解更多咨询C语言查询最大最小值的实现思路&#xff1a;定一个变量存储最大值或最小值&#xff0c;变量的初始值取自数组的第一个元素&#xff0c;然后遍历数组&#xff0c;如果遍历到的元素比变量的值大&#xff0c;就把值赋给变量&#xff0c…

c语言中%s的含义你知道吗?

点击上方蓝字关注我&#xff0c;了解更多咨询%s在C语言中代表字符串型格式符&#xff0c;一般用在printf、sprintf等字符串格式化函数中&#xff0c;用于决定格式化参数的数据类型。整数类型是%d,单精度浮点类型&#xff0c;也就是小数是%f,字符类型%c%c&#xff0c;%s这些代表…

mysql 1千万 like优化_MYSQL千万级数据量的优化方法积累

1、分库分表很明显&#xff0c;一个主表(也就是很重要的表&#xff0c;例如用户表)无限制的增长势必严重影响性能&#xff0c;分库与分表是一个很不错的解决途径&#xff0c;也就是性能优化途径&#xff0c;现在的案例是我们有一个1000多万条记录的用户表members,查询起来非常之…

C语言while循环要点你会吗

点击上方蓝字关注我&#xff0c;了解更多咨询while语句在使用过程需要注意几个要点&#xff1a;一、无限循环先来看看以下的代码示例int n 0;while(n<3)printf("n %d", n);n;执行代码后&#xff0c;循环输出n0。在上述代码中&#xff0c;虽然有n自增&#xff0c…

C语言if与else匹配规则你知道多少?

点击上方蓝字关注我&#xff0c;了解更多咨询如果程序中有多个if和else&#xff0c;那如何配对&#xff0c;if和else的匹配规则简单总结为以下两点&#xff1a;1.无花括号&#xff0c;else和最近的if匹配2.有花括号&#xff0c;else和内含有if语句的第1个if语句匹配我们通过两个…

C语言中+=的含义你明白吗?

点击上方蓝字关注我&#xff0c;了解更多咨询c语言中是代表两个变量相加&#xff0c;并将答案记录在左边的变量里。比如xy实际代表的表达式为&#xff1a;xxy。这是c语言为了语言的简洁性推出的组合运算。常见的运算符都可以这样组合运算。一、源码演示&#xff1a;二、输出结果…

C语言中「」的含义

点击上方蓝字关注我&#xff0c;了解更多咨询取决于在scanf中使用还是在printf中使用。在scanf中使用&#xff0c;则添加了*的部分会被忽略&#xff0c;不会被参数获取。例如&#xff1a;int a,b;char b[10];scanf("%d%*s",&a,b)&#xff1b;输入为&#xff1a;1…

mysql ondumplictcate_4.5万字手把手教你实现MySQL TB级数据存储!!

写在前面业界对系统的高可用有着基本的要求&#xff0c;简单的说&#xff0c;这些要求可以总结为如下所示。系统架构中不存在单点问题。可以最大限度的保障服务的可用性。一般情况下系统的高可用可以用几个9来评估。所谓的几个9就是系统可以保证对外提供的服务的时间达到总时间…

c语言中+ =和=+有什么区别

点击上方蓝字关注我&#xff0c;了解更多咨询c语言中 和有什么区别&#xff1a;区别在于 是简写&#xff0c;a 1就是a a1&#xff1a;并不是简写&#xff0c;a a直接对a的赋值&#xff0c;符号代表的是正负&#xff08;完全可以省略不写&#xff09;&#xff0c;即a b其实就…

jvm7 jvm8_我们真的仍然需要32位JVM吗?

jvm7 jvm8即使在今天&#xff08;2015年&#xff09;&#xff0c;我们仍然有两个版本或Oracle HotSpot JDK –已调整为32或64位体系结构。 问题是我们是否真的想在服务器甚至笔记本电脑上使用32位JVM&#xff1f; 我们应该有很受欢迎的意见&#xff01; 如果只需要较小的堆&…

C语言中的printf函数,你觉得它简单吗?

点击上方蓝字关注我&#xff0c;了解更多咨询什么是printf函数&#xff1f;printf函数是C语言当中的输出函数&#xff0c;是用来将内容显示在屏幕上的&#xff0c;是C库中的一种函数。printf函数的用法printf函数使用起来很简单&#xff0c;格式&#xff1a;printf&#xff08;…

tp5怎么生成短链接_请问在tp5中怎样才能使用url函数?

MM们thinkphp中的自动完成函数调用有两种不同的方法&#xff0c;分别为callback与function;12345678910namespace Home\Model;use Think\Model;class UserModel extends Model{protected $_auto array (array(status,1), // 新增的时候把status字段设置为1array(password,md5,…

cuba 平台_CUBA平台的理念

cuba 平台最近发生了很多事。 在CUBA于6月1日正式发布之后&#xff0c;我们推出了新版本&#xff0c;在一些Java网站上发布了我们的第一篇文章&#xff0c;并在伦敦的Devoxx UK会议上介绍了该平台 。 但是在热潮继续之前&#xff0c;大约是时候阐明CUBA背后的哲学了。 与企业软…

C语言进阶:探讨函数指针的的定义与使用

点击上方蓝字关注我&#xff0c;了解更多咨询函数指针今天准备和大家讲解一下我们C语言编程的函数指针&#xff0c;为什么函数也需要指针呢&#xff1f;我是这样理解的函数指针方便我们对函数的调用&#xff0c;当我们需要把一个函数作为参数传给其他参数的时候就必须使用函数指…

jvm gc停顿_在JVM中记录世界停顿

jvm gc停顿不同的事件可能导致JVM暂停所有应用程序线程。 这种暂停称为世界停止&#xff08;STW&#xff09;暂停。 触发STW暂停的最常见原因是垃圾回收&#xff08; 例如github中的示例 &#xff09;&#xff0c;但是不同的JIT操作&#xff08; 示例 &#xff09;&#xff0c;…

-在c语言中什么含义

点击上方蓝字关注我&#xff0c;了解更多咨询->是一个整体&#xff0c;它是用于指向结构体。1.换种说法&#xff0c;如果我们在C语言中定义了一个结构体&#xff0c;然后申明一个指针指向这个结构体&#xff0c;那么我们要用指针取出结构体中的数据&#xff0c;就要用到“-&…

putchar在c语言中怎么用

点击上方蓝字关注我&#xff0c;了解更多咨询putchar在c语言中的作用是向终端输出一个字符&#xff0c;也属于一种C库函数&#xff0c;包含在C标准库中&#xff0c;putchar是一个字符输出&#xff0c;用于快写的时候很方便。首先来看一下c语言的含义&#xff0c;c语言是一门面向…

hibernate查询缓存_Hibernate查询缓存如何工作

hibernate查询缓存介绍 现在&#xff0c;我已经介绍了实体和集合缓存&#xff0c;现在该研究查询缓存的工作原理了。 查询缓存与实体严格相关&#xff0c;它在搜索条件和满足该特定查询过滤器的实体之间绘制关联。 像其他Hibernate功能一样&#xff0c;查询缓存也不像人们想象…