Во время работы над FlexGanttFX мне пришлось много работать с узлом JavaFX Canvas. Я использую его для визуализации действий на временной шкале. Каждая строка в диаграмме Ганта представляет собой узел Canvas. Пользователь имеет возможность изменить размер каждой строки в отдельности. Поэтому я должен был найти лучший способ изменить размер холста, который из коробки не может быть изменен. Список ниже показывает, как это можно сделать.
Основные необходимые шаги:
- Создайте подкласс Canvas .
- Переопределите метод isResizable () и верните true.
- Переопределите методы prefWidth () и prefHeight () . Вернуть значения Canvas.getWidth () и Canvas.getHeight ().
- Добавьте слушателей к свойствам ширины и высоты Canvas , чтобы вызвать перерисовку при изменении размера холста.
- Свяжите свойства ширины и высоты Canvas со свойствами ширины и высоты родительской панели.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
import javafx.application.Application;import javafx.scene.Scene;import javafx.scene.canvas.Canvas;import javafx.scene.canvas.GraphicsContext;import javafx.scene.layout.StackPane;import javafx.scene.paint.Color;import javafx.stage.Stage;/** * Tip 1: A canvas resizing itself to the size of * the parent pane. */public class Tip1ResizableCanvas extends Application { class ResizableCanvas extends Canvas { public ResizableCanvas() { // Redraw canvas when size changes. widthProperty().addListener(evt -> draw()); heightProperty().addListener(evt -> draw()); } private void draw() { double width = getWidth(); double height = getHeight(); GraphicsContext gc = getGraphicsContext2D(); gc.clearRect(0, 0, width, height); gc.setStroke(Color.RED); gc.strokeLine(0, 0, width, height); gc.strokeLine(0, height, width, 0); } @Override public boolean isResizable() { return true; } @Override public double prefWidth(double height) { return getWidth(); } @Override public double prefHeight(double width) { return getHeight(); } } @Override public void start(Stage stage) throws Exception { ResizableCanvas canvas = new ResizableCanvas(); StackPane stackPane = new StackPane(); stackPane.getChildren().add(canvas); // Bind canvas size to stack pane size. canvas.widthProperty().bind( stackPane.widthProperty()); canvas.heightProperty().bind( stackPane.heightProperty()); stage.setScene(new Scene(stackPane)); stage.setTitle("Tip 1: Resizable Canvas"); stage.show(); } public static void main(String[] args) { launch(args); }} |
При запуске вы должны увидеть следующее:
| Ссылка: | JavaFX Совет 1: изменяемый размер холста от нашего партнера JCG Дирка Леммермана в блоге Pixel Perfect . |
