JTree中updateUI的问题

kevin_dong 2004-09-17 10:47:34
在JTree中,如果叶子的内容改变,我使用updateUI()来进行更新,运行和显示非常正常,但是在console窗口总是出现下面错误。好像是有空指针现象出现。哪位大侠知道原因?

java.lang.NullPointerException
at javax.swing.plaf.basic.BasicTreeUI.paintRow(Unknown Source)
at javax.swing.plaf.basic.BasicTreeUI.paint(Unknown Source)
at javax.swing.plaf.metal.MetalTreeUI.paint(Unknown Source)
at javax.swing.plaf.ComponentUI.update(Unknown Source)
at javax.swing.JComponent.paintComponent(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintWithOffscreenBuffer(Unknown Source)
at javax.swing.JComponent.paintDoubleBuffered(Unknown Source)
at javax.swing.JComponent._paintImmediately(Unknown Source)
at javax.swing.JComponent.paintImmediately(Unknown Source)
at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(Unknown Source)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
...全文
232 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
kevin_dong 2004-09-17
  • 打赏
  • 举报
回复
DownloadTree.java还包括如下代码:
class IconCellRenderer extends JLabel implements TreeCellRenderer {
protected Color m_textSelectionColor;
protected Color m_textNonSelectionColor;
protected Color m_bkSelectionColor;
protected Color m_bkNonSelectionColor;
protected Color m_borderSelectionColor;

protected boolean m_selected;

public IconCellRenderer() {
super();
m_textSelectionColor = UIManager.getColor("Tree.selectionForeground");
m_textNonSelectionColor = UIManager.getColor("Tree.textForeground");
m_bkSelectionColor = UIManager.getColor("Tree.selectionBackground");
m_bkNonSelectionColor = UIManager.getColor("Tree.textBackground");
m_borderSelectionColor =
UIManager.getColor("Tree.selectionBorderColor");
setOpaque(false);
}

public Component getTreeCellRendererComponent(
JTree tree,
Object value,
boolean sel,
boolean expanded,
boolean leaf,
int row,
boolean hasFocus) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
Object obj = node.getUserObject();
setText(obj.toString());

if (obj instanceof Boolean)
setText("Retrieving data...");

if (obj instanceof IconData) {
IconData idata = (IconData) obj;
if (expanded)
setIcon(idata.getExpandedIcon());
else
setIcon(idata.getIcon());
} else
setIcon(null);

setFont(tree.getFont());
setForeground(sel ? m_textSelectionColor : m_textNonSelectionColor);
setBackground(sel ? m_bkSelectionColor : m_bkNonSelectionColor);
m_selected = sel;
return this;
}

public void paintComponent(Graphics g) {
Color bColor = getBackground();
Icon icon = getIcon();
g.setColor(bColor);
int offset = 0;
if (icon != null && getText() != null)
offset = (icon.getIconWidth() + getIconTextGap());
g.fillRect(offset, 0, getWidth() - 1 - offset, getHeight() - 1);
if (m_selected) {
g.setColor(m_borderSelectionColor);
g.drawRect(offset, 0, getWidth() - 1 - offset, getHeight() - 1);
}
super.paintComponent(g);
}
}

class IconData {
protected Icon m_icon;
protected Icon m_expandedIcon;
protected Object m_data;
public IconData(Icon icon, Object data) {
m_icon = icon;
m_expandedIcon = null;
m_data = data;
}
public IconData(Icon icon, Icon expandedIcon, Object data) {
m_icon = icon;
m_expandedIcon = expandedIcon;
m_data = data;
}
public Icon getIcon() {
return m_icon;
}
public Icon getExpandedIcon() {
return m_expandedIcon != null ? m_expandedIcon : m_icon;
}
public Object getObject() {
return m_data;
}
public String toString() {
return m_data.toString();
}
}

class EntryNode {
protected DirEntry m_file;

public EntryNode(DirEntry file) {
m_file = file;
}
public DirEntry getEntry() {
return m_file;
}
public String toString() {
String str = getDir(m_file.toString());
if (DownloadList.entryIndex.containsKey(str)) {
return m_file.toString()
+ "-->"
+ ((DirEntry) DownloadList.entryIndex.get(str)).getMessage();
} else {
return m_file.toString();
}
}

public boolean expand(DefaultMutableTreeNode parent) {
DefaultMutableTreeNode flag =
(DefaultMutableTreeNode) parent.getFirstChild();
if (flag == null) // No flag
return false;
Object obj = flag.getUserObject();
if (!(obj instanceof Boolean))
return false; // Already expanded

parent.removeAllChildren(); // Remove Flag

DirEntry[] files = listFiles();
if (files == null)
return true;
Vector v = new Vector();
for (int k = 0; k < files.length; k++) {
DirEntry f = files[k];
EntryNode newNode = new EntryNode(f);
boolean isAdded = false;
for (int i = 0; i < v.size(); i++) {
EntryNode nd = (EntryNode) v.elementAt(i);
if (newNode.compareTo(nd) < 0) {
v.insertElementAt(newNode, i);
isAdded = true;
break;
}
}
if (!isAdded)
v.addElement(newNode);
}
for (int i = 0; i < v.size(); i++) {
EntryNode nd = (EntryNode) v.elementAt(i);
IconData idata =
new IconData(
DownloadTree.ICON_FOLDER,
DownloadTree.ICON_EXPANDEDFOLDER,
nd);
DefaultMutableTreeNode node = new DefaultMutableTreeNode(idata);
parent.add(node);
if (nd.hasSubDirs())
node.add(new DefaultMutableTreeNode(new Boolean(true)));
}
return true;
}

public boolean hasSubDirs() {
return m_file.isDirectory();


public int compareTo(EntryNode toCompare) {
return m_file.toString().compareToIgnoreCase(
toCompare.m_file.toString());
}

protected DirEntry[] listFiles() {
Vector vec = (Vector) CacheHashtable.getHash().get(m_file.toString());
DirEntry[] dir = new DirEntry[vec.size()];
for (int i = 0; i < vec.size(); i++) {
dir[i] = (DirEntry) vec.elementAt(i);
}
return dir;
}

public static String getDir(String tmp) {
int x;

while (true) {
x = tmp.indexOf("/");

if ((x == (tmp.length() - 1)) || (x < 0)) {
break;
} else {
tmp = tmp.substring(x + 1);
}
}

while (true) {
x = tmp.indexOf("\\");

if ((x == (tmp.length() - 1)) || (x < 0)) {
break;
} else {
tmp = tmp.substring(x + 1);
}
}
return tmp;
}
}
kevin_dong 2004-09-17
  • 打赏
  • 举报
回复
还有一个类DownloadTree.java
package cn.cnic.rd.test;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import javax.swing.*;
import javax.swing.tree.*;
import javax.swing.event.*;

public class DownloadTree {
public static final ImageIcon ICON_COMPUTER = new ImageIcon("computer.gif");
public static final ImageIcon ICON_DISK = new ImageIcon("disk.gif");
public static final ImageIcon ICON_FOLDER = new ImageIcon("folder.gif");
public static final ImageIcon ICON_EXPANDEDFOLDER =
new ImageIcon("expandedfolder.gif");
protected JTree m_tree;
protected DefaultTreeModel m_model;
protected EntryNode currentNode;
protected DefaultMutableTreeNode top;
public DownloadTree() {
top =
new DefaultMutableTreeNode(
new IconData(ICON_COMPUTER, null, "Computer"));
m_model = new DefaultTreeModel(top);
m_tree = new JTree(m_model);
m_tree.putClientProperty("JTree.lineStyle", "Angled");
TreeCellRenderer renderer = new IconCellRenderer();
m_tree.setCellRenderer(renderer);
m_tree.addTreeExpansionListener(new DirExpansionListener());
m_tree.addTreeSelectionListener(new DirSelectionListener());
m_tree.getSelectionModel().setSelectionMode(
TreeSelectionModel.SINGLE_TREE_SELECTION);
m_tree.setShowsRootHandles(true);
m_tree.setEditable(false);
m_tree.setRootVisible(false);
WindowListener wndCloser = new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
};
}

public JTree getTree() {
return m_tree;
}
public void removeTree() {
top.removeAllChildren();
}
public void addDirEntry(DirEntry nd) {
IconData idata =
new IconData(
DownloadTree.ICON_FOLDER,
DownloadTree.ICON_EXPANDEDFOLDER,
new EntryNode(nd));
DefaultMutableTreeNode node = new DefaultMutableTreeNode(idata);
top.add(node);
if (nd.isDirectory())
node.add(new DefaultMutableTreeNode(new Boolean(true)));
}
public EntryNode getCurrentNode() {
return currentNode;
}

public DirEntry getCurrentEntry() {
return currentNode.m_file;
}
public DefaultTreeModel getDefaultTreeModel() {
return m_model;
}
public DefaultMutableTreeNode getTreeNode(TreePath path) {
return (DefaultMutableTreeNode) (path.getLastPathComponent());
}
EntryNode getEntryNode(DefaultMutableTreeNode node) {
if (node == null)
return null;
Object obj = node.getUserObject();
if (obj instanceof IconData)
obj = ((IconData) obj).getObject();
if (obj instanceof EntryNode)
return (EntryNode) obj;
else
return null;
}
class DirExpansionListener implements TreeExpansionListener {
public void treeExpanded(TreeExpansionEvent event) {
final DefaultMutableTreeNode node = getTreeNode(event.getPath());
final EntryNode fnode = getEntryNode(node);

Thread runner = new Thread() {
public void run() {
if (fnode != null && fnode.expand(node)) {
Runnable runnable = new Runnable() {
public void run() {
m_model.reload(node);
}
};
SwingUtilities.invokeLater(runnable);
}
}
};
runner.start();
}

public void treeCollapsed(TreeExpansionEvent event) {
}
}

class DirSelectionListener implements TreeSelectionListener {
public void valueChanged(TreeSelectionEvent event) {
DefaultMutableTreeNode node = getTreeNode(event.getPath());
EntryNode fnode = getEntryNode(node);
if (fnode != null)
currentNode = fnode;
else
currentNode = null;
}
}
}



kevin_dong 2004-09-17
  • 打赏
  • 举报
回复
不好意思,我现在将代码整理了一下。一共下列两个类,执行DownloadList类就会出现首贴中的错误。哪位大侠知道原因?

/*
* Created on 2004-9-17
*
* To change the template for this generated file go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/
package cn.cnic.rd.test;

import java.awt.*;
import java.awt.event.*;
import javax.swing.tree.*;

import java.util.*;

import javax.swing.*;
import javax.swing.event.*;

public class DownloadList extends JFrame implements ActionListener {
//private HImageButton rotate = new HImageButton(Settings.cmdImage,"rotate","Toggle selected transfer...",this);
//private int rotator = 0;
private static final String SEP = "--> ";
public Hashtable sizeCache = new Hashtable();
//存放放置DirEntry的Vector的哈希类
public static CacheHashtable entryCache = new CacheHashtable();

//private JTextArea text = new JTextArea();
// private JList text = new JList();
public static Hashtable entryIndex = new Hashtable();//store the file-direntry map
private JTree text; //kevin added
public static DownloadTree dTree;
// private Hashtable downloads = new Hashtable();//下载显示列表
private boolean working = false;
private long oldtime = 0;
private Container cont = this.getContentPane();

public DownloadList() {
super("Directories Tree");
setSize(400, 300);
cont.setLayout(new BorderLayout());
// text.setLocale(Locale.SIMPLIFIED_CHINESE); //kevin added
// text.setCellRenderer(new DirCellRenderer());
//***
dTree = new DownloadTree();
text= dTree.getTree(); //kevin added
JScrollPane dP = new JScrollPane(text);
cont.add(dP,BorderLayout.CENTER);
setVisible(true);

}

public void fresh() {
// downloads = new Hashtable();
initTree();
// updateArea();
// updateTree();
}

public void actionPerformed(ActionEvent e) {
}

private String getActiveItem() {
// String tmp = (String) dTree.getCurrentEntry().getAbsolutePath();
String tmp = (String) dTree.getCurrentEntry().toString();
if (tmp == null) {
return "";
} else {
return tmp;
}
}

public synchronized void updateList( //更新下载列表
String file,
String type,
long bytes,
long size) {
String message = type + ": <" + file + "> ";

// directory
int count = 0;

String tmp = type.substring(type.indexOf(":") + 1);
type = type.substring(0, type.indexOf(":"));
count = Integer.parseInt(tmp);
// message = type + ": <" + file + "> "; //kevin deleted
message = type + ": "; //kevin added

// ---------------
//System.out.print(size+":");
long s = (long) (size / 1024);
if (s > 0) {
tmp = Long.toString(s);
} else {
tmp = "?";
}

//System.out.println(message);
message = message + (int) (bytes / 1024) + " / " + tmp + " kb";

if (entryIndex.containsKey(file)) {
// downloads.put(file, message);
DirEntry dir = (DirEntry)entryIndex.get(file);
// dir.setMessage(message);
((DirEntry)entryIndex.get(file)).setMessage(message);
// entryIndex.put(file,dir);
} else {
// downloads.put(file, message);
DirEntry dir = new DirEntry(file,null);//kevin added
dir.setMessage(message); //kevin added
if (file.endsWith("/")) {
dir.setDirectory();
} else {
dir.setFile();
}
entryIndex.put(file,dir);
// addTreeNode(null,dir);//kevin added
}
updateTree();//kevin added
/// updateArea();//kevin deleted
}

private synchronized DirEntry[] toArray() {
// DirEntry[] f = new DirEntry[downloads.size()];
DirEntry[] f = new DirEntry[entryIndex.size()];
int i = 0;
// Enumeration k = downloads.elements();
Enumeration k = entryIndex.elements();

while (k.hasMoreElements()) {
String tmp = (String) k.nextElement();
DirEntry d = (DirEntry)entryIndex.get(tmp);
// DirEntry d = new DirEntry(tmp, null);
// if (getFile(tmp).endsWith("/")) {
// d.setDirectory();
// }
d.setNoRender();
f[i] = d;
i++;
}
return f;
}

private synchronized void updateArea() {//更新下载列表显示
///int idx = text.getSelectedIndex();
///DirEntry[] f = toArray();
///text.setListData(f);
///if ((f.length == 1) && (idx < 0)) {
///text.setSelectedIndex(0);
///} else {
/// text.setSelectedIndex(idx);
///}
}

//add node, it's the root node if str = null
public static synchronized void addTreeNode(String str,DirEntry dir) {
if (str == null) { //the root node
dTree.addDirEntry(dir);
entryCache.add("0",dir);
} else { //the child node
entryCache.add(str,dir);
}
updateTree();
}

//init the download tree
private void initTree() {
dTree.removeTree();
if (entryCache == null) return;
Vector vec = entryCache.get("0");
int j = vec.size();
for (int i = 0;i < vec.size(); i++) {
dTree.addDirEntry((DirEntry)vec.elementAt(i));
}
updateTree();
}

private static synchronized void updateTree() { //kevin added
// TreePath tPath = dTree.getTree().getSelectionPath();
//update the Entrynodes in the vector EntryNodeIndex
dTree.getTree().updateUI();
// ((DefaultTreeModel)dTree.getTree().getModel()).reload();
}

private String getRawFile(String msg) {
String f = msg.substring(msg.indexOf("<") + 1);
f = f.substring(0, f.lastIndexOf(">"));
//System.out.println(f);
return f;
}

private boolean safeUpdate() {
long time = System.currentTimeMillis();
oldtime = time;
return true;
}

private void fireProgressUpdate(String str) {

}

public static void main(String[] args) {
DownloadList dl = new DownloadList();
String file = "/usr/local/log.txt";
DirEntry d = new DirEntry(file, null);
d.setDirectory();
dl.fireProgressUpdate(file);
d.setMessage(d.file);
DownloadList.addTreeNode(null,d);
}

}
Hunk2003 2004-09-17
  • 打赏
  • 举报
回复
DirEntry;
DownloadList;
CacheHashtable;
StringUtils;
这四个包是您定义?
我无法调试。

kevin_dong 2004-09-17
  • 打赏
  • 举报
回复
还有一部分代码:

class IconData {
protected Icon m_icon;
protected Icon m_expandedIcon;
protected Object m_data;

public IconData(Icon icon, Object data) {
m_icon = icon;
m_expandedIcon = null;
m_data = data;
}

public IconData(Icon icon, Icon expandedIcon, Object data) {
m_icon = icon;
m_expandedIcon = expandedIcon;
m_data = data;
}

public Icon getIcon() {
return m_icon;
}

public Icon getExpandedIcon() {
return m_expandedIcon != null ? m_expandedIcon : m_icon;
}

public Object getObject() {
return m_data;
}

public String toString() {
return m_data.toString();
}
}

class EntryNode {
protected DirEntry m_file;

public EntryNode(DirEntry file) {
m_file = file;
}

public DirEntry getEntry() {
return m_file;
}

public String toString() {
// return m_file.getMessage();
String str = StringUtils.getDir(m_file.toString());
if (DownloadList.entryIndex.containsKey(str)) {
return m_file.toString()
+ "-->"
+ ((DirEntry) DownloadList.entryIndex.get(str)).getMessage();
} else {
return m_file.toString();
}
// return m_file.toString();
}

public boolean expand(DefaultMutableTreeNode parent) {
DefaultMutableTreeNode flag =
(DefaultMutableTreeNode) parent.getFirstChild();
if (flag == null) // No flag
return false;
Object obj = flag.getUserObject();
if (!(obj instanceof Boolean))
return false; // Already expanded

parent.removeAllChildren(); // Remove Flag

DirEntry[] files = listFiles();
if (files == null)
return true;

Vector v = new Vector();

for (int k = 0; k < files.length; k++) {
DirEntry f = files[k];
// if (!(f.isDirectory()))
// continue;
EntryNode newNode = new EntryNode(f);

boolean isAdded = false;
//add newNode to the Vector
for (int i = 0; i < v.size(); i++) {
EntryNode nd = (EntryNode) v.elementAt(i);
if (newNode.compareTo(nd) < 0) {
v.insertElementAt(newNode, i);
isAdded = true;
break;
}
}
if (!isAdded)
v.addElement(newNode);
}

for (int i = 0; i < v.size(); i++) {
EntryNode nd = (EntryNode) v.elementAt(i);
IconData idata =
new IconData(
DownloadTree.ICON_FOLDER,
DownloadTree.ICON_EXPANDEDFOLDER,
nd);
DefaultMutableTreeNode node = new DefaultMutableTreeNode(idata);
parent.add(node);
if (nd.hasSubDirs())
node.add(new DefaultMutableTreeNode(new Boolean(true)));
}
return true;
}

public boolean hasSubDirs() {
return m_file.isDirectory();
// DirEntry[] files = listFiles();
// if (files == null)
// return false;
// return true;
// for (int k = 0; k < files.length; k++) {
// if (files[k].isDirectory())
// return true;
// }
// return false;
}

public int compareTo(EntryNode toCompare) {
return m_file.toString().compareToIgnoreCase(
toCompare.m_file.toString());
}

protected DirEntry[] listFiles() {
/* if (!m_file.isDirectory())
return null;
try {
return m_file.listFiles();
} catch (Exception ex) {
JOptionPane.showMessageDialog(
null,
"Error reading directory " + m_file.getAbsolutePath(),
"Warning",
JOptionPane.WARNING_MESSAGE);
return null;
} */
Vector vec = (Vector) CacheHashtable.getHash().get(m_file.toString());
DirEntry[] dir = new DirEntry[vec.size()];
for (int i = 0; i < vec.size(); i++) {
dir[i] = (DirEntry) vec.elementAt(i);
}
return dir;
}
}
kevin_dong 2004-09-17
  • 打赏
  • 举报
回复
这是一部分代码,在 另外一个类中调用
private static synchronized void updateTree() {
dTree.getTree().updateUI();
}出现上述错误,如果将updateUI屏蔽就没有问题。

/*
* Created on 2004-9-6
*
* To change the template for this generated file go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/
package cn.ac.sdg.gb.client;

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;

import javax.swing.*;
import javax.swing.tree.*;
import javax.swing.event.*;
import net.sf.jftp.gui.DirEntry;
import net.sf.jftp.gui.DownloadList;
import cn.ac.sdg.gb.client.CacheHashtable;
import net.sf.jftp.util.StringUtils;

public class DownloadTree {
public static final ImageIcon ICON_COMPUTER = new ImageIcon("computer.gif");
public static final ImageIcon ICON_DISK = new ImageIcon("disk.gif");
public static final ImageIcon ICON_FOLDER = new ImageIcon("folder.gif");
public static final ImageIcon ICON_EXPANDEDFOLDER =
new ImageIcon("expandedfolder.gif");

protected JTree m_tree;
protected DefaultTreeModel m_model;
protected EntryNode currentNode;
protected DefaultMutableTreeNode top;

public DownloadTree() {
top =
new DefaultMutableTreeNode(
new IconData(ICON_COMPUTER, null, "Computer"));
m_model = new DefaultTreeModel(top);
m_tree = new JTree(m_model);
m_tree.putClientProperty("JTree.lineStyle", "Angled");
TreeCellRenderer renderer = new IconCellRenderer();
m_tree.setCellRenderer(renderer);
m_tree.addTreeExpansionListener(new DirExpansionListener());
m_tree.addTreeSelectionListener(new DirSelectionListener());
m_tree.getSelectionModel().setSelectionMode(
TreeSelectionModel.SINGLE_TREE_SELECTION);
m_tree.setShowsRootHandles(true);
m_tree.setEditable(false);
m_tree.setRootVisible(false);
WindowListener wndCloser = new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
};
}

public JTree getTree() {
return m_tree;
}

public void removeTree() {
top.removeAllChildren();
}

public void addDirEntry(DirEntry nd) {
IconData idata =
new IconData(
DownloadTree.ICON_FOLDER,
DownloadTree.ICON_EXPANDEDFOLDER,
new EntryNode(nd));
DefaultMutableTreeNode node = new DefaultMutableTreeNode(idata);
top.add(node);
if (nd.isDirectory())
node.add(new DefaultMutableTreeNode(new Boolean(true)));
}

public EntryNode getCurrentNode() {
return currentNode;
}

public DirEntry getCurrentEntry() {
return currentNode.m_file;
}

public DefaultTreeModel getDefaultTreeModel() {
return m_model;
}

// public TreePath getCurrentTreePath() {
// return m_tree.getSelectionPath();
// }

public DefaultMutableTreeNode getTreeNode(TreePath path) {
return (DefaultMutableTreeNode) (path.getLastPathComponent());
}

EntryNode getEntryNode(DefaultMutableTreeNode node) {
if (node == null)
return null;
Object obj = node.getUserObject();
if (obj instanceof IconData)
obj = ((IconData) obj).getObject();
if (obj instanceof EntryNode)
return (EntryNode) obj;
else
return null;
}

// Make sure expansion is threaded and updating the tree model
// only occurs within the event dispatching thread.
class DirExpansionListener implements TreeExpansionListener {
public void treeExpanded(TreeExpansionEvent event) {
// System.out.println(event.getPath());
final DefaultMutableTreeNode node = getTreeNode(event.getPath());
final EntryNode fnode = getEntryNode(node);

Thread runner = new Thread() {
public void run() {
if (fnode != null && fnode.expand(node)) {
Runnable runnable = new Runnable() {
public void run() {
m_model.reload(node);
}
};
SwingUtilities.invokeLater(runnable);
}
}
};
runner.start();
}

public void treeCollapsed(TreeExpansionEvent event) {
}
}

class DirSelectionListener implements TreeSelectionListener {
public void valueChanged(TreeSelectionEvent event) {
DefaultMutableTreeNode node = getTreeNode(event.getPath());
EntryNode fnode = getEntryNode(node);
if (fnode != null)
currentNode = fnode;
else
currentNode = null;
}
}
}

class IconCellRenderer extends JLabel implements TreeCellRenderer {
protected Color m_textSelectionColor;
protected Color m_textNonSelectionColor;
protected Color m_bkSelectionColor;
protected Color m_bkNonSelectionColor;
protected Color m_borderSelectionColor;

protected boolean m_selected;

public IconCellRenderer() {
super();
m_textSelectionColor = UIManager.getColor("Tree.selectionForeground");
m_textNonSelectionColor = UIManager.getColor("Tree.textForeground");
m_bkSelectionColor = UIManager.getColor("Tree.selectionBackground");
m_bkNonSelectionColor = UIManager.getColor("Tree.textBackground");
m_borderSelectionColor =
UIManager.getColor("Tree.selectionBorderColor");
setOpaque(false);
}

public Component getTreeCellRendererComponent(
JTree tree,
Object value,
boolean sel,
boolean expanded,
boolean leaf,
int row,
boolean hasFocus) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
Object obj = node.getUserObject();
setText(obj.toString());

if (obj instanceof Boolean)
setText("Retrieving data...");

if (obj instanceof IconData) {
IconData idata = (IconData) obj;
if (expanded)
setIcon(idata.getExpandedIcon());
else
setIcon(idata.getIcon());
} else
setIcon(null);

setFont(tree.getFont());
setForeground(sel ? m_textSelectionColor : m_textNonSelectionColor);
setBackground(sel ? m_bkSelectionColor : m_bkNonSelectionColor);
m_selected = sel;
return this;
}

public void paintComponent(Graphics g) {
Color bColor = getBackground();
Icon icon = getIcon();

g.setColor(bColor);
int offset = 0;
if (icon != null && getText() != null)
offset = (icon.getIconWidth() + getIconTextGap());
g.fillRect(offset, 0, getWidth() - 1 - offset, getHeight() - 1);

if (m_selected) {
g.setColor(m_borderSelectionColor);
g.drawRect(offset, 0, getWidth() - 1 - offset, getHeight() - 1);
}
super.paintComponent(g);
}
}

kevin_dong 2004-09-17
  • 打赏
  • 举报
回复
up
Hunk2003 2004-09-17
  • 打赏
  • 举报
回复
需要显示一下源代码,类似的问题有很多种。
bradwoo8621 2004-09-17
  • 打赏
  • 举报
回复
treemodel.nodeStructureChanged
实现文件的拖拽功能 import java.awt.AlphaComposite; import java.awt.Component; import java.awt.Graphics2D; import java.awt.Point; import java.awt.Rectangle; import java.awt.Toolkit; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.StringSelection; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.awt.dnd.DnDConstants; import java.awt.dnd.DragGestureEvent; import java.awt.dnd.DragGestureListener; import java.awt.dnd.DragSource; import java.awt.dnd.DragSourceDragEvent; import java.awt.dnd.DragSourceDropEvent; import java.awt.dnd.DragSourceEvent; import java.awt.dnd.DragSourceListener; import java.awt.dnd.DropTarget; import java.awt.dnd.DropTargetDragEvent; import java.awt.dnd.DropTargetDropEvent; import java.awt.dnd.DropTargetEvent; import java.awt.dnd.DropTargetListener; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.geom.AffineTransform; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.Iterator; import java.util.List; import javax.swing.Icon; import javax.swing.JLabel; import javax.swing.JTree; import javax.swing.Timer; import javax.swing.event.TreeExpansionEvent; import javax.swing.event.TreeExpansionListener; import javax.swing.filechooser.FileSystemView; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreePath; class DragTree extends JTree implements DragGestureListener, DragSourceListener, DropTargetListener { /** * */ private static final long serialVersionUID = 1L; BufferedImage ghostImage; private Rectangle2D ghostRect = new Rectangle2D.Float(); private Point ptOffset = new Point(); private Point lastPoint = new Point(); private TreePath lastPath; private Timer hoverTimer; FileNode sourceNode; public DragTree() { DragSource dragSource = DragSource.getDefaultDragSource(); dragSource.createDefaultDragGestureRecognizer(this, // component where // drag originates DnDConstants.ACTION_COPY_OR_MOVE, // actions this); // drag gesture recognizer setModel(createTreeModel()); addTreeExpansionListener(new TreeExpansionListener() { public void treeCollapsed(TreeExpansionEvent e) { } public void treeExpanded(TreeExpansionEvent e) { TreePath path = e.getPath(); if (path != null) { FileNode node = (FileNode) path.getLastPathComponent(); if (!node.isExplored()) { DefaultTreeModel model = (DefaultTreeModel) getModel(); node.explore(); model.nodeStructureChanged(node); } } } }); this.setCellRenderer(new DefaultTreeCellRenderer() { public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { TreePath tp = tree.getPathForRow(row); if (tp != null) { FileNode node = (FileNode) tp.getLastPathComponent(); File f = node.getFile(); try { Icon icon = FileSystemView.getFileSystemView() .getSystemIcon(f); this.setIcon(icon); this.setLeafIcon(icon); this.setOpenIcon(icon); this.setClosedIcon(icon); this.setDisabledIcon(icon); } catch (Exception e) { e.printStackTrace(); } } return super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus); } }); super.setScrollsOnExpand(true); new DropTarget(this, DnDConstants.ACTION_COPY_OR_MOVE, this); // Set up a hover timer, so that a node will be automatically expanded // or collapsed // if the user lingers on it for more than a short time hoverTimer = new Timer(1000, new ActionListener() { public void actionPerformed(ActionEvent e) { if (lastPath == null) { return; } if (getRowForPath(lastPath) == 0) return; // Do nothing if we are hovering over the root node if (isExpanded(lastPath)) collapsePath(lastPath); else expandPath(lastPath); } }); hoverTimer.setRepeats(false); // Set timer to one-shot mode this.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) { int code = e.getKeyCode(); int modifiers = e.getModifiers(); if (code == 'v' || code == 'V') { System.out.println("find v"); System.out.println("modifiers:" + modifiers + "\t" + ((modifiers & KeyEvent.CTRL_MASK) != 0)); } if ((modifiers & KeyEvent.CTRL_MASK) != 0 && (code == 'v' || code == 'V')) { Transferable tr = Toolkit.getDefaultToolkit() .getSystemClipboard().getContents(null); TreePath path = getSelectionPath(); if (path == null) { return; } FileNode node = (FileNode) path.getLastPathComponent(); if (node.isDirectory()) { System.out.println("file cp"); try { List list = (List) (tr .getTransferData(DataFlavor.javaFileListFlavor)); Iterator iterator = list.iterator(); File parent = node.getFile(); while (iterator.hasNext()) { File f = (File) iterator.next(); cp(f, new File(parent, f.getName())); } node.reexplore(); } catch (Exception ioe) { ioe.printStackTrace(); } updateUI(); } } } }); } public void dragGestureRecognized(DragGestureEvent e) { // drag anything ... TreePath path = getLeadSelectionPath(); if (path == null) return; FileNode node = (FileNode) path.getLastPathComponent(); sourceNode = node; // Work out the offset of the drag point from the TreePath bounding // rectangle origin Rectangle raPath = getPathBounds(path); Point ptDragOrigin = e.getDragOrigin(); ptOffset.setLocation(ptDragOrigin.x - raPath.x, ptDragOrigin.y - raPath.y); // Get the cell renderer (which is a JLabel) for the path being dragged int row = this.getRowForLocation(ptDragOrigin.x, ptDragOrigin.y); JLabel lbl = (JLabel) getCellRenderer().getTreeCellRendererComponent( this, // tree path.getLastPathComponent(), // value false, // isSelected (dont want a colored background) isExpanded(path), // isExpanded getModel().isLeaf(path.getLastPathComponent()), // isLeaf row, // row (not important for rendering) false // hasFocus (dont want a focus rectangle) ); lbl.setSize((int) raPath.getWidth(), (int) raPath.getHeight()); // <-- // The // layout // manager // would // normally // do // this // Get a buffered image of the selection for dragging a ghost image this.ghostImage = new BufferedImage((int) raPath.getWidth(), (int) raPath.getHeight(), BufferedImage.TYPE_INT_ARGB_PRE); Graphics2D g2 = ghostImage.createGraphics(); // Ask the cell renderer to paint itself into the BufferedImage g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC, 0.5f)); // Make the image ghostlike lbl.paint(g2); g2.dispose(); // this.getGraphics().drawImage(ghostImage, e.getDragOrigin().x, // e.getDragOrigin().y, this); e.startDrag( null, // cursor ghostImage, new Point(5, 5), new StringSelection(getFilename()), // transferable this); // drag source listener } public void dragDropEnd(DragSourceDropEvent e) { ghostImage = null; sourceNode = null; } public void dragEnter(DragSourceDragEvent e) { } public void dragExit(DragSourceEvent e) { if (!DragSource.isDragImageSupported()) { repaint(ghostRect.getBounds()); } } public void dragOver(DragSourceDragEvent e) { } public void dropActionChanged(DragSourceDragEvent e) { } public String getFilename() { TreePath path = getLeadSelectionPath(); FileNode node = (FileNode) path.getLastPathComponent(); return ((File) node.getUserObject()).getAbsolutePath(); } private DefaultTreeModel createTreeModel() { File root = FileSystemView.getFileSystemView().getRoots()[0]; FileNode rootNode = new FileNode(root); rootNode.explore(); return new DefaultTreeModel(rootNode); } public void dragEnter(DropTargetDragEvent dtde) { } public void dragOver(DropTargetDragEvent dtde) { Point pt = dtde.getLocation(); if (pt.equals(lastPoint)) { return; } if (ghostImage != null) { Graphics2D g2 = (Graphics2D) getGraphics(); // If a drag image is not supported by the platform, then draw my // own drag image if (!DragSource.isDragImageSupported()) { paintImmediately(ghostRect.getBounds()); // Rub out the last // ghost image and cue // line // And remember where we are about to draw the new ghost image ghostRect.setRect(pt.x - ptOffset.x, pt.y - ptOffset.y, ghostImage.getWidth(), ghostImage.getHeight()); g2.drawImage((ghostImage), AffineTransform .getTranslateInstance(ghostRect.getX(), ghostRect.getY()), null); } } TreePath path = getClosestPathForLocation(pt.x, pt.y); if (!(path == lastPath)) { lastPath = path; hoverTimer.restart(); } } public void dropActionChanged(DropTargetDragEvent dtde) { } public void drop(DropTargetDropEvent e) { try { DataFlavor stringFlavor = DataFlavor.stringFlavor; Transferable tr = e.getTransferable(); TreePath path = this.getPathForLocation(e.getLocation().x, e.getLocation().y); if (path == null) { e.rejectDrop(); return; } FileNode node = (FileNode) path.getLastPathComponent(); if (e.isDataFlavorSupported(DataFlavor.javaFileListFlavor) && node.isDirectory()) { e.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE); System.out.println("file cp"); List list = (List) (e.getTransferable() .getTransferData(DataFlavor.javaFileListFlavor)); Iterator iterator = list.iterator(); File parent = node.getFile(); while (iterator.hasNext()) { File f = (File) iterator.next(); cp(f, new File(parent, f.getName())); } node.reexplore(); e.dropComplete(true); this.updateUI(); } else if (e.isDataFlavorSupported(stringFlavor) && node.isDirectory()) { String filename = (String) tr.getTransferData(stringFlavor); if (filename.endsWith(".txt") || filename.endsWith(".java") || filename.endsWith(".jsp") || filename.endsWith(".html") || filename.endsWith(".htm")) { e.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE); File f = new File(filename); if (f.exists()) { f.renameTo(new File(node.getFile(), f.getName())); node.reexplore(); ((FileNode) sourceNode.getParent()).remove(sourceNode); e.dropComplete(true); this.updateUI(); } else { e.rejectDrop(); } } else { e.rejectDrop(); } } else { e.rejectDrop(); } } catch (IOException ioe) { ioe.printStackTrace(); } catch (UnsupportedFlavorException ufe) { ufe.printStackTrace(); } finally { ghostImage = null; this.repaint(); } } private void cp(File src, File dest) throws IOException { if (src.isDirectory()) { if (!dest.exists()) { boolean ret = dest.mkdir(); if (ret == false) return; } File[] fs = src.listFiles(); for (int i = 0; i < fs.length; i++) { cp(fs[i], new File(dest, fs[i].getName())); } return; } byte[] buf = new byte[1024]; FileInputStream in = new FileInputStream(src); FileOutputStream out = new FileOutputStream(dest); int len; try { while ((len = in.read(buf)) > 0) { out.write(buf, 0, len); } } finally { in.close(); out.close(); } } public void dragExit(DropTargetEvent dte) { } } class FileNode extends DefaultMutableTreeNode { private boolean explored = false; public FileNode(File file) { setUserObject(file); } public boolean getAllowsChildren() { return isDirectory(); } public boolean isLeaf() { return !isDirectory(); } public File getFile() { return (File) getUserObject(); } public boolean isExplored() { return explored; } public boolean isDirectory() { File file = getFile(); return file.isDirectory(); } public String toString() { File file = (File) getUserObject(); String filename = file.toString(); int index = filename.lastIndexOf(File.separator); return (index != -1 && index != filename.length() - 1) ? filename .substring(index + 1) : filename; } public void explore() { if (!isDirectory()) return; if (!isExplored()) { File file = getFile(); File[] children = file.listFiles(); for (int i = 0; i < children.length; ++i) { if (children[i].isDirectory()) add(new FileNode(children[i])); } for (int i = 0; i < children.length; ++i) { if (!children[i].isDirectory()) add(new FileNode(children[i])); } explored = true; } } public void reexplore() { this.removeAllChildren(); explored = false; explore(); } }

62,636

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧