yaoh.wu
7 years ago
5 changed files with 208 additions and 9 deletions
@ -0,0 +1,83 @@ |
|||||||
|
package com.fr.design.remote.ui.tree; |
||||||
|
|
||||||
|
|
||||||
|
import javax.swing.JCheckBox; |
||||||
|
import javax.swing.JPanel; |
||||||
|
import javax.swing.JTree; |
||||||
|
import javax.swing.UIManager; |
||||||
|
import javax.swing.plaf.ColorUIResource; |
||||||
|
import javax.swing.tree.TreeCellRenderer; |
||||||
|
import java.awt.Color; |
||||||
|
import java.awt.Component; |
||||||
|
import java.awt.Dimension; |
||||||
|
|
||||||
|
public class FileAuthorityTreeCellRenderer extends JPanel implements TreeCellRenderer { |
||||||
|
|
||||||
|
|
||||||
|
protected JCheckBox check; |
||||||
|
protected FileAuthorityTreeLabel label; |
||||||
|
|
||||||
|
public FileAuthorityTreeCellRenderer() { |
||||||
|
setLayout(null); |
||||||
|
add(check = new JCheckBox()); |
||||||
|
add(label = new FileAuthorityTreeLabel()); |
||||||
|
check.setBackground(UIManager.getColor("Tree.textBackground")); |
||||||
|
label.setForeground(UIManager.getColor("Tree.textForeground")); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 返回的是一个<code>JPanel</code>对象,该对象中包含一个<code>JCheckBox</code>对象 |
||||||
|
* 和一个<code>JLabel</code>对象。并且根据每个结点是否被选中来决定<code>JCheckBox</code> |
||||||
|
* 是否被选中。 |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public Component getTreeCellRendererComponent(JTree tree, Object value, |
||||||
|
boolean selected, boolean expanded, boolean leaf, int row, |
||||||
|
boolean hasFocus) { |
||||||
|
String stringValue = tree.convertValueToText(value, selected, expanded, leaf, row, hasFocus); |
||||||
|
setEnabled(tree.isEnabled()); |
||||||
|
check.setSelected(((FileAuthorityTreeNode) value).isSelected()); |
||||||
|
label.setFont(tree.getFont()); |
||||||
|
label.setText(stringValue); |
||||||
|
label.setSelected(selected); |
||||||
|
label.setFocus(hasFocus); |
||||||
|
if (leaf) |
||||||
|
label.setIcon(UIManager.getIcon("Tree.leafIcon")); |
||||||
|
else if (expanded) |
||||||
|
label.setIcon(UIManager.getIcon("Tree.openIcon")); |
||||||
|
else |
||||||
|
label.setIcon(UIManager.getIcon("Tree.closedIcon")); |
||||||
|
|
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Dimension getPreferredSize() { |
||||||
|
Dimension dCheck = check.getPreferredSize(); |
||||||
|
Dimension dLabel = label.getPreferredSize(); |
||||||
|
return new Dimension(dCheck.width + dLabel.width, dCheck.height < dLabel.height ? dLabel.height : dCheck.height); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void doLayout() { |
||||||
|
Dimension dCheck = check.getPreferredSize(); |
||||||
|
Dimension dLabel = label.getPreferredSize(); |
||||||
|
int yCheck = 0; |
||||||
|
int yLabel = 0; |
||||||
|
if (dCheck.height < dLabel.height) |
||||||
|
yCheck = (dLabel.height - dCheck.height) / 2; |
||||||
|
else |
||||||
|
yLabel = (dCheck.height - dLabel.height) / 2; |
||||||
|
check.setLocation(0, yCheck); |
||||||
|
check.setBounds(0, yCheck, dCheck.width, dCheck.height); |
||||||
|
label.setLocation(dCheck.width, yLabel); |
||||||
|
label.setBounds(dCheck.width, yLabel, dLabel.width, dLabel.height); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void setBackground(Color color) { |
||||||
|
if (color instanceof ColorUIResource) |
||||||
|
color = null; |
||||||
|
super.setBackground(color); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,69 @@ |
|||||||
|
package com.fr.design.remote.ui.tree; |
||||||
|
|
||||||
|
|
||||||
|
import javax.swing.Icon; |
||||||
|
import javax.swing.JLabel; |
||||||
|
import javax.swing.UIManager; |
||||||
|
import javax.swing.plaf.ColorUIResource; |
||||||
|
import java.awt.Color; |
||||||
|
import java.awt.Dimension; |
||||||
|
import java.awt.Graphics; |
||||||
|
|
||||||
|
public class FileAuthorityTreeLabel extends JLabel { |
||||||
|
private boolean isSelected; |
||||||
|
private boolean hasFocus; |
||||||
|
|
||||||
|
public FileAuthorityTreeLabel() { |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void setBackground(Color color) { |
||||||
|
if (color instanceof ColorUIResource) { |
||||||
|
color = null; |
||||||
|
} |
||||||
|
super.setBackground(color); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void paint(Graphics g) { |
||||||
|
String str; |
||||||
|
if ((str = getText()) != null) { |
||||||
|
if (0 < str.length()) { |
||||||
|
if (isSelected) { |
||||||
|
g.setColor(UIManager.getColor("Tree.selectionBackground")); |
||||||
|
} else { |
||||||
|
g.setColor(UIManager.getColor("Tree.textBackground")); |
||||||
|
} |
||||||
|
Dimension d = getPreferredSize(); |
||||||
|
int imageOffset = 0; |
||||||
|
Icon currentIcon = getIcon(); |
||||||
|
if (currentIcon != null) { |
||||||
|
imageOffset = currentIcon.getIconWidth() + Math.max(0, getIconTextGap() - 1); |
||||||
|
} |
||||||
|
g.fillRect(imageOffset, 0, d.width - 1 - imageOffset, d.height); |
||||||
|
if (hasFocus) { |
||||||
|
g.setColor(UIManager.getColor("Tree.selectionBorderColor")); |
||||||
|
g.drawRect(imageOffset, 0, d.width - 1 - imageOffset, d.height - 1); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
super.paint(g); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Dimension getPreferredSize() { |
||||||
|
Dimension retDimension = super.getPreferredSize(); |
||||||
|
if (retDimension != null) { |
||||||
|
retDimension = new Dimension(retDimension.width + 3, retDimension.height); |
||||||
|
} |
||||||
|
return retDimension; |
||||||
|
} |
||||||
|
|
||||||
|
public void setSelected(boolean isSelected) { |
||||||
|
this.isSelected = isSelected; |
||||||
|
} |
||||||
|
|
||||||
|
public void setFocus(boolean hasFocus) { |
||||||
|
this.hasFocus = hasFocus; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,27 @@ |
|||||||
|
package com.fr.design.remote.ui.tree; |
||||||
|
|
||||||
|
|
||||||
|
import javax.swing.JTree; |
||||||
|
import javax.swing.tree.DefaultTreeModel; |
||||||
|
import javax.swing.tree.TreePath; |
||||||
|
import java.awt.event.MouseAdapter; |
||||||
|
import java.awt.event.MouseEvent; |
||||||
|
|
||||||
|
public class FileAuthorityTreeNodeSelectionListener extends MouseAdapter { |
||||||
|
@Override |
||||||
|
public void mouseClicked(MouseEvent event) { |
||||||
|
JTree tree = (JTree) event.getSource(); |
||||||
|
int x = event.getX(); |
||||||
|
int y = event.getY(); |
||||||
|
int row = tree.getRowForLocation(x, y); |
||||||
|
TreePath path = tree.getPathForRow(row); |
||||||
|
if (path != null) { |
||||||
|
FileAuthorityTreeNode node = (FileAuthorityTreeNode) path.getLastPathComponent(); |
||||||
|
if (node != null) { |
||||||
|
boolean isSelected = !node.isSelected(); |
||||||
|
node.setSelected(isSelected); |
||||||
|
((DefaultTreeModel) tree.getModel()).nodeStructureChanged(node); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue