Подтвердить что ты не робот

JTree с флажками

Мне нужно добавить флажки в JTree. Пользовательский TreeCellRenderer/TreeCellEditor кажется правильным. До сих пор я использовал подход CheckBoxNodeRenderer на этой веб-странице. Он работает нормально, за исключением двух вещей:

  • есть дополнительные пробелы выше + ниже флажка; Я хотел бы сохранить его таким же, как обычный JTree.
  • Я хотел бы различать щелчок по флажку (который должен попытаться переключить флажок) и щелкнуть по тексту, связанному с этим флажком (который должен позволить прослушивателю событий интерпретировать это как щелчок по соответствующему дереву node и предпринять любые действия)

Есть ли способ сделать это? Я посмотрел на JTrees с флажками, не могу найти много. JIDE выглядит неплохо, но мне нужно использовать бесплатное программное обеспечение с открытым исходным кодом (GPL не в порядке, LGPL в порядке). (или создать мое собственное дерево флажков)

4b9b3361

Ответ 1

Что касается №2, вы можете сделать панель редактором/рендерером и добавить метку вместе с этим флажком - ярлык будет текстом, а флажок не будет содержать текст, добавленный к нему.

Ответ 2

Я знаю, что на этот вопрос уже был дан ответ, но я просто хочу прояснить некоторые моменты:

1) Общий слой JIDE имеет двойную лицензию (GPL с исключением класса и бесплатной коммерческой лицензией). Это означает, что вы можете использовать проект Common Layer без каких-либо проблем с лицензированием. Для подтверждения выполните следующую ссылку: http://www.jidesoft.com/products/oss.htm. Common Layer включает реализацию проверяемого JTree (com.jidesoft.swing.CheckBoxTree).

2) Там был блог от 2005 года от самого Учителя, Сантоша Кумара, где он объясняет, как реализовать JTree с флажками с указанными вами требованиями: http://www.jroller.com/santhosh/entry/jtree_with_checkboxes. На мой взгляд, стоит его прочитать.

Ответ 3

за предложение @aperkins это то, что я закончил делать в TableCellRenderer, кажется, что он работает хорошо:

final private JPanel nodeRenderer = new JPanel();
final private JLabel label = new JLabel();
final private JCheckBox check = new JCheckBox();

     ...

// in constructor:
final Insets inset0=new Insets(0,0,0,0);        
this.check.setMargin(inset0);
this.nodeRenderer.setLayout(new BorderLayout()); 
this.nodeRenderer.add(this.check, BorderLayout.WEST);
this.nodeRenderer.add(this.label, BorderLayout.CENTER);

Ключи для избавления от нежелательного пространства на полях кажутся (а) вызовом JCheckBox.setMargin(), чтобы уменьшить поле флажка, и (b) использовать BorderLayout для JPanel.

Ответ 4

Я выпустил автономный проект Swing Checkbox Tree, доступный от Maven Central как org.scijava:swing-checkbox-tree.

Пакет основан на кодекса John Zukowski CheckBox Node Пример дерева. Это BSD-2, лицензия без зависимостей.

Это позволяет смешивать и сопоставлять типы DefaultMutableTreeNode и CheckBoxNodeData Node. Он также позволяет узлам ячеек в качестве нелистовых узлов.

Что касается вопроса №1: я не тестировался на всех платформах, но в системах OS X узлы CheckBoxNodeData имеют точно такую ​​же высоту в пикселях, что и узлы DefaultMutableTreeNode.

Что касается вопроса №2: он использует JCheckBox + JLabel в JPanel (как предлагает aperkins), чтобы различать щелчок на флажке (чтобы проверить/снять флажок node) по сравнению с меткой (чтобы выбрать node).

Пример использования:

В последнем примере также есть код для рекурсивного переключения поддеревьев в ответ на проверенные или снятые флажки (см. метод treeNodesChanged).