forked from fanruan/design
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