if (jTree1.isVisible(pathnode)) { Item lognode=(Item)node.getUserObject();
if(lognode!=null){ int i=lognode.getFlag(); lognode.setFlag(1-i); System.out.println(pathnode.toString()+" "+lognode.getFlag()); } } }
//Overridden so we can exit when window is closed protected void processWindowEvent(WindowEvent e) { super.processWindowEvent(e); if (e.getID() == WindowEvent.WINDOW_CLOSING) { System.exit(0); } }
//自定义的cellrenderer
class LogItemRenderer extends DefaultTreeCellRenderer { ImageIcon myIcon[]; int selectmode;
public LogItemRenderer() { selectmode=0; myIcon = new ImageIcon[2]; myIcon[0] =new ImageIcon(TreeTestFrame.class.getResource("a.gif" )); myIcon[1] =new ImageIcon(TreeTestFrame.class.getResource("b.gif" ));
zhang21cnboy(事了抚衣去,不留身与名) ,你是指我的第一个问题“在JTree节点描述中,用哪个方法可以使鼠标选中的节点项永远改变图标,直到下次再点击。”
没法做吗?
这个咋办亚?
public void mouseClicked(MouseEvent e) {
int selRow = checkTree.getRowForLocation(e.getX(), e.getY());
TreePath selPath = checkTree.getPathForLocation(e.getX(), e.getY());
if(selRow != -1) {
if(e.getClickCount() == 1) {
// mySingleClick(selRow, selPath);
}
else if(e.getClickCount() == 2) {
myDoubleClick(selRow, selPath);
}
}
}
};
checkTree.addMouseListener(ml);
然后再myDoubleClick(int selRow, TreePath selPath)中定义您的动作;
第一个问题:
用哪个方法可以使鼠标选中的树节点项永远改变图标,直到下次再点击。我要实现的功能描述如下:
鼠标多选树结点,点下去改变图标以表示选中,再次点击希望可以恢复回原来图标。
这末简单的功能Java不会实现不了把?!
我做了个小实验,不知道是否能满足你说的要求。Application形式的,共用了两个类。其中a.gif,和b.gif为两种状态下的图标。
说明较少请谅解。如有问题,可继续在线讨论 //第一个类----主类;import javax.swing.UIManager;
import java.awt.*;public class TreeTest {
boolean packFrame = false; //Construct the application
public TreeTest() {
TreeTestFrame frame = new TreeTestFrame();
//Validate frames that have preset sizes
//Pack frames that have useful preferred size info, e.g. from their layout
if (packFrame) {
frame.pack();
}
else {
frame.validate();
}
//Center the window
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize = frame.getSize();
if (frameSize.height > screenSize.height) {
frameSize.height = screenSize.height;
}
if (frameSize.width > screenSize.width) {
frameSize.width = screenSize.width;
}
frame.setLocation((screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2);
frame.setVisible(true);
} //Main method
public static void main(String[] args) {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}
catch(Exception e) {
e.printStackTrace();
}
new TreeTest();
}
}
// 第二个类-------Frame窗口 import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.tree.*;
import java.util.*;public class TreeTestFrame extends JFrame {
JPanel contentPane;
JTree jTree1;
//Construct the frame
public TreeTestFrame() {
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
try {
jbInit();
}
catch(Exception e) {
e.printStackTrace();
}
} //Component initialization
private void jbInit() throws Exception {
contentPane = (JPanel) this.getContentPane();
contentPane.setDebugGraphicsOptions(0);
contentPane.setLayout(null);
this.setSize(new Dimension(400, 300));
this.setTitle("Frame Title");
LogItemRenderer LIR=new LogItemRenderer();
Item checkNode = new Item("Root",0);
DefaultMutableTreeNode myrootNode = new DefaultMutableTreeNode(checkNode);
DefaultTreeModel logModel = new DefaultTreeModel(myrootNode);
jTree1 = new JTree(logModel);
jTree1.setBounds(new Rectangle(4, 7, 120, 165));
DefaultMutableTreeNode a=new DefaultMutableTreeNode(new Item("a",0));
DefaultMutableTreeNode aa1=new DefaultMutableTreeNode(new Item("aa1",0));
DefaultMutableTreeNode aa2=new DefaultMutableTreeNode(new Item("aa2",0));
a.add(aa1);
a.add(aa2);
myrootNode.add(a);
DefaultMutableTreeNode b=new DefaultMutableTreeNode(new Item("b",0));
myrootNode.add(b);
jTree1.setCellRenderer(LIR);
jTree1.addTreeSelectionListener(new javax.swing.event.TreeSelectionListener() {
public void valueChanged(TreeSelectionEvent e) {
jTree1_valueChanged(e);
}
});
contentPane.add(jTree1, null);
} //tree selection event
void jTree1_valueChanged(TreeSelectionEvent e) { DefaultMutableTreeNode node = (DefaultMutableTreeNode)jTree1.getLastSelectedPathComponent();
TreePath pathnode = (TreePath)jTree1.getLeadSelectionPath();
if (jTree1.isVisible(pathnode)) {
Item lognode=(Item)node.getUserObject();
if(lognode!=null){
int i=lognode.getFlag();
lognode.setFlag(1-i);
System.out.println(pathnode.toString()+" "+lognode.getFlag());
}
}
}
//Overridden so we can exit when window is closed
protected void processWindowEvent(WindowEvent e) {
super.processWindowEvent(e);
if (e.getID() == WindowEvent.WINDOW_CLOSING) {
System.exit(0);
}
}
//自定义的cellrenderer
class LogItemRenderer extends DefaultTreeCellRenderer {
ImageIcon myIcon[];
int selectmode;
public LogItemRenderer() {
selectmode=0;
myIcon = new ImageIcon[2];
myIcon[0] =new ImageIcon(TreeTestFrame.class.getResource("a.gif" ));
myIcon[1] =new ImageIcon(TreeTestFrame.class.getResource("b.gif" ));
} public Component getTreeCellRendererComponent( JTree tree,
Object value, boolean sel, boolean expanded,
boolean leaf, int row, boolean hasFocus ) { super.getTreeCellRendererComponent( tree, value, sel, expanded,
leaf, row, hasFocus );
TreePath treePath = tree.getPathForRow( row );
int ndx = getIconIndex( treePath );
if ( ndx>=0 ) setIcon( myIcon[ndx] ); return this;
} protected int getIconIndex( TreePath path ) {
DefaultMutableTreeNode node;
if ( path != null ) {
node = (DefaultMutableTreeNode) path.getLastPathComponent();
if ( node != null ) {
Item logNode = (Item)node.getUserObject();
if ( logNode != null )
return logNode.getFlag();
}
} return -1;
}
}
} //自定义的树节点的对象类型
class Item{
String str;
int flag;
public Item(String str,int flag){
this.str=str;
this.flag=flag;
}
void setFlag(int flag){
this.flag=flag;
}
public String toString(){
return this.str;
}
int getFlag(){
return this.flag;
}
}
http://java.sun.com/j2se/1.4.2/download.html