Первый раз что-то спрашиваю здесь, извините за неправильный английский + Я здесь, потому что меня расстраивает поведение моего кода, которое не поможет моему английскому.
Используя javaFX (только с java, без FXML), я пытаюсь сделать Узел похожим на это
(Таким образом, умножает HBox в 2 VBox в одном HBox)
И всякий раз, когда я перемещаю его (при перетаскивании), он перемещается по экрану, но если я использую ChangeListener для свойств дочернего элемента, я вижу, что они вообще не перемещаются в реальности (layoutX или translateX остаются при начальных значениях), что вызывает у меня много проблем, так как я хочу подключить ячейку узлов (и щелкать по вещам не очень весело).
И когда я попытался форсировать его, связав translateXProperty и все те вещи, которые оправдывает содержимое моего Node, и код говорит мне, что это то место, где он должен быть, но на экране это просто исчезло (см. Рис.)
(Существует только смещение значения X, потому что я использовал bind () только для translateX, чтобы показать проблему).
Извините, это плохая картина, но я не знаю, как показать иначе, и я не думаю, что давать свой код было бы уместно, так как я уважал первую организацию изображений. Я пытался использовать Group, Pane и подклассы, но это не работает, и система HBox + VBox организовывает мой контент так, как я хочу.
Я смотрел на документ, и из-за моего английского должно быть что-то, чего я вообще не понимал, но хорошо, я не знаю, так что если у вас есть идеи, если возможно, где я могу сохранить это организация, спасибо за вашу помощь.
РЕДАКТИРОВАТЬ:
Как некоторые люди спрашивают здесь, как это выглядит в коде, с некоторым Слушателем, чтобы увидеть, что контент не перемещается, и потому что мне нужно иметь возможность сделать связь между кругами HBox, мне нужно, чтобы они имели правильные значения перевода .
import javafx.application.Application;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
public class Main extends Application {
private double mouseX;
private double mouseY;
private double sourceX;
private double sourceY;
public static void main(String[] args)
{
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception
{
HBox root = new HBox(10);
// Making the first col (see first image)
VBox left = new VBox(5
, new HBox(10, new Circle(10, Color.WHEAT), new Rectangle(50, 20, Color.CORAL))
, new HBox(10, new Circle(10, Color.WHEAT), new Rectangle(50, 20, Color.CORAL))
);
// Making the second col (see first image)
VBox right = new VBox(5);
right.translateXProperty().addListener((observable, oldValue, newValue) -> System.out.println("right VBox " +
"translate to " + newValue)); // Isn't called
root.getChildren().add(right);
// Making the first row of the right col (see first image)
HBox row0Right = new HBox(10);
row0Right.translateXProperty().addListener((observable, oldValue, newValue) -> System.out.println("row0Right " +
"HBox translate to " + newValue)); // Isn't called
row0Right.getChildren().add(new Rectangle(50, 20, Color.CYAN));
// Making a Circle with a translate Listener
Circle circle = new Circle(10, Color.CRIMSON);
circle.translateXProperty().addListener((observable, oldValue, newValue) -> System.out.println("circle " +
"row0col1 translate to " + newValue)); // Isn't called
row0Right.getChildren().add(circle);
// Making the second row of the right col (see first image)
HBox row1Right = new HBox(10);
row1Right.translateXProperty().addListener((observable, oldValue, newValue) -> System.out.println("row1Right " +
"HBox translate to " + newValue)); // Isn't called
row1Right.getChildren().add(new Rectangle(50, 20, Color.CYAN));
row1Right.getChildren().add(new Circle(10, Color.CRIMSON));
right.getChildren().addAll(row0Right, row1Right);
root.setOnMousePressed(event ->
{
mouseX = event.getSceneX();
mouseY = event.getSceneY();
sourceX = ((Node) (event.getSource())).getTranslateX();
sourceY = ((Node) (event.getSource())).getTranslateY();
});
root.setOnMouseDragged(event ->
{
double newX = sourceX + event.getSceneX() - mouseX;
double newY = sourceY + event.getSceneY() - mouseY;
((Node) (event.getSource())).setTranslateX(newX);
((Node) (event.getSource())).setTranslateY(newY);
});
root.translateXProperty().addListener((observable, oldValue, newValue) -> System.out.println("root translate " +
"to " + newValue)); // Is the only one called
primaryStage.setTitle("Hello World");
primaryStage.setScene(new Scene(root, 720, 720));
primaryStage.show();
}
}
РЕДАКТИРОВАТЬ 2:
Я заметил, что если я использую Rectangle в качестве движущегося корня, и формы связывания преобразуются в него, все в порядке, но я предпочитаю, как HBox / VBox размещает детей, так как я не хочу устанавливать каждый пиксель в x, y, ширина и высота для каждой фигуры, связанной с моим основным прямоугольником (который может стать большим количеством фигур), когда я могу использовать этот шаблон Box.