Spec-Zone.ru › OpenJavaFX 24

Класс TreeItem<T>

java.lang.Object
javafx.scene.control.TreeItem<T>
Type Parameters:
T - Тип свойства value в TreeItem.
Все реализуемые интерфейсы:
EventTarget
Непосредственные известные подклассы:
CheckBoxTreeItem
public class TreeItem<T> extends Object implements EventTarget
Модель для отдельного узла, предоставляющего иерархию значений для элемента управления, такого как TreeView. Модель может быть реализована таким образом, что значения загружаются в память по мере необходимости.

Модель позволяет регистрировать слушателей, которые будут уведомлены об изменении количества элементов, их позиции или если сами значения изменятся. Однако обратите внимание, что TreeItem не является узлом, и поэтому визуальные события не будут генерироваться на TreeItem. Для получения этих событий необходимо добавить соответствующих наблюдателей к экземплярам TreeCell (через пользовательскую фабрику ячеек — см. документацию класса Cell для получения более подробной информации).

В простейшем случае экземпляры TreeItem могут быть созданы в памяти следующим образом:


 TreeItem<String> root = new TreeItem<String>("Root Node");
 root.setExpanded(true);
 root.getChildren().addAll(
     new TreeItem<String>("Item 1"),
     new TreeItem<String>("Item 2"),
     new TreeItem<String>("Item 3")
 );
 TreeView<String> treeView = new TreeView<String>(root);
 
Этот подход хорошо подходит для простых древовидных структур или когда данные не чрезмерно большие (так что они могут легко поместиться в памяти). В ситуациях, когда размер древовидной структуры неизвестен (и поэтому потенциально очень большой), есть возможность создавать экземпляры TreeItem по требованию с высокой эффективностью использования памяти. Для демонстрации этого код ниже создает обозреватель файловой системы:

  private TreeView buildFileSystemBrowser() {
      TreeItem<File> root = createNode(new File("/"));
      return new TreeView<File>(root);
  }

  // This method creates a TreeItem to represent the given File. It does this
  // by overriding the TreeItem.getChildren() and TreeItem.isLeaf() methods
  // anonymously, but this could be better abstracted by creating a
  // 'FileTreeItem' subclass of TreeItem. However, this is left as an exercise
  // for the reader.
  private TreeItem<File> createNode(final File f) {
      return new TreeItem<File>(f) {
          // We cache whether the File is a leaf or not. A File is a leaf if
          // it is not a directory and does not have any files contained within
          // it. We cache this as isLeaf() is called often, and doing the
          // actual check on File is expensive.
          private boolean isLeaf;

          // We do the children and leaf testing only once, and then set these
          // booleans to false so that we do not check again during this
          // run. A more complete implementation may need to handle more
          // dynamic file system situations (such as where a folder has files
          // added after the TreeView is shown). Again, this is left as an
          // exercise for the reader.
          private boolean isFirstTimeChildren = true;
          private boolean isFirstTimeLeaf = true;

          @Override public ObservableList<TreeItem<File>> getChildren() {
              if (isFirstTimeChildren) {
                  isFirstTimeChildren = false;

                  // First getChildren() call, so we actually go off and
                  // determine the children of the File contained in this TreeItem.
                  super.getChildren().setAll(buildChildren(this));
              }
              return super.getChildren();
          }

          @Override public boolean isLeaf() {
              if (isFirstTimeLeaf) {
                  isFirstTimeLeaf = false;
                  File f = (File) getValue();
                  isLeaf = f.isFile();
              }

              return isLeaf;
          }

          private ObservableList<TreeItem<File>> buildChildren(TreeItem<File> TreeItem) {
              File f = TreeItem.getValue();
              if (f != null && f.isDirectory()) {
                  File[] files = f.listFiles();
                  if (files != null) {
                      ObservableList<TreeItem<File>> children = FXCollections.observableArrayList();

                      for (File childFile : files) {
                          children.add(createNode(childFile));
                      }

                      return children;
                  }
              }

              return FXCollections.emptyObservableList();
          }
      };
  }
События TreeItem

TreeItem поддерживает ту же концепцию «всплывания» событий, что и в других частях графического интерфейса сцены. Это означает, что нет необходимости прослушивать события на всех TreeItem (и это определенно не рекомендуется!). Лучшим и гораздо более эффективным решением является прикрепление слушателей событий к элементу TreeView root. Пока существует путь между местом, где происходит событие, и корневым TreeItem, событие будет всплывать к корневому элементу.

Важно отметить, что TreeItem не является узлом, а это означает, что будут переданы только типы событий, определенные в TreeItem. Для прослушивания общих событий (например, взаимодействий с мышью) необходимо добавить необходимые слушатели к cells, содержащимся в TreeView (предоставлением cell factory).

Класс TreeItem определяет ряд событий с определенной иерархией. Они показаны ниже (переходите по ссылкам, чтобы узнать больше о каждом типе события):

  • TreeItem.treeNotificationEvent()
    • TreeItem.valueChangedEvent()
    • TreeItem.graphicChangedEvent()
    • TreeItem.expandedItemCountChangeEvent()
      • TreeItem.branchExpandedEvent()
      • TreeItem.branchCollapsedEvent()
      • TreeItem.childrenModificationEvent()

Отступы, показанные выше, обозначают отношение между типами событий. Например, все типы событий TreeItem имеют treeNotificationEvent() в качестве своего родительского типа события, а типы событий ветвления expand / collapse оба являются treeNotificationEvent(). По соображениям производительности рекомендуется прослушивать только те события, которые вам необходимы. Это означает, что, например, лучше прослушивать TreeItem.valueChangedEvent(), чем TreeItem.treeNotificationEvent().

С:
JavaFX 2.0
См. также:
  • TreeView

Краткое описание вложенных классов

Модификатор и тип Класс Описание
static class  TreeItem.TreeModificationEvent<T>
Событие Event, содержащее релевантную информацию обо всех изменениях TreeItem.

Краткое описание свойств

Тип Свойство Описание
final BooleanProperty expanded
Состояние раскрытия данного TreeItem.
final ObjectProperty<Node> graphic
Узел, обычно отображаемый слева от свойства value.
final ReadOnlyBooleanProperty leaf
Свойство, определяющее, является ли TreeItem листом (т.е. у него нет дочерних элементов).
final ReadOnlyObjectProperty<TreeItem<T>> parent
Свойство, представляющее родительский элемент TreeItem.
final ObjectProperty<T> value
Свойство, представляющее данные, специфичные для приложения, содержащиеся в данном TreeItem.

Краткое описание конструкторов

Конструктор Описание
TreeItem()
Создаёт пустой TreeItem.
TreeItem(T value)
Создаёт TreeItem со свойством value, установленным на переданный объект.
TreeItem(T value, Node graphic)
Создаёт TreeItem со свойством value, установленным на переданный объект, и графическим элементом, заданным переданным узлом.

Краткое описание методов

Модификатор и тип Метод Описание
<E extends Event>
void
addEventFilter(EventType<E> eventType, EventHandler<? super E> eventHandler)
Регистрирует обработчик событий для этого целевого объекта.
<E extends Event>
void
addEventHandler(EventType<E> eventType, EventHandler<? super E> eventHandler)
Регистрирует обработчик событий для этого целевого объекта.
static <T> EventType<TreeItem.TreeModificationEvent<T>> branchCollapsedEvent()
Тип события, используемый, когда TreeItem получает изменение свойства expanded, в результате чего TreeItem находится в свернутом состоянии.
static <T> EventType<TreeItem.TreeModificationEvent<T>> branchExpandedEvent()
Тип события, используемый, когда TreeItem получает изменение свойства expanded, в результате чего TreeItem находится в раскрытом состоянии.
EventDispatchChain buildEventDispatchChain(EventDispatchChain tail)
Строит цепочку обработки событий для этого целевого объекта.
static <T> EventType<TreeItem.TreeModificationEvent<T>> childrenModificationEvent()
Тип события, используемый, когда TreeItem получает непосредственное изменение списка дочерних элементов.
static <T> EventType<TreeItem.TreeModificationEvent<T>> expandedItemCountChangeEvent()
Основной тип события, используемый при изменении TreeItem, влияющем на количество видимых дочерних элементов.
final BooleanProperty expandedProperty()
Состояние раскрытия данного TreeItem.
ObservableList<TreeItem<T>> getChildren()
Дочерние элементы этого TreeItem.
final Node getGraphic()
Возвращает узел, обычно отображаемый слева от свойства value.
final TreeItem<T> getParent()
Родительский элемент данного TreeItem.
final T getValue()
Возвращает данные, специфичные для приложения, представленные этим TreeItem.
static <T> EventType<TreeItem.TreeModificationEvent<T>> graphicChangedEvent()
Тип события, используемый, когда TreeItem получает изменение свойства graphic.
final ObjectProperty<Node> graphicProperty()
Узел, обычно отображаемый слева от свойства value.
final boolean isExpanded()
Возвращает состояние раскрытия данного TreeItem.
boolean isLeaf()
TreeItem является листом, если у него нет дочерних элементов.
final ReadOnlyBooleanProperty leafProperty()
Свойство, определяющее, является ли TreeItem листом (т.е. у него нет дочерних элементов).
TreeItem<T> nextSibling()
Возвращает следующего брата TreeItem.
TreeItem<T> nextSibling(TreeItem<T> afterNode)
Возвращает следующего брата после заданного узла.
final ReadOnlyObjectProperty<TreeItem<T>> parentProperty()
Свойство, представляющее родительский элемент TreeItem.
TreeItem<T> previousSibling()
Возвращает предыдущего брата TreeItem.
TreeItem<T> previousSibling(TreeItem<T> beforeNode)
Возвращает предыдущего брата после заданного узла.
final void setExpanded(boolean value)
Устанавливает состояние раскрытия данного TreeItem.
final void setGraphic(Node value)
Устанавливает узел, обычно отображаемый слева от свойства value.
final void setValue(T value)
Устанавливает данные, специфичные для приложения, представленные этим TreeItem.
String toString()
Возвращает строковое представление этого объекта TreeItem.
static <T> EventType<TreeItem.TreeModificationEvent<T>> treeNotificationEvent()
Базовый тип события, обозначающий, что событие произошло внутри TreeItem.
static <T> EventType<TreeItem.TreeModificationEvent<T>> valueChangedEvent()
Тип события, используемый, когда TreeItem получает изменение свойства value.
final ObjectProperty<T> valueProperty()
Свойство, представляющее данные, специфичные для приложения, содержащиеся в данном TreeItem.

Методы, объявленные в классе java.lang.Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait

Методы, объявленные в интерфейсе javafx.event.EventTarget

removeEventFilter, removeEventHandler

Подробности свойства

значение

public final ObjectProperty<T> valueProperty
Свойство, представляющее данные, специфичные для приложения, содержащиеся в этом элементе дерева.
См. также:
  • getValue()
  • setValue(T)
  • valueProperty()

график

public final ObjectProperty<Node> graphicProperty
Узел, который обычно отображается слева от свойства значения. Для лучшего эффекта, это, как правило, изображение 16x16.
См. также:
  • getGraphic()
  • setGraphic(Node)
  • graphicProperty()

расширенный

public final BooleanProperty expandedProperty
Состояние расширения этого элемента дерева.
См. также:
  • isExpanded()
  • setExpanded(boolean)
  • expandedProperty()

лист

public final ReadOnlyBooleanProperty leafProperty
Представляет свойство листа элемента дерева, которое равно true, если элемент дерева не имеет дочерних элементов.
См. также:
  • isLeaf()
  • leafProperty()

родитель

public final ReadOnlyObjectProperty<TreeItem<T>> parentProperty
Свойство, представляющее родителя этого элемента дерева.
См. также:
  • getParent()
  • parentProperty()

Подробности конструктора

TreeItem

public TreeItem()
Создает пустой элемент TreeItem.

TreeItem

public TreeItem(T value)
Создает TreeItem со свойством значения, установленным на указанный объект.
Параметры:
value - Объект, который должен храниться в качестве значения этого элемента TreeItem.

TreeItem

public TreeItem(T value, Node graphic)
Создает TreeItem со свойством значения, установленным на указанный объект, и графиком, установленным на указанный узел.
Параметры:
value - Объект, который должен храниться в качестве значения этого элемента TreeItem.
graphic - Узел, который будет отображаться в TreeView рядом с этим элементом TreeItem.

Подробности метода

treeNotificationEvent

public static <T> EventType<TreeItem.TreeModificationEvent<T>> treeNotificationEvent()
Базовый тип события, используемый для указания того, что событие произошло в элементе дерева. Когда событие происходит в элементе дерева, событие генерируется для любых слушателей элемента дерева, в котором произошло событие, прежде чем оно «поднимется» вверх по цепочке элементов дерева, следуя свойству родительского элемента дерева. Это повторяется до тех пор, пока не будет достигнут элемент дерева, родитель которого равен null. В этот момент событие перестаёт «подниматься» и больше не распространяется. Это означает, что события, происходящие в элементе дерева, могут быть относительно дешёвыми, так как слушателю нужно установить слушатель только на корневой узел TreeView, чтобы быть уведомлённым о событиях, происходящих в любой точке дерева.
Параметры типа:
T - Тип значения, содержащегося в элементе дерева.
Возвращает:
базовый тип события, когда в элементе дерева произошло событие

expandedItemCountChangeEvent

public static <T> EventType<TreeItem.TreeModificationEvent<T>> expandedItemCountChangeEvent()
Общий тип события, используемый, когда элемент дерева получает изменение, приводящее к изменению количества видимых дочерних элементов. Обычно это достигается с помощью одного из подтипов этого типа события (см. branchExpandedEvent(), branchCollapsedEvent() и childrenModificationEvent() для трёх подтипов).
Параметры типа:
T - Тип значения, содержащегося в элементе дерева.
Возвращает:
Общий тип события, когда элемент дерева получает изменение
С тех пор как:
JavaFX 8.0

branchExpandedEvent

public static <T> EventType<TreeItem.TreeModificationEvent<T>> branchExpandedEvent()
Тип события, используемый, когда элемент дерева получает изменение своего свойства expanded, так что элемент дерева теперь в расширенном состоянии.
Параметры типа:
T - Тип значения, содержащегося в элементе дерева.
Возвращает:
Тип события, используемый, когда элемент дерева получает изменение

branchCollapsedEvent

public static <T> EventType<TreeItem.TreeModificationEvent<T>> branchCollapsedEvent()
Тип события, используемый, когда элемент дерева получает изменение своего свойства expanded, так что элемент дерева теперь в свёрнутом состоянии.
Параметры типа:
T - Тип значения, содержащегося в элементе дерева.
Возвращает:
Тип события, когда элемент дерева получает изменение

childrenModificationEvent

public static <T> EventType<TreeItem.TreeModificationEvent<T>> childrenModificationEvent()
Тип события, используемый, когда элемент дерева получает непосредственное изменение своего списка дочерних элементов.
Параметры типа:
T - Тип значения, содержащегося в элементе дерева.
Возвращает:
Тип события, когда элемент дерева получает непосредственное изменение своего списка дочерних элементов

valueChangedEvent

public static <T> EventType<TreeItem.TreeModificationEvent<T>> valueChangedEvent()
Тип события, используемый, когда элемент дерева получает изменение своего свойства значения.
Параметры типа:
T - Тип значения, содержащегося в элементе дерева.
Возвращает:
Тип события, когда элемент дерева получает изменение своего свойства значения

graphicChangedEvent

public static <T> EventType<TreeItem.TreeModificationEvent<T>> graphicChangedEvent()
Тип события, используемый, когда элемент дерева получает изменение своего свойства graphic.
Параметры типа:
T - Тип значения, содержащегося в элементе дерева.
Возвращает:
Тип события, когда элемент дерева получает изменение своего свойства graphic

setValue

public final void setValue(T value)
Устанавливает данные, специфичные для приложения, представленные этим элементом TreeItem.
Параметры:
value - данные, специфичные для приложения

getValue

public final T getValue()
Возвращает данные, специфичные для приложения, представленные этим элементом TreeItem.
Возвращает:
данные, представленные этим элементом TreeItem

valueProperty

public final ObjectProperty<T> valueProperty()
Свойство, представляющее данные, специфичные для приложения, содержащиеся в этом элементе дерева.
Возвращает:
свойство, представляющее данные, специфичные для приложения, содержащиеся в этом элементе дерева
См. также:
  • getValue()
  • setValue(T)

setGraphic

public final void setGraphic(Node value)
Устанавливает узел, который, как правило, отображается слева от свойства значения. Для лучшего эффекта, это, как правило, изображение 16x16.
Параметры:
value - узел графики, который будет отображаться пользователю.

getGraphic

public final Node getGraphic()
Возвращает узел, который обычно отображается слева от свойства значения. Для лучшего эффекта, это, как правило, изображение 16x16.
Возвращает:
узел графики, который будет отображаться пользователю.

graphicProperty

public final ObjectProperty<Node> graphicProperty()
Узел, который, как правило, отображается слева от свойства значения. Для лучшего эффекта, это, как правило, изображение 16x16.
Возвращает:
Узел, который обычно отображается слева от свойства значения
См. также:
  • getGraphic()
  • setGraphic(Node)

setExpanded

public final void setExpanded(boolean value)
Устанавливает состояние раскрытия этого элемента дерева. Это не оказывает влияния на элемент дерева без дочерних элементов. Однако, в элементе дерева с дочерними элементами результат переключения этого свойства заключается в том, что визуально дочерние элементы либо станут видимыми, либо скрытыми, в зависимости от того, установлено ли свойство expanded в true или false.
Параметры:
value - Если у этого элемента дерева есть дочерние элементы, вызов setExpanded с true приведет к отображению дочерних элементов. Вызов setExpanded с false скроет все дочерние элементы, принадлежащие элементу дерева.

isExpanded

public final boolean isExpanded()
Возвращает состояние раскрытия этого элемента дерева.
Возвращает:
Возвращает состояние раскрытия этого элемента дерева.

expandedProperty

public final BooleanProperty expandedProperty()
Состояние раскрытия этого элемента дерева.
Возвращает:
Свойство состояния раскрытия элемента дерева
См. также:
  • isExpanded()
  • setExpanded(boolean)

isLeaf

public boolean isLeaf()
Элемент дерева является листом, если у него нет дочерних элементов. Метод isLeaf, конечно, может быть переопределен подклассами для поддержки альтернативных способов определения того, как элемент дерева может быть листом, но общая предпосылка остается неизменной: лист не может быть раскрыт пользователем и, следовательно, не будет отображать узел раскрытия или реагировать на запросы раскрытия.
Возвращает:
true, если у этого элемента дерева нет дочерних элементов

leafProperty

public final ReadOnlyBooleanProperty leafProperty()
Представляет свойство листа элемента дерева, которое равно true, если у элемента дерева нет дочерних элементов.
Возвращает:
свойство листа элемента дерева
См. также:
  • isLeaf()

getParent

public final TreeItem<T> getParent()
Родитель этого элемента дерева. Каждый элемент дерева может иметь не более одного родителя. Если у элемента дерева нет родителя, он представляет корень в модели дерева.
Возвращает:
Родитель этого элемента дерева или null, если у элемента дерева нет родителя.

parentProperty

public final ReadOnlyObjectProperty<TreeItem<T>> parentProperty()
Свойство, представляющее родителя этого элемента дерева.
Возвращает:
свойство родителя этого элемента дерева
См. также:
  • getParent()

getChildren

public ObservableList<TreeItem<T>> getChildren()
Дочерние элементы этого элемента дерева. Этот метод вызывается часто, поэтому рекомендуется, чтобы возвращаемый список кешировался любыми реализациями элемента дерева.
Возвращает:
список, содержащий дочерние элементы дерева, принадлежащие элементу дерева.

previousSibling

public TreeItem<T> previousSibling()
Возвращает предыдущего брата элемента дерева. Порядок основан на позиции элемента дерева относительно его братьев в списке дочерних элементов, принадлежащих родителю элемента дерева.
Возвращает:
Элемент дерева, являющийся предыдущим братом текущего элемента дерева, или null, если такой брат не найден.

previousSibling

public TreeItem<T> previousSibling(TreeItem<T> beforeNode)
Возвращает предыдущего брата после данного узла. Порядок основан на позиции данного элемента дерева относительно его братьев в списке дочерних элементов, принадлежащих родителю элемента дерева.
Параметры:
beforeNode - Элемент дерева, для которого ищется предыдущий брат.
Возвращает:
Элемент дерева, являющийся предыдущим братом заданного элемента дерева, или null, если такой брат не найден.

nextSibling

public TreeItem<T> nextSibling()
Возвращает следующего брата элемента дерева. Порядок основан на позиции элемента дерева относительно его братьев в списке дочерних элементов, принадлежащих родителю элемента дерева.
Возвращает:
Элемент дерева, являющийся следующим братом текущего элемента дерева, или null, если такой брат не найден.

nextSibling

public TreeItem<T> nextSibling(TreeItem<T> afterNode)
Возвращает следующего брата после данного узла. Порядок основан на позиции данного элемента дерева относительно его братьев в списке дочерних элементов, принадлежащих родителю элемента дерева.
Параметры:
afterNode - Элемент дерева, для которого ищется следующий брат.
Возвращает:
Элемент дерева, являющийся следующим братом заданного элемента дерева, или null, если такой брат не найден.

toString

public String toString()
Возвращает строковое представление этого TreeItem объекта.
Переопределяет:
toString в классе Object
Возвращает:
строковое представление этого TreeItem объекта.

buildEventDispatchChain

public EventDispatchChain buildEventDispatchChain(EventDispatchChain tail)
Описание скопировано из интерфейса: EventTarget
Создает цепочку обработки событий для этого целевого объекта. Цепочка обработки событий содержит обработчики событий, которые могут быть заинтересованы в обработке событий, направленных на этот EventTarget. Этот целевой объект событий не добавляется автоматически в цепочку, поэтому, если он хочет обрабатывать события, ему необходимо добавить EventDispatcher для себя в цепочку.

В случае, если целевой объект событий является частью иерархии, цепочка для него обычно строится из обработчиков событий, собранных от корня иерархии до целевого объекта событий.

Цепочка обработки событий создается путем модификаций предоставленной начальной цепочки обработки событий. Возвращаемая цепочка должна иметь начальную цепочку в конце, поэтому обработчики должны быть добавлены в начало начальной цепочки.

Вызывающий метод не должен предполагать, что начальная цепочка остается неизменной, а также что возвращаемое значение будет ссылаться на другую цепочку.

Указано:
buildEventDispatchChain в интерфейсе EventTarget
Параметры:
tail - начальная цепочка для построения
Возвращает:
результирующая цепочка обработки событий для этого целевого объекта

addEventHandler

public <E extends Event> void addEventHandler(EventType<E> eventType, EventHandler<? super E> eventHandler)
Регистрирует обработчик событий для этого целевого объекта.

Обработчик вызывается, когда целевой объект получает Event указанного типа во время фазы всплытия доставки событий.

Класс TreeItem позволяет регистрировать слушателей, которые будут уведомляться при изменении количества элементов, их позиции или при изменении самих значений. Обратите внимание, что TreeItem не является Node, и поэтому визуальные события на нем не будут генерироваться. Для получения этих событий необходимо добавить соответствующих наблюдателей к экземплярам TreeCell через пользовательский фабричный метод ячейки (см. документацию класса Cell для получения дополнительных сведений).

Указано:
addEventHandler в интерфейсе EventTarget
Параметры типов:
E - класс события обработчика
Параметры:
eventType - тип событий, получаемых обработчиком
eventHandler - обработчик событий

addEventFilter

public <E extends Event> void addEventFilter(EventType<E> eventType, EventHandler<? super E> eventHandler)
Регистрирует фильтр событий для этого целевого объекта.

Фильтр вызывается, когда целевой объект получает Event указанного типа во время фазы захвата доставки событий.

Класс TreeItem позволяет регистрировать слушателей, которые будут уведомляться при изменении количества элементов, их позиции или при изменении самих значений. Обратите внимание, что TreeItem не является Node, и поэтому визуальные события на нем не будут генерироваться. Для получения этих событий необходимо добавить соответствующих наблюдателей к экземплярам TreeCell через пользовательский фабричный метод ячейки (см. документацию класса Cell для получения дополнительных сведений).

Указано:
addEventFilter в интерфейсе EventTarget
Параметры типов:
E - класс события фильтра
Параметры:
eventType - тип событий, получаемых фильтром
eventHandler - фильтр событий

Отправить сообщение об ошибке или предложить улучшение
Copyright © 2008, 2025, Oracle и/или его аффилированные лица. Все права защищены.

© 2008, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from JavaFX API Documentation.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Java, JavaFX and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API