Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / javafx.scene.control.TreeView / 6 сообщений из 6, страница 1 из 1
26.08.2013, 10:40:43
    #38377186
R@mon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
javafx.scene.control.TreeView
День добрый!
В Example 13-4 в документации http://docs.oracle.com/javafx/2/ui_controls/tree-view.htm#BABDEADA блестяще описано как заполнить TreeItem и TreeView значениями связанного класса Employee
Код: java
1.
2.
3.
4.
    
for (Employee employee : employees) {
      TreeItem<String> empLeaf = new TreeItem<String>(employee.getName());
    ...


далее, переопределяя CellFactory, описано как пользователь может изменить значение TreeItem (не значение связанного класса Employee)

У меня задача обратная,
мне нужно обновлять TreeView в момент когда изменяется значение Employee? Значение у меня изменяется по таймеру
...
Рейтинг: 0 / 0
26.08.2013, 11:46:30
    #38377242
R@mon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
javafx.scene.control.TreeView
Если свернуть(развернуть) любой узел TreeView, то все значения обновляются как надо. Что нужно сделать, что бы при обновлении Employee, TreeView обновлялся автоматически?
...
Рейтинг: 0 / 0
26.08.2013, 20:18:00
    #38377866
avp.mk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
javafx.scene.control.TreeView
Это баг.

Можно пересоздать объект данных (employee) другим текстом, присвоить его TreeItem. (я так сделал год назад)
treeItem.setValue(treeData);

Можно во вьюхе менять графику..

Можно рефлекшеном подкрасться наверное, но я не пробовал.
...
Рейтинг: 0 / 0
26.08.2013, 22:39:40
    #38377948
R@mon
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
javafx.scene.control.TreeView
avp.mkМожно пересоздать объект данных (employee) другим текстом, присвоить его TreeItem. (я так сделал год назад)
treeItem.setValue(treeData);

Можно чуть подробнее?
Вот код моей программы, что и куда мне нужно проставить?
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
package ru.schegrov;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class TreeEmployee extends Application {

  public static void main(String[] args) {
    launch(args);
  }

  @Override
  public void start(Stage stage) throws Exception {
    stage.setTitle("Tree View");
    //dataItem
    Employee employee = new Employee("Data Item");
    employee.jobStart();
    TreeItem<Employee> dataItem = new TreeItem<Employee>(employee);
    //rootItem
    TreeItem<Employee> rootItem = new TreeItem<Employee>(new Employee("Root Item"));
    rootItem.setExpanded(true);    
    rootItem.getChildren().add(dataItem);
    //
    TreeView<Employee> tree = new TreeView<Employee>(rootItem);
    stage.setScene(new Scene(tree, 300, 250));
    stage.show();
  }
}

package ru.schegrov;

import java.awt.event.ActionListener;
import javafx.event.ActionEvent;
import javax.swing.Timer;

public class Employee {
  private String name;
  private int count = 0;

  public Employee(String name) {  this.name = name;  }
  public String getName() {    return name;  }
  public void setName(String fName) {    name = fName;  }
  public String toString() {
    return name + " (" + count + ")";
  }

  public void jobStart() {new Timer(3000, new ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent ev) { //
      count++;
    }}).start();
  }
}
...
Рейтинг: 0 / 0
27.08.2013, 09:09:40
    #38378116
avp.mk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
javafx.scene.control.TreeView
Вообще можно не пересоздаыать, можно просто поставить value == null, затем вернуть обратно.
Тоже конечно дикость, но меньше))

TreeEmployee.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
package ru.schegrov;

import javafx.application.Application;
import static javafx.application.Application.launch;
import javafx.scene.Scene;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.stage.Stage;

public class TreeEmployee extends Application {

    @Override public void start(Stage stage) {
        stage.setTitle("Tree View");
        
        Employee employee = new Employee("Data Item");
        employee.jobStart();
        TreeItem<Employee> treeItemEmployee = new TreeItemMod<>(employee);
        
        TreeItem<Employee> treeItemRoot = new TreeItem<>(new Employee("Root Item"));
        treeItemRoot.setExpanded(true);
        treeItemRoot.getChildren().add(treeItemEmployee);
        
        stage.setScene(new Scene(new TreeView<>(treeItemRoot), 300, 250));
        stage.show();
    }
    
    //<editor-fold defaultstate="collapsed" desc="main">
    public static void main(String[] args) { launch(args); }
    //</editor-fold>
}

TreeData.java
Код: java
1.
2.
3.
4.
5.
6.
package ru.schegrov;

public interface TreeData {
    TreeItemMod<? extends TreeData> getTreeItem();
    void setTreeItem(TreeItemMod<? extends TreeData> treeItem);
}

TreeItemMod.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
package ru.schegrov;

import javafx.scene.control.TreeItem;

public class TreeItemMod<T extends TreeData> extends TreeItem<T> {

    public TreeItemMod(T t) {
        super(t);
        t.setTreeItem(this);
    }
}

Employee.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
package ru.schegrov;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Timer;

public class Employee implements TreeData {

    public Employee(String name) {
        this.name = name;
    }
    
    //<editor-fold defaultstate="collapsed" desc="name">
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    //</editor-fold>
    
    @Override public String toString() {
        return name + " (" + count + ")";
    }
    
    private int count;
    
    public void jobStart() {
        new Timer(3000, new ActionListener() {
            @Override public void actionPerformed(ActionEvent e) {
                count++;
                if (treeItem != null) {
                    treeItem.setValue(null);
                    treeItem.setValue(Employee.this);
                } else {
                    System.out.println("Не задан treeItem (нельзя его обновить)");
                }
            }
        }).start();
    }
    
    //<editor-fold defaultstate="collapsed" desc="treeItem">
    private TreeItemMod<TreeData> treeItem;

    @Override public TreeItemMod<? extends TreeData> getTreeItem() {
        return treeItem;
    }

    @Override public void setTreeItem(TreeItemMod<? extends TreeData> treeItem) {
        this.treeItem = (TreeItemMod<TreeData>) treeItem; //наверное можно сделать чище, сделаешь - покажи
    }
    //</editor-fold>
}

...
Рейтинг: 0 / 0
27.08.2013, 13:21:49
    #38378557
avp.mk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
javafx.scene.control.TreeView
Reflection way

TreeEmployee.java (не изменился)
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
package ru.schegrov;

import javafx.application.Application;
import static javafx.application.Application.launch;
import javafx.scene.Scene;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.stage.Stage;

public class TreeEmployee extends Application {

    @Override public void start(Stage stage) {
        stage.setTitle("Tree View");

        Employee employee = new Employee("Data Item");
        employee.jobStart();
        TreeItem<Employee> treeItemEmployee = new TreeItemMod<>(employee);

        TreeItem<Employee> treeItemRoot = new TreeItem<>(new Employee("Root Item"));
        treeItemRoot.setExpanded(true);
        treeItemRoot.getChildren().add(treeItemEmployee);

        stage.setScene(new Scene(new TreeView<>(treeItemRoot), 300, 250));
        stage.show();
    }

    //<editor-fold defaultstate="collapsed" desc="main">
    public static void main(String[] args) { launch(args); }
    //</editor-fold>
}

TreeData.java (не изменился)
Код: java
1.
2.
3.
4.
5.
6.
package ru.schegrov;

public interface TreeData {
    TreeItemMod<? extends TreeData> getTreeItem();
    void setTreeItem(TreeItemMod<? extends TreeData> treeItem);
}

TreeItemMod.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
package ru.schegrov;

import java.lang.reflect.Method;
import javafx.scene.control.TreeItem;
import static javafx.scene.control.TreeItem.valueChangedEvent;

public class TreeItemMod<T extends TreeData> extends TreeItem<T> {

    public TreeItemMod(T t) {
        super(t);
        t.setTreeItem(this);
    }

    public void update() {
        try {
            FireEventHolder.INSTANCE.invoke(this, new TreeModificationEvent(valueChangedEvent(), this, valueProperty().get()));
        } catch (Exception e) { //здесь кроме checked исключений нужно ловить NPE
            System.out.println("Reflection doesn't work");
            T value = getValue(); //действуем более примитивно..
            setValue(null);
            setValue(value);
        }
    }

    private static class FireEventHolder {

        private static final Method INSTANCE = getFireEvent();

        private static Method getFireEvent() {
            try {
                Method method = TreeItem.class.getDeclaredMethod("fireEvent", TreeModificationEvent.class);
                method.setAccessible(true);
                return method;
            } catch (NoSuchMethodException | SecurityException ex) {
                return null;
            }
        }
    }
}

Employee.java (почти не изменился)
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
package ru.schegrov;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Timer;

public class Employee implements TreeData {

    public Employee(String name) {
        this.name = name;
    }

    //<editor-fold defaultstate="collapsed" desc="name">
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    //</editor-fold>

    @Override public String toString() {
        return name + " (" + count + ")";
    }

    private int count;

    public void jobStart() {
        new Timer(3000, new ActionListener() {
            @Override public void actionPerformed(ActionEvent e) {
                count++;
                if (treeItem != null) {
                    treeItem.update();
                } else {
                    System.out.println("Не задан treeItem (нельзя его обновить)");
                }
            }
        }).start();
    }

    //<editor-fold defaultstate="collapsed" desc="treeItem">
    private TreeItemMod<TreeData> treeItem;

    @Override public TreeItemMod<? extends TreeData> getTreeItem() {
        return treeItem;
    }

    @Override public void setTreeItem(TreeItemMod<? extends TreeData> treeItem) {
        this.treeItem = (TreeItemMod<TreeData>) treeItem; //наверное можно сделать чище, сделаешь - покажи
    }
    //</editor-fold>
}

...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / javafx.scene.control.TreeView / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]