java JTree JCheckBox树复选框详解

2025-05-29 0 54

本文实例为大家分享了java JTree JCheckBox复选框展示的具体代码,供大家参考,具体内容如下

1.CheckTreeManager.java

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55
public class CheckTreeManager extends MouseAdapter implements TreeSelectionListener

{

private CheckTreeSelectionModel selectionModel = null;

// private JTree tree = new JTree();

private JTree tree = null;

int hotspot = new JCheckBox().getPreferredSize().width;

public CheckTreeManager(JTree tree)

{

this.tree = tree;

selectionModel = new CheckTreeSelectionModel(tree.getModel());

tree.setCellRenderer(new CheckTreeCellRenderer(tree.getCellRenderer(), selectionModel));

tree.addMouseListener(this); //鼠标监听

selectionModel.addTreeSelectionListener(this); //树选择监听

}

public void mouseClicked(MouseEvent me)

{

TreePath path = tree.getPathForLocation(me.getX(), me.getY());

if(path==null)

return;

if(me.getX()>tree.getPathBounds(path).x+hotspot)

return;

boolean selected = selectionModel.isPathSelected(path, true);

selectionModel.removeTreeSelectionListener(this);

try

{

if(selected)

selectionModel.removeSelectionPath(path);

else

selectionModel.addSelectionPath(path);

}

finally

{

selectionModel.addTreeSelectionListener(this);

tree.treeDidChange();

}

}

public CheckTreeSelectionModel getSelectionModel()

{

return selectionModel;

}

public void valueChanged(TreeSelectionEvent e)

{

tree.treeDidChange();

}

}

2.CheckTreeSelectionModel.java

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170
public class CheckTreeSelectionModel extends DefaultTreeSelectionModel

{

private TreeModel model;

public CheckTreeSelectionModel(TreeModel model)

{

this.model = model;

setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION);

}

// tests whether there is any unselected node in the subtree of given path

public boolean isPartiallySelected(TreePath path){

if(isPathSelected(path, true))

return false;

TreePath[] selectionPaths = getSelectionPaths();

if(selectionPaths==null)

return false;

for(int j = 0; j<selectionPaths.length; j++)

{

if(isDescendant(selectionPaths[j], path))

return true;

}

return false;

}

// tells whether given path is selected.

// if dig is true, then a path is assumed to be selected, if

// one of its ancestor is selected.

public boolean isPathSelected(TreePath path, boolean dig)

{

if(!dig)

return super.isPathSelected(path);

while(path!=null && !super.isPathSelected(path))

path = path.getParentPath();

return path!=null;

}

// is path1 descendant of path2

private boolean isDescendant(TreePath path1, TreePath path2)

{

Object obj1[] = path1.getPath();

Object obj2[] = path2.getPath();

for(int i = 0; i<obj2.length; i++)

{

if(obj1[i]!=obj2[i])

return false;

}

return true;

}

public void setSelectionPaths(TreePath[] pPaths)

{

throw new UnsupportedOperationException("not implemented yet!!!");

}

public void addSelectionPaths(TreePath[] paths)

{

// unselect all descendants of paths[]

for(int i = 0; i<paths.length; i++){

TreePath path = paths[i];

TreePath[] selectionPaths = getSelectionPaths();

if(selectionPaths==null)

break;

ArrayList toBeRemoved = new ArrayList();

for(int j = 0; j<selectionPaths.length; j++)

{

if(isDescendant(selectionPaths[j], path))

toBeRemoved.add(selectionPaths[j]);

}

super.removeSelectionPaths((TreePath[])toBeRemoved.toArray(new TreePath[0]));

}

// if all siblings are selected then unselect them and select parent recursively

// otherwize just select that path.

for(int i = 0; i<paths.length; i++)

{

TreePath path = paths[i];

TreePath temp = null;

while(areSiblingsSelected(path))

{

temp = path;

if(path.getParentPath()==null)

break;

path = path.getParentPath();

}

if(temp!=null)

{

if(temp.getParentPath()!=null)

addSelectionPath(temp.getParentPath());

else

{

if(!isSelectionEmpty())

removeSelectionPaths(getSelectionPaths());

super.addSelectionPaths(new TreePath[]{temp});

}

}

else

super.addSelectionPaths(new TreePath[]{ path});

}

}

// tells whether all siblings of given path are selected.

private boolean areSiblingsSelected(TreePath path)

{

TreePath parent = path.getParentPath();

if(parent==null)

return true;

Object node = path.getLastPathComponent();

Object parentNode = parent.getLastPathComponent();

int childCount = model.getChildCount(parentNode);

for(int i = 0; i<childCount; i++)

{

Object childNode = model.getChild(parentNode, i);

if(childNode==node)

continue;

if(!isPathSelected(parent.pathByAddingChild(childNode)))

return false;

}

return true;

}

public void removeSelectionPaths(TreePath[] paths)

{

for(int i = 0; i<paths.length; i++){

TreePath path = paths[i];

if(path.getPathCount()==1)

super.removeSelectionPaths(new TreePath[]{ path});

else

toggleRemoveSelection(path);

}

}

// if any ancestor node of given path is selected then unselect it

// and selection all its descendants except given path and descendants.

// otherwise just unselect the given path

private void toggleRemoveSelection(TreePath path)

{

Stack stack = new Stack();

TreePath parent = path.getParentPath();

while(parent!=null && !isPathSelected(parent))

{

stack.push(parent);

parent = parent.getParentPath();

}

if(parent!=null)

stack.push(parent);

else{

super.removeSelectionPaths(new TreePath[]{path});

return;

}

while(!stack.isEmpty())

{

TreePath temp = (TreePath)stack.pop();

TreePath peekPath = stack.isEmpty() ? path : (TreePath)stack.peek();

Object node = temp.getLastPathComponent();

Object peekNode = peekPath.getLastPathComponent();

int childCount = model.getChildCount(node);

for(int i = 0; i<childCount; i++){

Object childNode = model.getChild(node, i);

if(childNode!=peekNode)

super.addSelectionPaths(new TreePath[]{temp.pathByAddingChild(childNode)});

}

}

super.removeSelectionPaths(new TreePath[]{parent});

}

}

3.CheckTreeCellRenderer .java

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37
public class CheckTreeCellRenderer extends JPanel implements TreeCellRenderer

{

private CheckTreeSelectionModel selectionModel;

private TreeCellRenderer delegate;

// private TristateCheckBox checkBox = new TristateCheckBox();

private JCheckBox checkBox = new JCheckBox();

public CheckTreeCellRenderer(TreeCellRenderer delegate, CheckTreeSelectionModel selectionModel){

this.delegate = delegate;

this.selectionModel = selectionModel;

setLayout(new BorderLayout());

setOpaque(false);

checkBox.setOpaque(false);

}

public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus){

Component renderer = delegate.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);

TreePath path = tree.getPathForRow(row);

if(path!=null)

{

System.out.println(path);

if(selectionModel.isPathSelected(path, true))

checkBox.setSelected(true);

else

{

System.out.println(selectionModel.isPartiallySelected(path));

checkBox.setSelected(selectionModel.isPartiallySelected(path) ? true : false);

}

}

removeAll();

add(checkBox, BorderLayout.WEST);

add(renderer, BorderLayout.CENTER);

return this;

}

}

4.用法

?

1
CheckTreeManager checkTreeManager = new CheckTreeManager(jTree);

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持快网idc。

原文链接:http://blog.csdn.net/yyyzlf/article/details/4410565

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 java JTree JCheckBox树复选框详解 https://www.kuaiidc.com/113654.html

相关文章

发表评论
暂无评论