JTree с флажками - PullRequest
       14

JTree с флажками

13 голосов
/ 03 августа 2009

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

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

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

Ответы [ 4 ]

9 голосов
/ 20 февраля 2012

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

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

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

8 голосов
/ 03 августа 2009

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

4 голосов
/ 03 августа 2009

за предложение @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 (), чтобы уменьшить поле для флажка, и (б) используют BorderLayout для JPanel.

2 голосов
/ 12 октября 2012

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

Пакет основан на коде дерева узла Джек Жуковски . Это BSD-2-лицензия без каких-либо зависимостей.

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

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

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

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

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

...