Ответ 1
Что касается №2, вы можете сделать панель редактором/рендерером и добавить метку вместе с этим флажком - ярлык будет текстом, а флажок не будет содержать текст, добавленный к нему.
Мне нужно добавить флажки в JTree. Пользовательский TreeCellRenderer/TreeCellEditor кажется правильным. До сих пор я использовал подход CheckBoxNodeRenderer на этой веб-странице. Он работает нормально, за исключением двух вещей:
Есть ли способ сделать это? Я посмотрел на JTrees с флажками, не могу найти много. JIDE выглядит неплохо, но мне нужно использовать бесплатное программное обеспечение с открытым исходным кодом (GPL не в порядке, LGPL в порядке). (или создать мое собственное дерево флажков)
Что касается №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. На мой взгляд, стоит его прочитать.
за предложение @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.
Я выпустил автономный проект 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
).