Swing自定义组件: JCheckTree (二)

2014-11-24 02:29:12 · 作者: · 浏览: 1
leaf, int row,
boolean hasFocus) {
String stringValue = tree.convertValueToText(value, isSelected,
expanded, leaf, row, hasFocus);
setEnabled(tree.isEnabled());
label.setFont(tree.getFont());
label.setText(stringValue);
setBackground(tree.getBackground());
setForeground(tree.getForeground());

if(value instanceof Node){
Node node = (Node)value;
check.setSelected(node.isSelected());
}
return this;
}

@Override
public Dimension getPreferredSize() {
Dimension d_check = check.getPreferredSize();
Dimension d_label = label.getPreferredSize();
return new Dimension(d_check.width + d_label.width,
(d_check.height < d_label.height d_label.height
: d_check.height));
}

@Override
public void doLayout() {
Dimension d_check = check.getPreferredSize();
Dimension d_label = label.getPreferredSize();
int y_check = 0;
int y_label = 0;
if (d_check.height < d_label.height) {
y_check = (d_label.height - d_check.height) / 2;
} else {
y_label = (d_check.height - d_label.height) / 2;
}
check.setLocation(0, y_check);
check.setBounds(0, y_check, d_check.width, d_check.height);
label.setLocation(d_check.width, y_label);
label.setBounds(d_check.width, y_label, d_label.width, d_label.height);
if (checkBounds == null){
checkBounds = check.getBounds();
}

}

public static Rectangle getCheckBoxRectangle() {
if( null == checkBounds )
return new Rectangle(0,0,0,0);
return (Rectangle) checkBounds.clone();
}
}

package tree;

import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JTree;
import javax.swing.tree.TreePath;

/**
*
* @author chensiyu
* @createDate 2011/8/24
*/
class CheckListener extends MouseAdapter {

public CheckListener() {
}

@Override
public void mouseClicked(MouseEvent e) {
JTree tree = (JTree) e.getSource();
Point p = e.getPoint();
int x = e.getX();
int y = e.getY();
int row = tree.getRowForLocation(x, y);
TreePath path = tree.getPathForRow(row);

if (null == path) {
return;
}

Object component = path.getLastPathComponent();
if (null == component) {
return;
}

if (component instanceof Node) {
Rectangle chRect = CheckRenderer.getCheckBoxRectangle();
Rectangle rowRect = tree.getPathBounds(path);
chRect.setLocation(chRect.x + rowRect.x, chRect.y + rowRect.y);
if (e.getClickCount() == 1 && chRect.contains(p)) {
Node node = (Node)component;
node.setSelected(!node.isSelected());
tree.repaint();
}
}
}
}