Статьи

JavaFX Совет 1: изменяемый размер холста

Во время работы над 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);
    }
}

При запуске вы должны увидеть следующее:

bildschirmfoto-2014-04-10-эм-11-30-31

Ссылка: JavaFX Совет 1: изменяемый размер холста от нашего партнера JCG Дирка Леммермана в блоге Pixel Perfect .