提交 a2f14590 编写于 作者: M mrkam

7027698: /jfc/SampleTree demo needs to be improved

Reviewed-by: rupashka
上级 1080aa8f
/* /*
* Copyright (c) 1997, 1998, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
...@@ -29,14 +29,13 @@ ...@@ -29,14 +29,13 @@
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
/*
*/
import javax.swing.tree.DefaultMutableTreeNode;
import java.awt.Color; import java.awt.Color;
import java.awt.Font; import java.awt.Font;
import java.awt.Toolkit; import java.awt.GraphicsEnvironment;
import java.util.Random; import java.util.Random;
import javax.swing.tree.DefaultMutableTreeNode;
/** /**
* DynamicTreeNode illustrates one of the possible ways in which dynamic * DynamicTreeNode illustrates one of the possible ways in which dynamic
...@@ -64,35 +63,33 @@ import java.util.Random; ...@@ -64,35 +63,33 @@ import java.util.Random;
* *
* @author Scott Violet * @author Scott Violet
*/ */
@SuppressWarnings("serial")
public class DynamicTreeNode extends DefaultMutableTreeNode public class DynamicTreeNode extends DefaultMutableTreeNode {
{
// Class stuff. // Class stuff.
/** Number of names. */
static protected float nameCount;
/** Number of names. */
protected static float nameCount;
/** Names to use for children. */ /** Names to use for children. */
static protected String[] names; protected static final String[] NAMES;
/** Potential fonts used to draw with. */ /** Potential fonts used to draw with. */
static protected Font[] fonts; protected static Font[] fonts;
/** Used to generate the names. */ /** Used to generate the names. */
static protected Random nameGen; protected static Random nameGen;
/** Number of children to create for each node. */ /** Number of children to create for each node. */
static protected final int DefaultChildrenCount = 7; protected static final int DEFAULT_CHILDREN_COUNT = 7;
static { static {
String[] fontNames; String[] fontNames;
try { try {
fontNames = Toolkit.getDefaultToolkit().getFontList(); fontNames = GraphicsEnvironment.getLocalGraphicsEnvironment().
getAvailableFontFamilyNames();
} catch (Exception e) { } catch (Exception e) {
fontNames = null; fontNames = null;
} }
if(fontNames == null || fontNames.length == 0) { if (fontNames == null || fontNames.length == 0) {
names = new String[] {"Mark Andrews", "Tom Ball", "Alan Chung", NAMES = new String[] { "Mark Andrews", "Tom Ball", "Alan Chung",
"Rob Davis", "Jeff Dinkins", "Rob Davis", "Jeff Dinkins",
"Amy Fowler", "James Gosling", "Amy Fowler", "James Gosling",
"David Karlton", "Dave Kloba", "David Karlton", "Dave Kloba",
...@@ -101,30 +98,26 @@ public class DynamicTreeNode extends DefaultMutableTreeNode ...@@ -101,30 +98,26 @@ public class DynamicTreeNode extends DefaultMutableTreeNode
"Chester Rose", "Ray Ryan", "Chester Rose", "Ray Ryan",
"Georges Saab", "Scott Violet", "Georges Saab", "Scott Violet",
"Kathy Walrath", "Arnaud Weber" }; "Kathy Walrath", "Arnaud Weber" };
} } else {
else {
/* Create the Fonts, creating fonts is slow, much better to /* Create the Fonts, creating fonts is slow, much better to
do it once. */ do it once. */
int fontSize = 12; int fontSize = 12;
names = fontNames; NAMES = fontNames;
fonts = new Font[names.length]; fonts = new Font[NAMES.length];
for(int counter = 0, maxCounter = names.length; for (int counter = 0, maxCounter = NAMES.length;
counter < maxCounter; counter++) { counter < maxCounter; counter++) {
try { try {
fonts[counter] = new Font(fontNames[counter], 0, fontSize); fonts[counter] = new Font(fontNames[counter], 0, fontSize);
} } catch (Exception e) {
catch (Exception e) {
fonts[counter] = null; fonts[counter] = null;
} }
fontSize = ((fontSize + 2 - 12) % 12) + 12; fontSize = ((fontSize + 2 - 12) % 12) + 12;
} }
} }
nameCount = (float)names.length; nameCount = (float) NAMES.length;
nameGen = new Random(System.currentTimeMillis()); nameGen = new Random(System.currentTimeMillis());
} }
/** Have the children of this node been loaded yet? */ /** Have the children of this node been loaded yet? */
protected boolean hasLoaded; protected boolean hasLoaded;
...@@ -136,6 +129,7 @@ public class DynamicTreeNode extends DefaultMutableTreeNode ...@@ -136,6 +129,7 @@ public class DynamicTreeNode extends DefaultMutableTreeNode
super(o); super(o);
} }
@Override
public boolean isLeaf() { public boolean isLeaf() {
return false; return false;
} }
...@@ -145,8 +139,9 @@ public class DynamicTreeNode extends DefaultMutableTreeNode ...@@ -145,8 +139,9 @@ public class DynamicTreeNode extends DefaultMutableTreeNode
* loaded, loadChildren is messaged and super is messaged for * loaded, loadChildren is messaged and super is messaged for
* the return value. * the return value.
*/ */
@Override
public int getChildCount() { public int getChildCount() {
if(!hasLoaded) { if (!hasLoaded) {
loadChildren(); loadChildren();
} }
return super.getChildCount(); return super.getChildCount();
...@@ -162,17 +157,22 @@ public class DynamicTreeNode extends DefaultMutableTreeNode ...@@ -162,17 +157,22 @@ public class DynamicTreeNode extends DefaultMutableTreeNode
int randomIndex; int randomIndex;
SampleData data; SampleData data;
for(int counter = 0; counter < DynamicTreeNode.DefaultChildrenCount; for (int counter = 0; counter < DynamicTreeNode.DEFAULT_CHILDREN_COUNT;
counter++) { counter++) {
randomIndex = (int)(nameGen.nextFloat() * nameCount); randomIndex = (int) (nameGen.nextFloat() * nameCount);
if(fonts != null) String displayString = NAMES[randomIndex];
font = fonts[randomIndex]; if (fonts == null || fonts[randomIndex].canDisplayUpTo(displayString)
else != -1) {
font = null; font = null;
if(counter % 2 == 0) } else {
data = new SampleData(font, Color.red, names[randomIndex]); font = fonts[randomIndex];
else }
data = new SampleData(font, Color.blue, names[randomIndex]);
if (counter % 2 == 0) {
data = new SampleData(font, Color.red, displayString);
} else {
data = new SampleData(font, Color.blue, displayString);
}
newNode = new DynamicTreeNode(data); newNode = new DynamicTreeNode(data);
/* Don't use add() here, add calls insert(newNode, getChildCount()) /* Don't use add() here, add calls insert(newNode, getChildCount())
so if you want to use add, just be sure to set hasLoaded = true so if you want to use add, just be sure to set hasLoaded = true
......
/* /*
* Copyright (c) 1997, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
...@@ -29,28 +29,23 @@ ...@@ -29,28 +29,23 @@
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
/*
*/
import java.awt.Color; import java.awt.Color;
import java.awt.Font; import java.awt.Font;
/** /**
* @author Scott Violet * @author Scott Violet
*/ */
public class SampleData extends Object {
public class SampleData extends Object
{
/** Font used for drawing. */ /** Font used for drawing. */
protected Font font; protected Font font;
/** Color used for text. */ /** Color used for text. */
protected Color color; protected Color color;
/** Value to display. */ /** Value to display. */
protected String string; protected String string;
/** /**
* Constructs a new instance of SampleData with the passed in * Constructs a new instance of SampleData with the passed in
* arguments. * arguments.
...@@ -103,6 +98,7 @@ public class SampleData extends Object ...@@ -103,6 +98,7 @@ public class SampleData extends Object
return string; return string;
} }
@Override
public String toString() { public String toString() {
return string; return string;
} }
......
/* /*
* Copyright (c) 1997, 2004, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
...@@ -29,9 +29,10 @@ ...@@ -29,9 +29,10 @@
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
/*
*/
import java.lang.reflect.InvocationTargetException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*; import javax.swing.*;
import javax.swing.event.*; import javax.swing.event.*;
import java.awt.BorderLayout; import java.awt.BorderLayout;
...@@ -40,12 +41,12 @@ import java.awt.Dimension; ...@@ -40,12 +41,12 @@ import java.awt.Dimension;
import java.awt.FlowLayout; import java.awt.FlowLayout;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.*; import java.util.*;
import javax.swing.UIManager.LookAndFeelInfo;
import javax.swing.border.*; import javax.swing.border.*;
import javax.swing.tree.*; import javax.swing.tree.*;
/** /**
* A demo for illustrating how to do different things with JTree. * A demo for illustrating how to do different things with JTree.
* The data that this displays is rather boring, that is each node will * The data that this displays is rather boring, that is each node will
...@@ -65,9 +66,8 @@ import javax.swing.tree.*; ...@@ -65,9 +66,8 @@ import javax.swing.tree.*;
* *
* @author Scott Violet * @author Scott Violet
*/ */
public final class SampleTree {
public class SampleTree
{
/** Window for showing Tree. */ /** Window for showing Tree. */
protected JFrame frame; protected JFrame frame;
/** Tree used for the example. */ /** Tree used for the example. */
...@@ -79,16 +79,16 @@ public class SampleTree ...@@ -79,16 +79,16 @@ public class SampleTree
* Constructs a new instance of SampleTree. * Constructs a new instance of SampleTree.
*/ */
public SampleTree() { public SampleTree() {
// Force SampleTree to come up in the Cross Platform L&F // Trying to set Nimbus look and feel
try { try {
UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName()); for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
// If you want the System L&F instead, comment out the above line and if ("Nimbus".equals(info.getName())) {
// uncomment the following: UIManager.setLookAndFeel(info.getClassName());
// UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); break;
} catch (Exception exc) { }
System.err.println("Error loading L&F: " + exc); }
} catch (Exception ignored) {
} }
JMenuBar menuBar = constructMenuBar(); JMenuBar menuBar = constructMenuBar();
JPanel panel = new JPanel(true); JPanel panel = new JPanel(true);
...@@ -126,15 +126,14 @@ public class SampleTree ...@@ -126,15 +126,14 @@ public class SampleTree
panel.add("Center", sp); panel.add("Center", sp);
panel.add("South", constructOptionsPanel()); panel.add("South", constructOptionsPanel());
frame.addWindowListener( new WindowAdapter() { frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
public void windowClosing(WindowEvent e) {System.exit(0);}});
frame.pack(); frame.pack();
frame.show(); frame.setVisible(true);
} }
/** Constructs a JPanel containing check boxes for the different /** Constructs a JPanel containing check boxes for the different
* options that tree supports. */ * options that tree supports. */
@SuppressWarnings("serial")
private JPanel constructOptionsPanel() { private JPanel constructOptionsPanel() {
JCheckBox aCheckbox; JCheckBox aCheckbox;
JPanel retPanel = new JPanel(false); JPanel retPanel = new JPanel(false);
...@@ -171,30 +170,45 @@ public class SampleTree ...@@ -171,30 +170,45 @@ public class SampleTree
buttonPane.setBorder(new TitledBorder("Selection Mode")); buttonPane.setBorder(new TitledBorder("Selection Mode"));
button = new JRadioButton("Single"); button = new JRadioButton("Single");
button.addActionListener(new AbstractAction() { button.addActionListener(new AbstractAction() {
public boolean isEnabled() { return true; }
@Override
public boolean isEnabled() {
return true;
}
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
tree.getSelectionModel().setSelectionMode tree.getSelectionModel().setSelectionMode(
(TreeSelectionModel.SINGLE_TREE_SELECTION); TreeSelectionModel.SINGLE_TREE_SELECTION);
} }
}); });
group.add(button); group.add(button);
buttonPane.add(button); buttonPane.add(button);
button = new JRadioButton("Contiguous"); button = new JRadioButton("Contiguous");
button.addActionListener(new AbstractAction() { button.addActionListener(new AbstractAction() {
public boolean isEnabled() { return true; }
@Override
public boolean isEnabled() {
return true;
}
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
tree.getSelectionModel().setSelectionMode tree.getSelectionModel().setSelectionMode(
(TreeSelectionModel.CONTIGUOUS_TREE_SELECTION); TreeSelectionModel.CONTIGUOUS_TREE_SELECTION);
} }
}); });
group.add(button); group.add(button);
buttonPane.add(button); buttonPane.add(button);
button = new JRadioButton("Discontiguous"); button = new JRadioButton("Discontiguous");
button.addActionListener(new AbstractAction() { button.addActionListener(new AbstractAction() {
public boolean isEnabled() { return true; }
@Override
public boolean isEnabled() {
return true;
}
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
tree.getSelectionModel().setSelectionMode tree.getSelectionModel().setSelectionMode(
(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION); TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION);
} }
}); });
button.setSelected(true); button.setSelected(true);
...@@ -227,7 +241,7 @@ public class SampleTree ...@@ -227,7 +241,7 @@ public class SampleTree
}); });
clickPanel.add(clickCBox); clickPanel.add(clickCBox);
borderPane.add(clickPanel, BorderLayout.NORTH); borderPane.add(clickPanel, BorderLayout.NORTH);
*/ */
return borderPane; return borderPane;
} }
...@@ -243,9 +257,11 @@ public class SampleTree ...@@ -243,9 +257,11 @@ public class SampleTree
menuItem = menu.add(new JMenuItem("Exit")); menuItem = menu.add(new JMenuItem("Exit"));
menuItem.addActionListener(new ActionListener() { menuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
System.exit(0); System.exit(0);
}}); }
});
/* Tree related stuff. */ /* Tree related stuff. */
menu = new JMenu("Tree"); menu = new JMenu("Tree");
...@@ -273,8 +289,9 @@ public class SampleTree ...@@ -273,8 +289,9 @@ public class SampleTree
protected DefaultMutableTreeNode getSelectedNode() { protected DefaultMutableTreeNode getSelectedNode() {
TreePath selPath = tree.getSelectionPath(); TreePath selPath = tree.getSelectionPath();
if(selPath != null) if (selPath != null) {
return (DefaultMutableTreeNode)selPath.getLastPathComponent(); return (DefaultMutableTreeNode) selPath.getLastPathComponent();
}
return null; return null;
} }
...@@ -290,11 +307,12 @@ public class SampleTree ...@@ -290,11 +307,12 @@ public class SampleTree
return new DynamicTreeNode(new SampleData(null, Color.black, name)); return new DynamicTreeNode(new SampleData(null, Color.black, name));
} }
/** /**
* AddAction is used to add a new item after the selected item. * AddAction is used to add a new item after the selected item.
*/ */
class AddAction extends Object implements ActionListener class AddAction extends Object implements ActionListener {
{
/** Number of nodes that have been added. */ /** Number of nodes that have been added. */
public int addCount; public int addCount;
...@@ -309,30 +327,30 @@ public class SampleTree ...@@ -309,30 +327,30 @@ public class SampleTree
DefaultMutableTreeNode parent; DefaultMutableTreeNode parent;
/* Determine where to create the new node. */ /* Determine where to create the new node. */
if(lastItem != null) { if (lastItem != null) {
parent = (DefaultMutableTreeNode)lastItem.getParent(); parent = (DefaultMutableTreeNode) lastItem.getParent();
if(parent == null) { if (parent == null) {
parent = (DefaultMutableTreeNode)treeModel.getRoot(); parent = (DefaultMutableTreeNode) treeModel.getRoot();
lastItem = null; lastItem = null;
} }
} else {
parent = (DefaultMutableTreeNode) treeModel.getRoot();
} }
else
parent = (DefaultMutableTreeNode)treeModel.getRoot();
if (parent == null) { if (parent == null) {
// new root // new root
treeModel.setRoot(createNewNode("Added " + treeModel.setRoot(createNewNode("Added " + Integer.toString(
Integer.toString(addCount++))); addCount++)));
} } else {
else {
int newIndex; int newIndex;
if(lastItem == null) if (lastItem == null) {
newIndex = treeModel.getChildCount(parent); newIndex = treeModel.getChildCount(parent);
else } else {
newIndex = parent.getIndex(lastItem) + 1; newIndex = parent.getIndex(lastItem) + 1;
}
/* Let the treemodel know. */ /* Let the treemodel know. */
treeModel.insertNodeInto(createNewNode("Added " + treeModel.insertNodeInto(createNewNode("Added " + Integer.
Integer.toString(addCount++)), toString(addCount++)),
parent, newIndex); parent, newIndex);
} }
} }
...@@ -342,8 +360,8 @@ public class SampleTree ...@@ -342,8 +360,8 @@ public class SampleTree
/** /**
* InsertAction is used to insert a new item before the selected item. * InsertAction is used to insert a new item before the selected item.
*/ */
class InsertAction extends Object implements ActionListener class InsertAction extends Object implements ActionListener {
{
/** Number of nodes that have been added. */ /** Number of nodes that have been added. */
public int insertCount; public int insertCount;
...@@ -358,31 +376,31 @@ public class SampleTree ...@@ -358,31 +376,31 @@ public class SampleTree
DefaultMutableTreeNode parent; DefaultMutableTreeNode parent;
/* Determine where to create the new node. */ /* Determine where to create the new node. */
if(lastItem != null) { if (lastItem != null) {
parent = (DefaultMutableTreeNode)lastItem.getParent(); parent = (DefaultMutableTreeNode) lastItem.getParent();
if(parent == null) { if (parent == null) {
parent = (DefaultMutableTreeNode)treeModel.getRoot(); parent = (DefaultMutableTreeNode) treeModel.getRoot();
lastItem = null; lastItem = null;
} }
} else {
parent = (DefaultMutableTreeNode) treeModel.getRoot();
} }
else
parent = (DefaultMutableTreeNode)treeModel.getRoot();
if (parent == null) { if (parent == null) {
// new root // new root
treeModel.setRoot(createNewNode("Inserted " + treeModel.setRoot(createNewNode("Inserted " + Integer.toString(
Integer.toString(insertCount++))); insertCount++)));
} } else {
else {
int newIndex; int newIndex;
if(lastItem == null) if (lastItem == null) {
newIndex = treeModel.getChildCount(parent); newIndex = treeModel.getChildCount(parent);
else } else {
newIndex = parent.getIndex(lastItem); newIndex = parent.getIndex(lastItem);
}
/* Let the treemodel know. */ /* Let the treemodel know. */
treeModel.insertNodeInto(createNewNode("Inserted " + treeModel.insertNodeInto(createNewNode("Inserted " + Integer.
Integer.toString(insertCount++)), toString(insertCount++)),
parent, newIndex); parent, newIndex);
} }
} }
...@@ -393,8 +411,8 @@ public class SampleTree ...@@ -393,8 +411,8 @@ public class SampleTree
* ReloadAction is used to reload from the selected node. If nothing * ReloadAction is used to reload from the selected node. If nothing
* is selected, reload is not issued. * is selected, reload is not issued.
*/ */
class ReloadAction extends Object implements ActionListener class ReloadAction extends Object implements ActionListener {
{
/** /**
* Messaged when the user clicks on the Reload menu item. * Messaged when the user clicks on the Reload menu item.
* Determines the selection from the Tree and asks the treemodel * Determines the selection from the Tree and asks the treemodel
...@@ -403,17 +421,19 @@ public class SampleTree ...@@ -403,17 +421,19 @@ public class SampleTree
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
DefaultMutableTreeNode lastItem = getSelectedNode(); DefaultMutableTreeNode lastItem = getSelectedNode();
if(lastItem != null) if (lastItem != null) {
treeModel.reload(lastItem); treeModel.reload(lastItem);
} }
}
} // End of SampleTree.ReloadAction } // End of SampleTree.ReloadAction
/** /**
* RemoveAction removes the selected node from the tree. If * RemoveAction removes the selected node from the tree. If
* The root or nothing is selected nothing is removed. * The root or nothing is selected nothing is removed.
*/ */
class RemoveAction extends Object implements ActionListener class RemoveAction extends Object implements ActionListener {
{
/** /**
* Removes the selected item as long as it isn't root. * Removes the selected item as long as it isn't root.
*/ */
...@@ -451,19 +471,17 @@ public class SampleTree ...@@ -451,19 +471,17 @@ public class SampleTree
paths[counter] = null; paths[counter] = null;
} }
treeModel.setRoot(null); treeModel.setRoot(null);
} } else {
else {
// Find the siblings of path. // Find the siblings of path.
TreePath parent = path.getParentPath(); TreePath parent = path.getParentPath();
MutableTreeNode parentNode = (MutableTreeNode)parent. MutableTreeNode parentNode = (MutableTreeNode) parent.
getLastPathComponent(); getLastPathComponent();
ArrayList toRemove = new ArrayList(); ArrayList<TreePath> toRemove = new ArrayList<TreePath>();
int depth = parent.getPathCount();
// First pass, find paths with a parent TreePath of parent // First pass, find paths with a parent TreePath of parent
for (int counter = paths.length - 1; counter >= 0; counter--) { for (int counter = paths.length - 1; counter >= 0; counter--) {
if (paths[counter] != null && paths[counter]. if (paths[counter] != null && paths[counter].getParentPath().
getParentPath().equals(parent)) { equals(parent)) {
toRemove.add(paths[counter]); toRemove.add(paths[counter]);
paths[counter] = null; paths[counter] = null;
} }
...@@ -478,8 +496,8 @@ public class SampleTree ...@@ -478,8 +496,8 @@ public class SampleTree
if (paths[counter] != null) { if (paths[counter] != null) {
for (int rCounter = rCount - 1; rCounter >= 0; for (int rCounter = rCount - 1; rCounter >= 0;
rCounter--) { rCounter--) {
if (((TreePath)toRemove.get(rCounter)). if ((toRemove.get(rCounter)).isDescendant(
isDescendant(paths[counter])) { paths[counter])) {
paths[counter] = null; paths[counter] = null;
} }
} }
...@@ -493,10 +511,10 @@ public class SampleTree ...@@ -493,10 +511,10 @@ public class SampleTree
int[] indices = new int[rCount]; int[] indices = new int[rCount];
Object[] removedNodes = new Object[rCount]; Object[] removedNodes = new Object[rCount];
for (int counter = rCount - 1; counter >= 0; counter--) { for (int counter = rCount - 1; counter >= 0; counter--) {
removedNodes[counter] = ((TreePath)toRemove.get(counter)). removedNodes[counter] = (toRemove.get(counter)).
getLastPathComponent(); getLastPathComponent();
indices[counter] = treeModel.getIndexOfChild indices[counter] = treeModel.getIndexOfChild(parentNode,
(parentNode, removedNodes[counter]); removedNodes[counter]);
parentNode.remove(indices[counter]); parentNode.remove(indices[counter]);
} }
treeModel.nodesWereRemoved(parentNode, indices, removedNodes); treeModel.nodesWereRemoved(parentNode, indices, removedNodes);
...@@ -522,8 +540,7 @@ public class SampleTree ...@@ -522,8 +540,7 @@ public class SampleTree
return shallowestPath; return shallowestPath;
} }
} }
} } else {
else {
shallowestPath = paths[counter]; shallowestPath = paths[counter];
shallowest = paths[counter].getPathCount(); shallowest = paths[counter].getPathCount();
} }
...@@ -540,22 +557,16 @@ public class SampleTree ...@@ -540,22 +557,16 @@ public class SampleTree
* This is actually rather expensive, it would be more efficient * This is actually rather expensive, it would be more efficient
* to extract the indices and then do the comparision. * to extract the indices and then do the comparision.
*/ */
private class PositionComparator implements Comparator { private class PositionComparator implements Comparator<TreePath> {
public int compare(Object o1, Object o2) {
TreePath p1 = (TreePath)o1; public int compare(TreePath p1, TreePath p2) {
int o1Index = treeModel.getIndexOfChild(p1.getParentPath(). int p1Index = treeModel.getIndexOfChild(p1.getParentPath().
getLastPathComponent(), p1.getLastPathComponent()); getLastPathComponent(), p1.getLastPathComponent());
TreePath p2 = (TreePath)o2; int p2Index = treeModel.getIndexOfChild(p2.getParentPath().
int o2Index = treeModel.getIndexOfChild(p2.getParentPath().
getLastPathComponent(), p2.getLastPathComponent()); getLastPathComponent(), p2.getLastPathComponent());
return o1Index - o2Index; return p1Index - p2Index;
}
public boolean equals(Object obj) {
return super.equals(obj);
} }
} }
} // End of SampleTree.RemoveAction } // End of SampleTree.RemoveAction
...@@ -563,12 +574,11 @@ public class SampleTree ...@@ -563,12 +574,11 @@ public class SampleTree
* ShowHandlesChangeListener implements the ChangeListener interface * ShowHandlesChangeListener implements the ChangeListener interface
* to toggle the state of showing the handles in the tree. * to toggle the state of showing the handles in the tree.
*/ */
class ShowHandlesChangeListener extends Object implements ChangeListener class ShowHandlesChangeListener extends Object implements ChangeListener {
{
public void stateChanged(ChangeEvent e) { public void stateChanged(ChangeEvent e) {
tree.setShowsRootHandles(((JCheckBox)e.getSource()).isSelected()); tree.setShowsRootHandles(((JCheckBox) e.getSource()).isSelected());
} }
} // End of class SampleTree.ShowHandlesChangeListener } // End of class SampleTree.ShowHandlesChangeListener
...@@ -576,12 +586,11 @@ public class SampleTree ...@@ -576,12 +586,11 @@ public class SampleTree
* ShowRootChangeListener implements the ChangeListener interface * ShowRootChangeListener implements the ChangeListener interface
* to toggle the state of showing the root node in the tree. * to toggle the state of showing the root node in the tree.
*/ */
class ShowRootChangeListener extends Object implements ChangeListener class ShowRootChangeListener extends Object implements ChangeListener {
{
public void stateChanged(ChangeEvent e) { public void stateChanged(ChangeEvent e) {
tree.setRootVisible(((JCheckBox)e.getSource()).isSelected()); tree.setRootVisible(((JCheckBox) e.getSource()).isSelected());
} }
} // End of class SampleTree.ShowRootChangeListener } // End of class SampleTree.ShowRootChangeListener
...@@ -590,17 +599,28 @@ public class SampleTree ...@@ -590,17 +599,28 @@ public class SampleTree
* to toggle between allowing editing and now allowing editing in * to toggle between allowing editing and now allowing editing in
* the tree. * the tree.
*/ */
class TreeEditableChangeListener extends Object implements ChangeListener class TreeEditableChangeListener extends Object implements ChangeListener {
{
public void stateChanged(ChangeEvent e) { public void stateChanged(ChangeEvent e) {
tree.setEditable(((JCheckBox)e.getSource()).isSelected()); tree.setEditable(((JCheckBox) e.getSource()).isSelected());
} }
} // End of class SampleTree.TreeEditableChangeListener } // End of class SampleTree.TreeEditableChangeListener
public static void main(String args[]) {
try {
SwingUtilities.invokeAndWait(new Runnable() {
static public void main(String args[]) { @SuppressWarnings(value = "ResultOfObjectAllocationIgnored")
public void run() {
new SampleTree(); new SampleTree();
} }
});
} catch (InterruptedException ex) {
Logger.getLogger(SampleTree.class.getName()).log(Level.SEVERE, null,
ex);
} catch (InvocationTargetException ex) {
Logger.getLogger(SampleTree.class.getName()).log(Level.SEVERE, null,
ex);
}
}
} }
/* /*
* Copyright (c) 1997, 2005, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
...@@ -29,8 +29,6 @@ ...@@ -29,8 +29,6 @@
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
/*
*/
import javax.swing.Icon; import javax.swing.Icon;
import javax.swing.ImageIcon; import javax.swing.ImageIcon;
...@@ -42,32 +40,41 @@ import java.awt.Component; ...@@ -42,32 +40,41 @@ import java.awt.Component;
import java.awt.Color; import java.awt.Color;
import java.awt.Font; import java.awt.Font;
import java.awt.Graphics; import java.awt.Graphics;
import javax.swing.UIManager;
@SuppressWarnings("serial")
public class SampleTreeCellRenderer extends JLabel implements TreeCellRenderer {
public class SampleTreeCellRenderer extends JLabel implements TreeCellRenderer
{
/** Font used if the string to be displayed isn't a font. */ /** Font used if the string to be displayed isn't a font. */
static protected Font defaultFont; protected static Font defaultFont;
/** Icon to use when the item is collapsed. */ /** Icon to use when the item is collapsed. */
static protected ImageIcon collapsedIcon; protected static ImageIcon collapsedIcon;
/** Icon to use when the item is expanded. */ /** Icon to use when the item is expanded. */
static protected ImageIcon expandedIcon; protected static ImageIcon expandedIcon;
/** Color to use for the background when selected. */ /** Color to use for the background when selected. */
static protected final Color SelectedBackgroundColor = Color.yellow;//new Color(0, 0, 128); protected static final Color SELECTED_BACKGROUND_COLOR;
static static {
{ if ("Nimbus".equals(UIManager.getLookAndFeel().getName())) {
SELECTED_BACKGROUND_COLOR = new Color(0, 0,
0, 0);
} else {
SELECTED_BACKGROUND_COLOR = Color.YELLOW;
}
try { try {
defaultFont = new Font("SansSerif", 0, 12); defaultFont = new Font("SansSerif", 0, 12);
} catch (Exception e) {} } catch (Exception e) {
}
try { try {
collapsedIcon = new ImageIcon(SampleTreeCellRenderer.class.getResource("/resources/images/collapsed.gif")); collapsedIcon = new ImageIcon(SampleTreeCellRenderer.class.
expandedIcon = new ImageIcon(SampleTreeCellRenderer.class.getResource("/resources/images/expanded.gif")); getResource("/resources/images/collapsed.gif"));
expandedIcon = new ImageIcon(SampleTreeCellRenderer.class.
getResource("/resources/images/expanded.gif"));
} catch (Exception e) { } catch (Exception e) {
System.out.println("Couldn't load images: " + e); System.out.println("Couldn't load images: " + e);
} }
} }
/** Whether or not the item that was last configured is selected. */ /** Whether or not the item that was last configured is selected. */
protected boolean selected; protected boolean selected;
...@@ -81,7 +88,6 @@ public class SampleTreeCellRenderer extends JLabel implements TreeCellRenderer ...@@ -81,7 +88,6 @@ public class SampleTreeCellRenderer extends JLabel implements TreeCellRenderer
boolean selected, boolean expanded, boolean selected, boolean expanded,
boolean leaf, int row, boolean leaf, int row,
boolean hasFocus) { boolean hasFocus) {
Font font;
String stringValue = tree.convertValueToText(value, selected, String stringValue = tree.convertValueToText(value, selected,
expanded, leaf, row, hasFocus); expanded, leaf, row, hasFocus);
...@@ -91,24 +97,27 @@ public class SampleTreeCellRenderer extends JLabel implements TreeCellRenderer ...@@ -91,24 +97,27 @@ public class SampleTreeCellRenderer extends JLabel implements TreeCellRenderer
setToolTipText(stringValue); setToolTipText(stringValue);
/* Set the image. */ /* Set the image. */
if(expanded) if (expanded) {
setIcon(expandedIcon); setIcon(expandedIcon);
else if(!leaf) } else if (!leaf) {
setIcon(collapsedIcon); setIcon(collapsedIcon);
else } else {
setIcon(null); setIcon(null);
}
/* Set the color and the font based on the SampleData userObject. */ /* Set the color and the font based on the SampleData userObject. */
SampleData userObject = (SampleData)((DefaultMutableTreeNode)value) SampleData userObject = (SampleData) ((DefaultMutableTreeNode) value).
.getUserObject(); getUserObject();
if(hasFocus) if (hasFocus) {
setForeground(Color.cyan); setForeground(UIManager.getColor("Tree.selectionForeground"));
else } else {
setForeground(userObject.getColor()); setForeground(userObject.getColor());
if(userObject.getFont() == null) }
if (userObject.getFont() == null) {
setFont(defaultFont); setFont(defaultFont);
else } else {
setFont(userObject.getFont()); setFont(userObject.getFont());
}
/* Update the selected flag for the next paint. */ /* Update the selected flag for the next paint. */
this.selected = selected; this.selected = selected;
...@@ -121,32 +130,32 @@ public class SampleTreeCellRenderer extends JLabel implements TreeCellRenderer ...@@ -121,32 +130,32 @@ public class SampleTreeCellRenderer extends JLabel implements TreeCellRenderer
* currently does not allow backgrounds other than white, and it * currently does not allow backgrounds other than white, and it
* will also fill behind the icon. Something that isn't desirable. * will also fill behind the icon. Something that isn't desirable.
*/ */
@Override
public void paint(Graphics g) { public void paint(Graphics g) {
Color bColor; Color bColor;
Icon currentI = getIcon(); Icon currentI = getIcon();
if(selected) if (selected) {
bColor = SelectedBackgroundColor; bColor = SELECTED_BACKGROUND_COLOR;
else if(getParent() != null) } else if (getParent() != null) /* Pick background color up from parent (which will come from
/* Pick background color up from parent (which will come from the JTree we're contained in). */ {
the JTree we're contained in). */
bColor = getParent().getBackground(); bColor = getParent().getBackground();
else } else {
bColor = getBackground(); bColor = getBackground();
}
g.setColor(bColor); g.setColor(bColor);
if(currentI != null && getText() != null) { if (currentI != null && getText() != null) {
int offset = (currentI.getIconWidth() + getIconTextGap()); int offset = (currentI.getIconWidth() + getIconTextGap());
if (getComponentOrientation().isLeftToRight()) { if (getComponentOrientation().isLeftToRight()) {
g.fillRect(offset, 0, getWidth() - 1 - offset, g.fillRect(offset, 0, getWidth() - 1 - offset,
getHeight() - 1); getHeight() - 1);
} } else {
else {
g.fillRect(0, 0, getWidth() - 1 - offset, getHeight() - 1); g.fillRect(0, 0, getWidth() - 1 - offset, getHeight() - 1);
} }
} else {
g.fillRect(0, 0, getWidth() - 1, getHeight() - 1);
} }
else
g.fillRect(0, 0, getWidth()-1, getHeight()-1);
super.paint(g); super.paint(g);
} }
} }
/* /*
* Copyright (c) 1997, 1998, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
...@@ -29,8 +29,6 @@ ...@@ -29,8 +29,6 @@
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
/*
*/
import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeNode; import javax.swing.tree.TreeNode;
...@@ -38,6 +36,7 @@ import javax.swing.tree.TreePath; ...@@ -38,6 +36,7 @@ import javax.swing.tree.TreePath;
import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultMutableTreeNode;
import java.awt.Color; import java.awt.Color;
/** /**
* SampleTreeModel extends JTreeModel to extends valueForPathChanged. * SampleTreeModel extends JTreeModel to extends valueForPathChanged.
* This method is called as a result of the user editing a value in * This method is called as a result of the user editing a value in
...@@ -47,9 +46,9 @@ import java.awt.Color; ...@@ -47,9 +46,9 @@ import java.awt.Color;
* *
* @author Scott Violet * @author Scott Violet
*/ */
@SuppressWarnings("serial")
public class SampleTreeModel extends DefaultTreeModel {
public class SampleTreeModel extends DefaultTreeModel
{
/** /**
* Creates a new instance of SampleTreeModel with newRoot set * Creates a new instance of SampleTreeModel with newRoot set
* to the root of this model. * to the root of this model.
...@@ -61,12 +60,14 @@ public class SampleTreeModel extends DefaultTreeModel ...@@ -61,12 +60,14 @@ public class SampleTreeModel extends DefaultTreeModel
/** /**
* Subclassed to message setString() to the changed path item. * Subclassed to message setString() to the changed path item.
*/ */
@Override
public void valueForPathChanged(TreePath path, Object newValue) { public void valueForPathChanged(TreePath path, Object newValue) {
/* Update the user object. */ /* Update the user object. */
DefaultMutableTreeNode aNode = (DefaultMutableTreeNode)path.getLastPathComponent(); DefaultMutableTreeNode aNode = (DefaultMutableTreeNode) path.
SampleData sampleData = (SampleData)aNode.getUserObject(); getLastPathComponent();
SampleData sampleData = (SampleData) aNode.getUserObject();
sampleData.setString((String)newValue); sampleData.setString((String) newValue);
/* UUUhhhhh, pretty colors. */ /* UUUhhhhh, pretty colors. */
sampleData.setColor(Color.green); sampleData.setColor(Color.green);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册