如何将JavaFX对象链接到项目中的对象?

时间:2014-04-29 14:35:53

标签: java javafx

我是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战士,也不是说英语的人。

1 个答案:

答案 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));

我试图尽可能用英语翻译我的例子。我希望它可以提供帮助。