我是Java和JavaFX的新手。
我实际上试图模拟一棵树。 Java看起来很不错。 树的根由treenode定义。每个treenode都有孩子(没有孩子的treenode是叶子)。
我设计了有孩子的方法,使用控制台保存和恢复树。没问题。
下一步是绘制一个窗口,在窗格内部和我的节点一样多的FXML对象。 问题是:如何将按钮与树节点相关联,这样当我单击按钮时我可以回到我的树节点?
我尝试使用bt.setUserData(TreeNode节点),但在使用鼠标事件处理程序时无法恢复它
@FXML protected void clicDessin(MouseEvent event) throws IOException { // teh anchorpane xhere I want to throw some information about my tree-node AnchorPane arbre = FXMLLoader.load(getClass().getResource("noeud.fxml")); Noeud n = ????? AnchorPane.setBottomAnchor(arbre, 0.0); AnchorPane.setTopAnchor(arbre, 0.0); ((Pane) Main.root.lookup("#pdt")).getChildren().add(arbre); ((TextField) arbre.lookup("#nomnoeud")).setText(n.getNom()); ((TextArea) arbre.lookup("#descnoeud")).setText(n.getDesc()); }
当然clicDessin是与我的按钮点击鼠标相关联的方法。
任何帮助表示赞赏。 请保持尽可能简单。我不是一个Java战士,也不是说英语的人。
答案 0 :(得分:0)
好的,我找到答案了,很明显,对不起。 如果有人需要,我会发布答案。
要在窗格或场景中定位形状,我需要的只是添加一个孩子。 如果我需要一个自定义对象和一个子对象之间的链接,我所要做的就是创建一个扩展Parent的新类,它将一个自定义对象公开为属性(如果我希望这个属性可见,则public是必需的。)
所以我创建了一个DrawTreenode类
public class DrawTreeNode extends Parent {
public TreeNode monNoeud;
private double x, y, h, l;
Rectangle fond = new Rectangle();
Label l1 = new Label();
Label l2 = new Label();
实现事件处理程序的基本方法
public DrawTreeNode(TreeNode n, double posX, double posY,
double largeur, double hauteur)
{
TreeNode = n;
x = posX;
y = posY;
h = hauteur;
l = largeur;
可以根据TreeNode属性修改JavaFX对象
l2.setText(String.valueOf(TreeNode.numChildren()));
l2.relocate(x+10, y+15);
this.getChildren().add(l2);
我可以实现引用(或至少访问)我的自定义属性
的事件处理程序 this.setOnMouseClicked(new EventHandler() {
public void handle(MouseEvent me) {
appuyer();
}
});
}
此处,它使用自定义对象的属性
public void appuyer() {
AnchorPane arbre = null;
try {
arbre = FXMLLoader.load(getClass().getResource("noeud.fxml"));
((Pane) Main.root.lookup("#pdt")).getChildren().add(arbre);
((TextField) arbre.lookup("#nomnoeud")).setText(monNoeud.getNom());
((TextArea) arbre.lookup("#descnoeud")).setText(monNoeud.getDesc());
((TextField) arbre.lookup("#numfils")).setText(Integer.toString(monNoeud.numEnfants()));
((TextArea) Main.root.lookup("#txtaide")).setText("Cliquer pour voir/modifier le noeud.");
} catch (IOException e) {
e.printStackTrace();
}
}
我可以使用标准类Shape的javaFX add方法在任何Pane中的项目中的任何位置添加GraphTree(基本上是自定义JavaFX形状)。
((Pane) Main.root.lookup("#grille")).getChildren().add(new DrawTreenode(((Treenode) element),
calculX(((Treenode) element), largeurcell), calculY(((Treenode) element), hauteurcell),
largeurcell, hauteurcell));
我试图尽可能用英语翻译我的例子。我希望它可以提供帮助。