Swing/FileSystemTreeWithCheckBox のバックアップ(No.21)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/FileSystemTreeWithCheckBox へ行く。
- 1 (2011-08-15 (月) 15:43:03)
- 2 (2012-04-13 (金) 20:12:08)
- 3 (2012-04-17 (火) 17:29:13)
- 4 (2012-04-19 (木) 19:50:07)
- 5 (2012-05-16 (水) 15:15:04)
- 6 (2012-07-31 (火) 18:15:44)
- 7 (2012-11-23 (金) 04:41:06)
- 8 (2012-12-19 (水) 01:58:58)
- 9 (2013-09-20 (金) 04:28:45)
- 10 (2013-12-25 (水) 14:11:08)
- 11 (2013-12-25 (水) 16:31:22)
- 12 (2013-12-25 (水) 18:57:06)
- 13 (2013-12-26 (木) 13:36:28)
- 14 (2013-12-26 (木) 21:55:24)
- 15 (2014-02-18 (火) 15:25:48)
- 16 (2014-03-04 (火) 13:55:30)
- 17 (2014-03-05 (水) 18:23:39)
- 18 (2014-06-03 (火) 21:07:01)
- 19 (2014-09-06 (土) 02:23:37)
- 20 (2014-10-04 (土) 03:44:12)
- 21 (2014-12-02 (火) 01:33:06)
- 22 (2015-02-06 (金) 11:58:24)
- 23 (2015-02-09 (月) 17:21:46)
- 24 (2016-09-11 (日) 15:02:35)
- 25 (2017-10-20 (金) 14:46:06)
- 26 (2018-02-24 (土) 19:51:30)
- 27 (2018-03-30 (金) 16:08:02)
- 28 (2018-09-25 (火) 15:38:51)
- 29 (2019-05-22 (水) 19:34:28)
- 30 (2020-09-29 (火) 18:30:23)
- 31 (2022-05-29 (日) 11:45:35)
- title: JCheckBox付きJTreeでディレクトリ構造を表示 tags: [JTree, JCheckBox, TreeCellRenderer, TreeCellEditor, File, TreeModelListener, SwingWorker] author: aterai pubdate: 2011-08-15T15:43:03+09:00 description: 編集可能なJCheckBoxをノードに追加したJTreeでディレクトリ構造を表示します。
概要
編集可能なJCheckBox
をノードに追加したJTree
でディレクトリ構造を表示します。
Screenshot
Advertisement
サンプルコード
class CheckBoxNodeEditor extends TriStateCheckBox implements TreeCellEditor {
private final FileSystemView fileSystemView;
private final JPanel panel = new JPanel(new BorderLayout());
private DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer();
private File file;
public CheckBoxNodeEditor(FileSystemView fileSystemView) {
super();
this.fileSystemView = fileSystemView;
this.addActionListener(new ActionListener() {
@Override public void actionPerformed(ActionEvent e) {
stopCellEditing();
}
});
panel.setFocusable(false);
panel.setRequestFocusEnabled(false);
panel.setOpaque(false);
panel.add(this, BorderLayout.WEST);
this.setOpaque(false);
}
@Override public Component getTreeCellEditorComponent(
JTree tree, Object value, boolean isSelected, boolean expanded,
boolean leaf, int row) {
JLabel l = (JLabel) renderer.getTreeCellRendererComponent(
tree, value, true, expanded, leaf, row, true);
l.setFont(tree.getFont());
setOpaque(false);
if (value instanceof DefaultMutableTreeNode) {
this.setEnabled(tree.isEnabled());
this.setFont(tree.getFont());
Object userObject = ((DefaultMutableTreeNode)value).getUserObject();
if (userObject instanceof CheckBoxNode) {
CheckBoxNode node = (CheckBoxNode) userObject;
if (node.status == Status.INDETERMINATE) {
setIcon(new IndeterminateIcon());
} else {
setIcon(null);
}
file = node.file;
l.setIcon(fileSystemView.getSystemIcon(file));
l.setText(fileSystemView.getSystemDisplayName(file));
setSelected(node.status == Status.SELECTED);
}
//panel.add(this, BorderLayout.WEST);
panel.add(l);
return panel;
}
return l;
}
@Override public Object getCellEditorValue() {
return new CheckBoxNode(file, isSelected() ? Status.SELECTED : Status.DESELECTED);
}
@Override public boolean isCellEditable(EventObject e) {
if (e instanceof MouseEvent && e.getSource() instanceof JTree) {
MouseEvent me = (MouseEvent)e;
JTree tree = (JTree)e.getSource();
TreePath path = tree.getPathForLocation(me.getX(), me.getY());
Rectangle r = tree.getPathBounds(path);
if (r == null) return false;
Dimension d = getPreferredSize();
r.setSize(new Dimension(d.width, r.height));
if (r.contains(me.getX(), me.getY())) {
if (file == null && System.getProperty("java.version").startsWith("1.7.0")) {
System.out.println("XXX: Java 7, only on first run\n" + getBounds());
setBounds(new Rectangle(0, 0, d.width, r.height));
}
return true;
}
}
return false;
}
@Override public void updateUI() {
super.updateUI();
if (panel != null) panel.updateUI();
//1.6.0_24 bug??? @see 1.7.0 DefaultTreeCellRenderer#updateUI()
renderer = new DefaultTreeCellRenderer();
}
//......
View in GitHub: Java, Kotlin解説
このサンプルは、FileSystemViewを使ってディレクトリ構造をJTreeに表示すると、JTreeの葉ノードをJCheckBoxにするを組み合わせて作成しています。
TreeCellEditor#isCellEditable(...)
をオーバーライドして、JCheckBox
付近をクリックした場合のみ編集可能(チェックの有無を切り替えることができる)にし、ラベルやアイコンなどをクリックした場合は、編集状態にせずノードの展開や折り畳みができるように設定しています。