powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / javafx TreeView<Label> исчезают элементы при перемещении по ним
12 сообщений из 12, страница 1 из 1
javafx TreeView<Label> исчезают элементы при перемещении по ним
    #38438425
Niky4000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хочется красить цветами текст в 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
javafx TreeView<Label> исчезают элементы при перемещении по ним
    #38438430
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ошибок в консоли нет?
...
Рейтинг: 0 / 0
javafx TreeView<Label> исчезают элементы при перемещении по ним
    #38438436
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему вы решили что кастомизация отображения делается именно так, а не через TreeCell, например?
...
Рейтинг: 0 / 0
javafx TreeView<Label> исчезают элементы при перемещении по ним
    #38438437
Niky4000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нету никаких. Всё чисто.
Видимо, какие-то глюки с отрисовкой.
Проверил под виндовозом - там версия java такая же 1.7.0_25 и проблема такая же.
...
Рейтинг: 0 / 0
javafx TreeView<Label> исчезают элементы при перемещении по ним
    #38438442
Niky4000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TreeCell?
Ну, смотрел примеры в JavaDoc.
Подумал, что если Есть TreeView<String>, то должен быть и TreeView<Что угодно>.
...
Рейтинг: 0 / 0
javafx TreeView<Label> исчезают элементы при перемещении по ним
    #38438448
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
<Что угодно> это контейнер для данных.
...
Рейтинг: 0 / 0
javafx TreeView<Label> исчезают элементы при перемещении по ним
    #38438453
Niky4000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не, ну понятно.
Почему я не могу вместо String сунуть Label или Table?
Я могу сунуть Label, но это криво работает.
...
Рейтинг: 0 / 0
javafx TreeView<Label> исчезают элементы при перемещении по ним
    #38438466
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Niky4000Не, ну понятно.
Почему я не могу вместо String сунуть Label или Table?
Я могу сунуть Label, но это криво работает.
http://docs.oracle.com/javafx/2/api/javafx/scene/control/Cell.html
...
Рейтинг: 0 / 0
javafx TreeView<Label> исчезают элементы при перемещении по ним
    #38438525
Niky4000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
javafx TreeView<Label> исчезают элементы при перемещении по ним
    #38439239
Niky4000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну, вот более рабочий пример:
Код: 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
javafx TreeView<Label> исчезают элементы при перемещении по ним
    #38463374
danatriel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем доброго дня. Возникла проблемка.
Исходные данные:
Дерево, каждый элемент дерева имеет иконку, элемент дерева имеет контекстное меню, при помощи которого происходит выделение элемента (замена "иконки"). так вот если делать все через 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
javafx TreeView<Label> исчезают элементы при перемещении по ним
    #38463386
danatriel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
точнее неясности заключаются в том, что если проскроллить дерево, вернуться обратно и выделить 1 элемент - выделится несколько элементов, если еще раз проскроллить - выделение становится таким как и должно быть
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / javafx TreeView<Label> исчезают элементы при перемещении по ним
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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