第一次在这里问一些事情,抱歉我的英语不好+我在这里,因为我对代码的行为感到不安,这对我的英语没有帮助。
使用javaFX(仅限java,没有FXML)我试图让Node看起来像这样
(因此在一个HBox中将HBox与2个VBox相乘) 每当我移动它(在Drag上)时,它会在屏幕上移动,但是如果我在子项的属性上使用ChangeListener,我可以看到它们实际上根本没有移动(layoutX或translateX保持在起始值),这导致我很多麻烦,因为我想连接节点的单元格(点击不存在的东西非常有趣)。
当我试图通过绑定translateXProperty和所有那些东西强制它时,我的Node的内容juste消失了,代码告诉我它应该是它的位置,但是在屏幕上它已经消失了(见图片)
(X值只有一个偏移,因为我只在translateX上使用bind()来显示问题)。 对不起,这是一些不好的油漆,但我不知道如何显示,我不认为给我的代码是相关的,因为我尊重第一个图片组织。我尝试过使用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中设置每个px, y,当我可以使用那些Box模式时,每个形状的宽度和高度都会绑定到我的核心矩形(可能会变成很多形状)。