Asg*_*har 3 java user-interface swing jfilechooser
我需要创建一个组件,如图所示 - 一个通过复选框选择目录的树.是否有内置组件(如其他JFileChooser等)?

是否有内置组件(如其他
JFileChooser等)?
不,不是针对该特定目的的现成组件.OTOH用一个东西扔东西并不是很困难JTree.
您可以从/sf/ask/432747731/上显示的代码开始.它使用一棵树.

..通过复选框选择目录的树.
通过选择.复选框让它变得有点棘手.这有两种可能的方法.
这允许以与在标准树中选择多个节点相同的方式进行多选,但是交换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;
}
}
Run Code Online (Sandbox Code Playgroud)
您可能采用的一种方法是将自定义对象放入树中,而不是File实例.自定义对象可能被称为a SelectableDirectory并具有File directory&boolean selected作为属性.就像是:
public class SelectableDirectory {
private File directory;
private boolean selected;
// getters and setters, constructor..
}
Run Code Online (Sandbox Code Playgroud)
使用自定义渲染器为树返回JPanel包含复选框的树,BorderLayout.WEST并JLabel使用图标和目录名称CENTER.
| 归档时间: |
|
| 查看次数: |
6255 次 |
| 最近记录: |