首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >反思(JavaFx)

反思(JavaFx)
EN

Stack Overflow用户
提问于 2018-05-23 22:14:33
回答 2查看 98关注 0票数 0

在做了相当多的搜索之后,我把它留给你。在我的应用程序JavaFx中,我使用内省自动生成一个gridPane (然后插入到对话框中)。因此,我有TableView,当用户双击上面的按钮时,它会生成包含这个TableView列的对话框。因此,在此对话框中有TextFields,它允许修改TableView中字段的值。但是,我不能通过内省来拿回我的属性的价值,以及如何取回由于内省而创建的textFields的值?这是我的反思方法:

代码语言:javascript
复制
    public static  GridPane analyserChamp(Etudiant etu) {
    List<String> list = new ArrayList<>();
    Class<? extends Etudiant> classPixel = etu.getClass();
    Field attribut[] = classPixel.getDeclaredFields();
    GridPane gp = new GridPane();

    int i=0;
    for(Field p : attribut) {
        list.add(p.getName());
        Label lab = new Label();

        if(!p.getName().equals("classe")) {
            TextField l = new TextField();
            lab.setText(p.getName());
            gp.add(l, 1, i);

        }else {
            ComboBox<String> cb = new ComboBox<String>();
            cb.getItems().addAll("1Bi","2Bi","3Bi");
            gp.add(cb, 1, i);
        }

        gp.add(lab, 0, i);
        i++;

    }
    return gp;
}

下面是我调用内省方法的代码:

代码语言:javascript
复制
                if(e.getClickCount() == 2) {
                Dialog<Etudiant> dialog = new Dialog<>();
                Etudiant test = tableViewEtudiant.getSelectionModel().getSelectedItems().get(0);

                if(test!=null) {

                    dialog.setTitle("Editor");
                    dialog.setHeaderText("You can update your question");
                    dialog.getDialogPane().setContent(Analysateur.analyserChamp(test));

                    ButtonType buttonCancel = new ButtonType("Cancel", ButtonData.CANCEL_CLOSE);
                    ButtonType buttonOk = new ButtonType("Ok", ButtonData.OK_DONE);
                    dialog.getDialogPane().getButtonTypes().addAll(buttonOk,buttonCancel);
                    //Confirmation of the edition
                    Optional<Etudiant> result = dialog.showAndWait();
                    //Edition  of the question in the gson file
                    GridPane tmp = Analysateur.analyserChamp(test);
                    if(result.isPresent()) {

                        // Here ?????

                    }

                }

预先感谢;)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-23 22:43:55

解决这个问题的方法有很多,例如,您可以使用userData属性来存储属性的键,这样以后可以在GridPane子节点上迭代,并在Dialog结果转换器中获得每个值。

当您回顾类Etudiant

代码语言:javascript
复制
if(!p.getName().equals("classe")) {
            TextField l = new TextField();
            l.setUserData(p.getName()); //Store the attribute name in the TextField
            lab.setText(p.getName());
            gp.add(l, 1, i);

        }else {
            ComboBox<String> cb = new ComboBox<String>();
            cb.setUserData(p.getName()); //Store the attribute name in the ComboBox
            cb.getItems().addAll("1Bi","2Bi","3Bi");
            gp.add(cb, 1, i);
        }

当你创建Dialog

代码语言:javascript
复制
    Dialog<Etudiant> dialog = new Dialog<>();
    ...
    GridPane content = Analysateur.analyserChamp(test); //Keep the content accesible
    ...
    dialog.getDialogPane().setContent(content);
    ...
    dialog.setResultConverter(button -> { //Convert the result
        Etudiant result = new Etudiant();
        for (Node child : content.getChildren()) { //Iterate over the GridPane children
            if (child instanceof TextField) {
                String attribute = ((TextField)child).getUserData();
                String value = ((TextField)child).getTest();
                //Set the value in the result attribute via instrospection
            }
            if (child instanceof ComboBox) {
                //Do the same with combos
            }
        }
    });
票数 0
EN

Stack Overflow用户

发布于 2018-05-23 23:44:50

存储一个Supplier,用于获取Map<Field, Supplier<?>>中某个字段的输入值。通过这种方式,您可以遍历地图的条目并检索赋值:

代码语言:javascript
复制
public class ReflectionDialog<T> extends Dialog<T> {

    public ReflectionDialog(Class<T> type, Supplier<T> factory) throws IllegalAccessException {
        GridPane gp = new GridPane();
        Field[] fields = type.getDeclaredFields();

        // stores getters for result value
        final Map<Field, Supplier<?>> results = new HashMap<>();

        int i = 0;
        for (Field field : fields) {
            if (String.class.equals(field.getType())) {
                String name = field.getName();
                Node input;
                Supplier<?> getter;
                if ("classe".equals(name)) {
                    ComboBox<String> cb = new ComboBox<>();
                    cb.getItems().addAll("1Bi", "2Bi", "3Bi");
                    getter = cb::getValue;
                    input = cb;
                } else {
                    TextField l = new TextField();
                    getter = l::getText;
                    input = l;
                }
                results.put(field, getter);
                gp.addRow(i, new Label(name), input);
                i++;
            }
        }

        getDialogPane().setContent(gp);
        getDialogPane().getButtonTypes().addAll(ButtonType.OK, ButtonType.CANCEL);
        setResultConverter(buttonType -> {
            if (buttonType == ButtonType.OK) {
                // create & initialize new object
                final T object = factory.get();
                results.forEach((k, v) -> {
                    try {
                        k.set(object, v.get());
                    } catch (IllegalAccessException ex) {
                        throw new IllegalStateException(ex);
                    }
                });
                return object;
            } else {
                return null;
            }
        });
    }

}
代码语言:javascript
复制
public class A {

    String classe;
    String value;

    @Override
    public String toString() {
        return "A{" + "classe=" + classe + ", value=" + value + '}';
    }

}
代码语言:javascript
复制
ReflectionDialog<A> dialog = new ReflectionDialog<>(A.class, A::new);
A result = dialog.showAndWait().orElse(null);
System.out.println(result);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50498241

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档