javafx显示image

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

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

最重要的类称为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

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

  1. 【链接】调查显示:超20%美国大学生曾花学生贷款投

    看了这则新闻之后,实在是不知道该说些什么好... 转载:[链接]调查显示:超20%美国大学生曾花学生贷款投 扫描关注:热爱生活的大叔 (转载本站文章请注明作者和出处 热爱生活的大叔-uniquezha ...

  2. linux vim 高亮查找,vim技巧:用列表形式显示所有搜索到的内容,去掉搜索内容的高亮...

    本篇文章介绍 vim 的一些使用技巧: 用列表形式显示所有搜索到的内容 去掉搜索内容的高亮 用列表形式显示所有搜索到的内容 vim 在文件内用 / 或者 ? 进行查找,不会列出所有查找到的内容,需要通 ...

  3. 《树莓派实战秘籍》——1.20 技巧20使用Swap添加额外的内存

    本节书摘来异步社区<树莓派实战秘籍>一书中的第1章,第1.20节,作者:[美]Ruth Suehle ,Tom Callaway,更多章节内容可以访问云栖社区"异步社区" ...

  4. Qt之界面实现技巧——包括任务栏不显示,自定义窗体,最大化最小化按钮等等全面总结

    总结一下,在开发Qt的过程中的一些技巧!可遇而不可求... 一.主界面 1.窗口 最小化 最大化 关闭按钮.显示状态自定义 setWindowFlags(Qt::CustomizeWindowHint ...

  5. deepin升级到20.2,开机显示deepin LOGO之后屏幕黑屏解决办法

    deepin升级到20.2,开机显示deepin LOGO之后屏幕黑屏解决办法 黑屏后按快捷键: ctrl+atl +F2进入终端. 在终端执行命令: sudo apt install deepin- ...

  6. 【技巧】Vivado 仿真器simulation显示模拟波形图(非数字波形)

    [技巧]Vivado 仿真器simulation显示模拟波形图(非数字波形) 设置步骤 其他 设置步骤 ①打开Vivado的任意一个可以运行的工程 ②点击Simulation -> Run Be ...

  7. html怎样分级显示,小技巧之分级显示详解

    小伙伴们有没有见过下面这两种样式的表格呢? 他们有相似的特点:都有1.2.3这种按钮: 都有+.-号按钮: 点击1.2.3或+.-号可以快速隐藏.显示行或列. 有时候我们想看总体,有时候想看局部,通过 ...

  8. micropython lcd触摸屏显示中文_基于Micropython的天气显示 进程帖

    本帖最后由 michael_llh 于 2019-4-17 10:06 编辑 更下项目的进程哈! 项目的思路很简单,就是从网上获取天气信息,然后进行显示! 很尽量把过程写清楚,方便大家的交流和学习. ...

  9. mac 不显示 外接屏幕_苹果电脑外接显示器显示不出来 - 卡饭网

    mac苹果电脑的颜色反转显示即视力障碍模式如何开启 mac苹果电脑的颜色反转显示即视力障碍模式如何开启 Mac苹果电脑对视力障碍的人群来说并不友好,这时候我们就需要开启颜色反转显示即视力障碍模式,那么 ...

最新文章

  1. Java map 知识
  2. 自动化测试前序(https://blog.csdn.net/ling_mochen/article/details/79314118)
  3. C# 中奇妙的函数–6. 五个序列聚合运算(Sum, Average, Min, Max,Aggregate)
  4. Python中深拷贝与浅拷贝的区别?
  5. typedef有什么用_我是怎么用C++恰饭吃的
  6. 使用gridlayout布局后,因某些原因又删除,并整理文件夹结构时,Unable to resolve target #39;android-7#39;...
  7. 因观看大量违规视频致抑郁,审核人员起诉抖音
  8. html5标签对js影响,浅谈JS对html标签的属性的干预以及对CSS样式表属性的干预
  9. 文件编程概念(C语言库函数系统调用API)
  10. Modbus家族之 RTU
  11. swfupload 实例 php,SWFUpload在PHP中使用实例教程
  12. 投影仪怎么安装才能得到最大的屏幕?学会这个投影距离公式轻松拿捏
  13. 如何构建高质量的 QA 问答知识库
  14. 深入浅出系列1:词向量
  15. Vulhub靶场的搭建(下载和安装)
  16. 电磁兼容——电子系统的EMC要求
  17. 如何在C语言中把int*转化为char*
  18. 一生应该必看的20个故事
  19. spf打包解包_2020最新CentOS(linux下)安装7-Zip(7za压缩软件)以及解压命令,只打包不压缩,加密的方法...
  20. 详解centos6和centos7防火墙的关闭

热门文章

  1. P3521-[POI2011]ROT-Tree【线段树合并】
  2. codeforces1457 C. Bouncing Ball
  3. 【dfs】I Like Matrix!
  4. 【模拟】游戏(jzoj 1614)
  5. 【动态规划】分组背包 (ssl 2291)
  6. SpringCloud Zuul(三)之常见用法
  7. 2.数据湖DeltaLake之DDL操作
  8. mybatis源码阅读(八) ---Interceptor了解一下
  9. jar包天天见,可是你知道它的运行机制吗
  10. MySQL datediff()函数