Есть ли встроенный компонент для этого (как и другие, такие как JFileChooser
и т. Д.)?
Нет, не готовый компонент для этой конкретной цели.OTOH не очень сложно собрать что-то вместе, используя JTree
.
. Вы можете начать с кода, показанного на https://stackoverflow.com/questions/6182110/file-browser-gui.. Используется дерево.
Узлы с флажками
.. дерево с выбором каталога с помощью флажка.
Выбор с помощью.флажок делает это немного сложнее.Вот два возможных подхода:
Использовать средство визуализации
Это позволяет многократный выбор таким же образом, как несколько узлов могут быть выбраны в стандартном дереве, но меняет цвет выбора BG на проверенныйфлажок.
Тогда становится очень легко использовать встроенные методы, такие как JTree.getSelectionPaths()
, и обрабатывать множественный / одиночный выбор одним вызовом метода.
import java.awt.*;
import javax.swing.*;
import javax.swing.tree.*;
import java.io.*;
class TreeWithCheck {
public static Component getTree(int selectionMode) {
JTree tree = new JTree();
tree.getSelectionModel().setSelectionMode(selectionMode);
tree.setVisibleRowCount(8);
SelectableTreeCellRenderer renderer =
new SelectableTreeCellRenderer();
tree.setCellRenderer(renderer);
JScrollPane scroll = new JScrollPane(tree);
Dimension d = scroll.getPreferredSize();
scroll.setPreferredSize(
new Dimension((int)d.getWidth()*2, (int)d.getHeight()));
return scroll;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JPanel trees = new JPanel(new GridLayout(0,2,5,5));
trees.add(
getTree(TreeSelectionModel.SINGLE_TREE_SELECTION));
trees.add(
getTree(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION));
JOptionPane.showMessageDialog(null, trees);
}
});
}
}
class SelectableTreeCellRenderer extends DefaultTreeCellRenderer {
private JCheckBox selected;
private JPanel renderComponent;
public SelectableTreeCellRenderer() {
selected = new JCheckBox();
renderComponent = new JPanel(new BorderLayout());
renderComponent.add(selected,BorderLayout.WEST);
selected.setOpaque(false);
renderComponent.setOpaque(false);
}
public Component getTreeCellRendererComponent(
JTree tree,
Object value,
boolean sel,
boolean expanded,
boolean leaf,
int row,
boolean hasFocus) {
Component c = super.getTreeCellRendererComponent(
tree,
value,
false, // we pass 'false' rather than 'sel'
expanded,
leaf,
row,
hasFocus);
selected.setSelected(sel);
renderComponent.add(c,BorderLayout.CENTER);
return renderComponent;
}
}
Определить пользовательский объект
Один из способов, которым вы можете приблизиться к нему, - поместить пользовательские объекты в дерево, а не File
экземпляров.Пользовательский объект может называться SelectableDirectory
и иметь File directory
& boolean selected
в качестве атрибутов.Примерно так:
public class SelectableDirectory {
private File directory;
private boolean selected;
// getters and setters, constructor..
}
Используйте пользовательский рендерер для дерева, который возвращает JPanel
, содержащий флажок в BorderLayout.WEST
и JLabel
с иконкой и именем каталога в CENTER
.