Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Java fx получить содержимое панели / 8 сообщений из 8, страница 1 из 1
09.07.2018, 11:11
    #39671496
Павел Гужанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java fx получить содержимое панели
Здравствуйте.

Имеется TabPane с вкладками Tab. Мне необходимо создать новую вкладки и скопировать на нее содержимое (контролы и их размещение, а в идеале и содержимое, если пользователь в них что-то изменил) одной из существующих вкладок.
Подскажите, как это можно реализовать.
...
Рейтинг: 0 / 0
09.07.2018, 11:13
    #39671497
Павел Гужанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java fx получить содержимое панели
Новую вкладку создать легко. Добавить на нее контрол - тоже проблем не составляет. Вопрос в том, как скопировать достаточно сложную форму полностью.
...
Рейтинг: 0 / 0
09.07.2018, 12:05
    #39671531
Павел Гужанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java fx получить содержимое панели
Нашел вот такой класс, добавил его в проект:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
import java.util.ArrayList;
import java.util.List;

import javafx.scene.Node;
import javafx.scene.layout.Pane;

public class NodeUtils {
	public static <T extends Pane> List<Node> paneNodes(T parent) {
        return paneNodes(parent, new ArrayList<Node>());
    }

    private static <T extends Pane> List<Node> paneNodes(T parent, List<Node> nodes) {
        for (Node node : parent.getChildren()) {
            if (node instanceof Pane) {
                paneNodes((Pane) node, nodes);
            } else {
                nodes.add(node);
            }
        }
        return nodes;
    }
}



Использую вот таким образом:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
@FXML
    private void addTab() {
    	List<Node> nodes = NodeUtils.paneNodes(newRequestAncor);
    	Tab tabP = new Tab("Новая вкладка");
    	HBox hbox = new HBox();
        hbox.getChildren().addAll(nodes);
        tabP.setContent(hbox);
    	mainTabPane.getTabs().addAll(tabP);
    }



Работает следующим образом:
1. Вкладка, на которой находится newRequestAncor, и которую я пытаюсь скопировать, становится пустой
2. На новую вкладку заносятся компоненты из копируемой вкладки, но размещение не копируется и на форме получается каша.

Мне же нужно, чтобы компоненты скопировались вместе с размещением, и чтобы исходная вкладка осталась.
Как мне это победить?
...
Рейтинг: 0 / 0
09.07.2018, 12:17
    #39671540
Valery Shiskin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java fx получить содержимое панели
Павел Гужанов,
Если, к прммеру у Вас на некотором Pane находится Button, то как Вы эту кнопку скопируете? Если требуется копировать только объекты типа Pane без их содержимого, отличного от Pane, то все можно сделать.
...
Рейтинг: 0 / 0
09.07.2018, 12:23
    #39671543
Павел Гужанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java fx получить содержимое панели
В список нодов из показанного мной кода попадают все ноды, в том числе и button. И они вставляются в новую вкладку. Но почему-то удаляются из исходной вкладки
...
Рейтинг: 0 / 0
09.07.2018, 12:27
    #39671547
Valery Shiskin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java fx получить содержимое панели
Павел Гужанов,

Помимо всего прочего, Вы пытаетесь копировать ССЫЛКИ на узлы. При этом, попытка добавить сhild элемент одного Pane приводит к тому. что автоматически удаляется этот child из списка children исходного Pane. Общее правило: Объект типа Node может быть в одном и только одном списке children.
...
Рейтинг: 0 / 0
09.07.2018, 12:48
    #39671560
Павел Гужанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java fx получить содержимое панели
Valery ShiskinПавел Гужанов,

Помимо всего прочего, Вы пытаетесь копировать ССЫЛКИ на узлы. При этом, попытка добавить сhild элемент одного Pane приводит к тому. что автоматически удаляется этот child из списка children исходного Pane. Общее правило: Объект типа Node может быть в одном и только одном списке children.
Так, это прояснило, почему исходная панель становится пустой. Спасибо.
А можно как-то скопировать (клонировать) не ссылки, а сами узлы?
...
Рейтинг: 0 / 0
09.07.2018, 13:06
    #39671572
Valery Shiskin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Java fx получить содержимое панели
Павел Гужанов,

Можно. Но надо учитывать, что, Вам потребуется самому создать что-то вроде метода cloneNode(source-node) для каждого, используемого Вами узла. Например, Button имеет свойство graphic, содержащее null или объект Node. Поэтому, чтобы создать клон объекта Button, Вам потребуется создать новый объект типа Button, создать новый объект, соответствующий свойству graphic и назначит его свойству graphic новому Button. Другие javafx nodes могут иметь еще более сложную структуру. К сожалению javafx не обязывает реализовывать метод clone для объектов типа Node. Да это, в принципе невозможно.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Java fx получить содержимое панели / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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