Как создавать динамически изменяемые формы в javafx? - PullRequest
3 голосов
/ 27 марта 2012

У меня три проблемы:

  1. Я хочу создать изменяемые размеры фигур с рамкой ...
  2. Я также хочу знать, как выбрать дочерний элемент на панели.
  3. Я создаю несколько фигур на панели.Я хочу изменить некоторые свойства этой формы, скажем Fill. Как мне это сделать?

Спасибо

1 Ответ

9 голосов
/ 27 марта 2012

Следующий пример ответит на ваши вопросы:

  • для (1) используется привязка, размер соединительной панели с размером прямоугольника
  • для (2) добавляет setOnMouseClick для каждого прямоугольника, в котором хранится нажатый один в поле lastOne.
  • для (3) см. Код setOnMouseClick() обработчик

    public class RectangleGrid extends Application {
    
      private Rectangle lastOne;
    
      public void start(Stage stage) throws Exception {
        Pane root = new Pane();
    
        int grid_x = 7; //number of rows
        int grid_y = 7; //number of columns
    
        // this binding will find out which parameter is smaller: height or width
        NumberBinding rectsAreaSize = Bindings.min(root.heightProperty(), root.widthProperty());
    
        for (int x = 0; x < grid_x; x++) {
            for (int y = 0; y < grid_y; y++) {
                Rectangle rectangle = new Rectangle();
                rectangle.setStroke(Color.WHITE);
    
                rectangle.setOnMouseClicked(new EventHandler<MouseEvent>() {
                    @Override
                    public void handle(MouseEvent t) {
                        if (lastOne != null) {
                            lastOne.setFill(Color.BLACK);
                        }
                        // remembering clicks
                        lastOne = (Rectangle) t.getSource();
                        // updating fill
                        lastOne.setFill(Color.RED);
                    }
                });
    
                // here we position rects (this depends on pane size as well)
                rectangle.xProperty().bind(rectsAreaSize.multiply(x).divide(grid_x));
                rectangle.yProperty().bind(rectsAreaSize.multiply(y).divide(grid_y));
    
                // here we bind rectangle size to pane size 
                rectangle.heightProperty().bind(rectsAreaSize.divide(grid_x));
                rectangle.widthProperty().bind(rectangle.heightProperty());
    
                root.getChildren().add(rectangle);
            }
        }
    
        stage.setScene(new Scene(root, 500, 500));
        stage.show();
      }
    
      public static void main(String[] args) { launch(); }
    }
    
...