Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / javafx TreeView<Label> исчезают элементы при перемещении по ним / 12 сообщений из 12, страница 1 из 1
23.10.2013, 14:55:54
    #38438425
Niky4000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
javafx TreeView<Label> исчезают элементы при перемещении по ним
Хочется красить цветами текст в TreeView. Следовательно, нужно использовать TreeView<Label>, а не TreeView<String>.
Проблема в том, что при перемещении по дереву элементы пропадают визуально в случае TreeView<Label>, а в случае TreeView<String> не пропадают. Если провести мышкой по ним, то они снова отрисовываются.
Это глюк JavaFX? Или что-то у меня неправильно написано?
ОС Linux.
java -version
java version "1.7.0_25"
Java(TM) SE Runtime Environment (build 1.7.0_25-b15)
Java HotSpot(TM) 64-Bit Server VM (build 23.25-b01, mixed mode)

Код: sql
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.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
public class GUITest extends Application {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }
    
    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("Hello World!");
        
        
        final MyLabel label = new MyLabel("Item 1");
        label.setTextFill(Color.web("#FF0000"));
        
        
 TreeItem<MyLabel> item = new TreeItem<MyLabel>(new MyLabel("Root Node"));
 item.setExpanded(true);
 item.getChildren().addAll(
         new TreeItem<MyLabel>(label),
     new TreeItem<MyLabel>(new MyLabel("Item 1")),
     new TreeItem<MyLabel>(new MyLabel("Item 2")),
     new TreeItem<MyLabel>(new MyLabel("Item 3")),
     new TreeItem<MyLabel>(new MyLabel("Item 2")),
     new TreeItem<MyLabel>(new MyLabel("Item 3")),
     new TreeItem<MyLabel>(new MyLabel("Item 2")),
     new TreeItem<MyLabel>(new MyLabel("Item 3")),
     new TreeItem<MyLabel>(new MyLabel("Item 2")),
     new TreeItem<MyLabel>(new MyLabel("Item 3")),
     new TreeItem<MyLabel>(new MyLabel("Item 2")),
     new TreeItem<MyLabel>(new MyLabel("Item 3")),
     new TreeItem<MyLabel>(new MyLabel("Item 2")),
     new TreeItem<MyLabel>(new MyLabel("Item 3")),
     new TreeItem<MyLabel>(new MyLabel("Item 2")),
     new TreeItem<MyLabel>(new MyLabel("Item 3")),
     new TreeItem<MyLabel>(new MyLabel("Item 2")),
     new TreeItem<MyLabel>(new MyLabel("Item 3"))
 );
 final TreeView<MyLabel> treeView = new TreeView<MyLabel>(item);
        treeView.getSelectionModel().setSelectionMode(SelectionMode.SINGLE); 
        
 TreeItem<String> item2 = new TreeItem<String>("Root Node");
 item2.setExpanded(true);
 item2.getChildren().addAll(
     new TreeItem<String>("Item 1"),
     new TreeItem<String>("Item 2"),
     new TreeItem<String>("Item 3"),
     new TreeItem<String>("Item 2"),
     new TreeItem<String>("Item 3"),
     new TreeItem<String>("Item 2"),
     new TreeItem<String>("Item 3"),
     new TreeItem<String>("Item 2"),
     new TreeItem<String>("Item 3"),
     new TreeItem<String>("Item 2"),
     new TreeItem<String>("Item 3"),
     new TreeItem<String>("Item 2"),
     new TreeItem<String>("Item 3"),
     new TreeItem<String>("Item 2"),
     new TreeItem<String>("Item 3"),
     new TreeItem<String>("Item 2"),
     new TreeItem<String>("Item 3")
 );
 final TreeView<String> treeView2 = new TreeView<String>(item2);
        
        Button btn = new Button();
        btn.setText("Say 'Hello World'");
        btn.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) {
                treeView.getSelectionModel().select(2);
                //treeView.requestFocus();
                System.out.println("Hello World!");
            }
        });
        
        
        treeView2.setLayoutX(220);
        treeView2.setLayoutY(20);
        treeView2.setMaxHeight(200);
        treeView2.setMaxWidth(200);
        
        treeView.setLayoutX(0);
        treeView.setLayoutY(20);
        treeView.setMaxHeight(200);
        treeView.setMaxWidth(200);
        
        btn.setLayoutX(440);
        btn.setLayoutY(20);
        
        primaryStage.setHeight(400);
        primaryStage.setWidth(600);
        
        TreeView<Object> tree = TreeViewBuilder.create().editable(false).cellFactory(new javafx.util.Callback<TreeView<Object>, TreeCell<Object>>() {

                                                          @Override
                                                          public TreeCell<Object> call(TreeView<Object> p) {
                                                              return TreeCellBuilder.create().graphic(new Label("Hello")).build();
                                                          }
                                                      }).build();

        
        Group group=new Group(treeView,treeView2,btn);
        
        StackPane root = new StackPane();
        root.getChildren().add(group);
        primaryStage.setScene(new Scene(root, 300, 250));
        primaryStage.show();
    }
}



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
public class MyLabel extends Label{
    public MyLabel(){
        super();
    }
    
    public MyLabel(String text){
        super(text);
    }
    public MyLabel(String text,Color color){
        super(text);
        this.setTextFill(color);
    }
    
    @Override
    public String toString(){
        return this.getText();
    }
}
...
Рейтинг: 0 / 0
23.10.2013, 14:58:27
    #38438430
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
javafx TreeView<Label> исчезают элементы при перемещении по ним
Ошибок в консоли нет?
...
Рейтинг: 0 / 0
23.10.2013, 15:02:05
    #38438436
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
javafx TreeView<Label> исчезают элементы при перемещении по ним
А почему вы решили что кастомизация отображения делается именно так, а не через TreeCell, например?
...
Рейтинг: 0 / 0
23.10.2013, 15:02:10
    #38438437
Niky4000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
javafx TreeView<Label> исчезают элементы при перемещении по ним
Нету никаких. Всё чисто.
Видимо, какие-то глюки с отрисовкой.
Проверил под виндовозом - там версия java такая же 1.7.0_25 и проблема такая же.
...
Рейтинг: 0 / 0
23.10.2013, 15:03:49
    #38438442
Niky4000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
javafx TreeView<Label> исчезают элементы при перемещении по ним
TreeCell?
Ну, смотрел примеры в JavaDoc.
Подумал, что если Есть TreeView<String>, то должен быть и TreeView<Что угодно>.
...
Рейтинг: 0 / 0
23.10.2013, 15:06:37
    #38438448
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
javafx TreeView<Label> исчезают элементы при перемещении по ним
<Что угодно> это контейнер для данных.
...
Рейтинг: 0 / 0
23.10.2013, 15:08:53
    #38438453
Niky4000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
javafx TreeView<Label> исчезают элементы при перемещении по ним
Не, ну понятно.
Почему я не могу вместо String сунуть Label или Table?
Я могу сунуть Label, но это криво работает.
...
Рейтинг: 0 / 0
23.10.2013, 15:14:08
    #38438466
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
javafx TreeView<Label> исчезают элементы при перемещении по ним
Niky4000Не, ну понятно.
Почему я не могу вместо String сунуть Label или Table?
Я могу сунуть Label, но это криво работает.
http://docs.oracle.com/javafx/2/api/javafx/scene/control/Cell.html
...
Рейтинг: 0 / 0
23.10.2013, 15:43:33
    #38438525
Niky4000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
javafx TreeView<Label> исчезают элементы при перемещении по ним
http://docs.oracle.com/javafx/2/api/javafx/scene/control/Cell.html
Это намёк на то, что я делаю это не тем способом?
Ну, может быть...
Вроде, вот так работает:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 treeView2.setCellFactory(new Callback<TreeView<String>, TreeCell<String>>() {

            @Override
            public TreeCell<String> call(TreeView<String> p) {
                TreeCell<String> cell=new TreeCell<String>();
                cell.setText("Hello");
                cell.setTextFill(Color.web("#00FF00"));
                return cell;
            }
        });


Ну, это так... пример просто.

Но мне всё-таки не понятно в чём проблема вставить в TreeItem не строку, а какой-то компонент?
В документации описаны ещё такие вещи, как CheckBoxTreeItem и ComboBoxTreeCell.
То есть я не могу просто так вставить в Node TreeView какой-то ChechBox - будут глюки?
Как-то не гибко. Или недоделанный этот TreeView какой-то?
...
Рейтинг: 0 / 0
24.10.2013, 08:23:09
    #38439239
Niky4000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
javafx TreeView<Label> исчезают элементы при перемещении по ним
Ну, вот более рабочий пример:
Код: sql
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.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
    @Override
    public void start(Stage primaryStage) {
                MyText rootNode = new MyText("Root Node");
                TreeItem<MyText> rootItem = new TreeItem<MyText>(rootNode);
                
rootItem.getChildren().addAll(
     new TreeItem<MyText>(new MyText("Item 1")),
     new TreeItem<MyText>(new MyText("Item 2",Color.web("#FF0000"))),
     new TreeItem<MyText>(new MyText("Item 3",Color.web("#00FF00"))),
     new TreeItem<MyText>(new MyText("Item 4",Color.web("#0000FF"))),
     new TreeItem<MyText>(new MyText("Item 5",Color.web("#FF00FF"))),
     new TreeItem<MyText>(new MyText("Item 6")),
     new TreeItem<MyText>(new MyText("Item 7",Color.web("#FFFF00"))),
     new TreeItem<MyText>(new MyText("Item 8")),
     new TreeItem<MyText>(new MyText("Item 9")),
     new TreeItem<MyText>(new MyText("Item 10")),
     new TreeItem<MyText>(new MyText("Item 11")),
     new TreeItem<MyText>(new MyText("Item 12")),
     new TreeItem<MyText>(new MyText("Item 13")),
     new TreeItem<MyText>(new MyText("Item 14")),
     new TreeItem<MyText>(new MyText("Item 15")),
     new TreeItem<MyText>(new MyText("Item 16")),
     new TreeItem<MyText>(new MyText("Item 17")),
     new TreeItem<MyText>(new MyText("Item 18")),
     new TreeItem<MyText>(new MyText("Item 19")),
     new TreeItem<MyText>(new MyText("Item 20"))
 );             
                rootItem.setExpanded(true);
                final TreeView<MyText> treeView = new TreeView<MyText>();
                treeView.setShowRoot(true);
                treeView.setRoot(rootItem);
                treeView.setCellFactory(new Callback<TreeView<MyText>, TreeCell<MyText>>() {

            @Override
            public TreeCell<MyText> call(TreeView<MyText> p) {
                        return new TreeCell<MyText>(){
                                        @Override
                                        protected void updateItem(MyText p, boolean empty) {
                                                super.updateItem(p, empty);
                                                if(!empty){
                                                        setText(p.getText());
                                                        setTextFill(p.getColor()==null?Color.web("#888888"):p.getColor());
                                                        final TreeCell<MyText> thisCell = this;
                                                        setOnMouseClicked(new EventHandler<MouseEvent>() {
                                                                @Override
                                                                public void handle(MouseEvent e) {
                                                                        TreeItem<MyText> item = thisCell.getTreeItem();
                                                                        System.out.println("");
                                                                        System.out.print(item.getValue().getText());
                                                                        while(item.getParent()!=null){
                                                                                item = item.getParent();
                                                                                System.out.print(" > "+item.getValue().getText());
                                                                        }
                                                                }
                                                        });
                                                }
                                        }
                                };
            }
            
            
        });
                
        Button btn = new Button();
        btn.setText("Say 'Hello World'");
        btn.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) {
                treeView.getRoot().setExpanded(true);
                treeView.getSelectionModel().select(18);
                //treeView.requestFocus();
                treeView.scrollTo(18);
                treeView.getRoot().getChildren().get(17).setValue(new MyText("Item 18",Color.web("#FF0000")));
                treeView.requestFocus();
                System.out.println("Hello World!");
            }
        });
                
//        btn.setLayoutX(440);
//        btn.setLayoutY(20);
                
                VBox box = new VBox();
                box.getChildren().addAll(treeView,btn);
                Scene scene = new Scene(box, 400, 300, Color.LIGHTGRAY);
                primaryStage.setTitle("Tree View Sample");
                primaryStage.setScene(scene);
                
                

        
                primaryStage.show();
        }
...
Рейтинг: 0 / 0
13.11.2013, 13:38:17
    #38463374
danatriel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
javafx TreeView<Label> исчезают элементы при перемещении по ним
Всем доброго дня. Возникла проблемка.
Исходные данные:
Дерево, каждый элемент дерева имеет иконку, элемент дерева имеет контекстное меню, при помощи которого происходит выделение элемента (замена "иконки"). так вот если делать все через updateItem (T item, boolean emty), то происходит непонятно что, то иконка вообще пропадает, то выделяется другой элемент. Как можно решить эту проблему?
Код: 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.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
  public void updateItem(T item, boolean empty) {
            super.updateItem(item, empty);
            if (empty) {
                setText(null);
                setGraphic(null);
            } else {
                if (isEditing()) {
                    if (edit_box.getTextControl() != null) {
                        edit_box.setGraphic(getTreeItem().getGraphic());
                        edit_box.getTextControl().setText(getString());
                    }
                    setText(null);
                    setGraphic(getTreeItem().getGraphic());
                } else {
                    setText(getString());
                    setGraphic(getTreeItem().getGraphic());
                    if (getItem() != null) {
                        if (getItem().isSelected().get()) {
                                if (getGraphic()!=null &&  getGraphic().getClass() == SelectedBox.class) {
                                    select_node = (SelectedBox) getGraphic();
                                } else {
                                    select_node = new SelectedBox(getGraphic());
                                    setGraphic(select_node);
                                }
                            
                        }
                        final T item1 = getItem();
                        item1.isSelected().addListener(new ChangeListener<Boolean>() {

                            @Override
                            public void changed(ObservableValue<? extends Boolean> ov, Boolean t, Boolean t1) {
                                if (getGraphic()==null){
                                    return;
                                }
                                        if (getGraphic()!=null &&  getGraphic().getClass() == SelectedBox.class) {
                                            select_node = (SelectedBox) getGraphic();
                                        } else {
                                            select_node = new SelectedBox(getGraphic());
                                        }
                                if (!t && t1) {
                                    setGraphic(select_node);
                                } else if (t && !t1) {
                                    setGraphic(item1.getIcon());
                                }
                                if (!item1.getActive()) {
                                    Lighting effect = new Lighting();
                                    effect.setDiffuseConstant(0.984);
                                    effect.setSpecularConstant(0.887);
                                    effect.setSpecularExponent(16.19);
                                    effect.setSurfaceScale(0.0);
                                    effect.setBumpInput(new Shadow());
                                    setEffect(effect);
                                } else {
                                    setEffect(null);
                                }
                            }
                        });
                    }
                    if (!item.getActive()) {
                        Lighting effect = new Lighting();
                        effect.setDiffuseConstant(0.984);
                        effect.setSpecularConstant(0.887);
                        effect.setSpecularExponent(16.19);
                        effect.setSurfaceScale(0.0);
                        effect.setBumpInput(new Shadow());
                        setEffect(effect);
                    }else{
                        setEffect(null);
                    }

                    setContextMenu(addMenu);

                }
            }
        }
...
Рейтинг: 0 / 0
13.11.2013, 13:44:24
    #38463386
danatriel
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
javafx TreeView<Label> исчезают элементы при перемещении по ним
точнее неясности заключаются в том, что если проскроллить дерево, вернуться обратно и выделить 1 элемент - выделится несколько элементов, если еще раз проскроллить - выделение становится таким как и должно быть
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / javafx TreeView<Label> исчезают элементы при перемещении по ним / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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