我需要创建一个如图所示的组件 - 一个通过复选框选择目录的树。是否有内置组件(如JFileChooser
等其他组件)?
答案 0 :(得分:6)
是否有内置组件(如
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
中的图标和目录名称。
答案 1 :(得分:3)
JTree
怎么样?我建议你也阅读How To Use Trees教程。
答案 2 :(得分:3)
JIDE commons包(开源)附带一个文件夹选择器。但是,我不确定它是否允许使用复选框进行多项选择。你必须看一下它来检查它的确如此。我已经使用了包中的其他组件并对它们感到满意,但我自己并没有使用过那个特定的组件。您可以在the JIDE website找到它。
答案 3 :(得分:2)
我不确定,但你总能自己制作一个......
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
class JFileChooser extends JPanel implements ActionListener {
JComboBox fileList;
public JFileChooser() {
super(new BorderLayout());
JLabel fileLabel = new JLabel("Select a file: ");
fileList = new JComboBox(
new File(System.getProperty("user.home")).listFiles() );
JButton okbutton = new JButton("OK");
JButton cancelbutton = new JButton("Cancel");
okbutton.addActionListener(this);
cancelbutton.addActionListener(this);
add(fileLabel, BorderLayout.WEST);
add(fileList, BorderLayout.CENTER);
JPanel button = new JPanel(new FlowLayout(FlowLayout.CENTER));
add(button, BorderLayout.SOUTH);
button.add(cancelbutton);
button.add(okbutton);
}
public void actionPerformed(ActionEvent event) {
String command = event.getActionCommand();
if (command.equals("Cancel")) {
System.exit(0);
}
if (command.equals("OK")) {
Object result = fileList.getSelectedItem();
String selectedFile = result.toString();
System.out.println("SELECTED: "+ selectedFile);
//do whatever you want with the file here
}
}
}
public class whatever extends JFrame {
public whatever() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JFileChooser chooser = new JFileChooser();
add(chooser);
pack();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new whatever().setVisible(true);
}
});
}
}
如果您有任何问题或代码不起作用,请询问。 :)
答案 4 :(得分:0)
只需查看CheckboxTree:
CheckboxTree是一个Java Swing组件,它在每个节点中为Tree提供了一个复选框。复选框可以在两种状态之间切换(已选中和未选中)。还支持禁用和灰化复选框。
我认为这就是你要找的东西。