// Example from http://www.crionics.com/products/opensource/faq/swing_ex/SwingExamples.html
/*
*
* This example works only each Icon has same width.
*
* editing JTextField has minimum 100. (swing1.1beta3) swing#1007
*
*/
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.UIManager;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellEditor;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.TreeCellEditor;
import javax.swing.tree.TreePath;
//
/**
* @version 1.0 11/09/98
*/
public class WideEditorTreeExample extends JFrame {
public WideEditorTreeExample() {
super("Wide Editor JTree Example");
String[] strs = { "swing", // 0
"plaf", // 1
"basic", // 2
"metal", // 3
"JTree" }; // 4
DefaultMutableTreeNode[] nodes = new DefaultMutableTreeNode[strs.length];
for (int i = 0; i < strs.length; i++)
nodes[i] = new DefaultMutableTreeNode(strs[i]);
nodes[0].add(nodes[1]);
nodes[1].add(nodes[2]);
nodes[1].add(nodes[3]);
nodes[0].add(nodes[4]);
JTree tree = new JTree(nodes[0]);
tree.setEditable(true);
/*
* swing1.0.3 tree.setCellEditor(new BasicTreeCellEditor(
* (BasicTreeCellRenderer)tree.getCellRenderer()) { public void
* doLayout() { if (editor != null) { Dimension cSize = getSize();
* Dimension eSize = editor.getPreferredSize(); int n =
* lastPath.getPathCount(); Rectangle r = new Rectangle(); r =
* changeTree.getBounds(r); eSize.width = r.width -(editingOffset *n);
* editor.setSize(eSize); editor.setLocation(editingOffset, 0);
* editor.setBounds(editingOffset, 0, eSize.width, cSize.height);
* setSize(new Dimension(eSize.width + editingOffset, cSize.height)); } } } );
*/
// swing1.1beta3
tree.setCellEditor(new WideCellEditor(tree,
(DefaultTreeCellRenderer) tree.getCellRenderer()));
//
JScrollPane sp = new JScrollPane(tree);
getContentPane().add(sp, BorderLayout.CENTER);
}
public static void main(String args[]) {
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
} catch (Exception evt) {}
WideEditorTreeExample frame = new WideEditorTreeExample();
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
frame.setSize(300, 150);
frame.setVisible(true);
}
}
class WideCellEditor extends DefaultTreeCellEditor {
public WideCellEditor(JTree tree, DefaultTreeCellRenderer renderer) {
this(tree, renderer, null);
}
public WideCellEditor(final JTree tree,
final DefaultTreeCellRenderer renderer, TreeCellEditor editor) {
super(tree, renderer, editor);
editingContainer = new WideEditorContainer();
}
public Component getTreeCellEditorComponent(JTree tree, Object value,
boolean isSelected, boolean expanded, boolean leaf, int row) {
Component c = super.getTreeCellEditorComponent(tree, value, isSelected,
expanded, leaf, row);
((WideEditorContainer) editingContainer).setLocalCopy(tree, lastPath,
offset, editingComponent);
return c;
}
class WideEditorContainer extends DefaultTreeCellEditor.EditorContainer {
JTree tree;
TreePath lastPath;
int offset;
Component editingComponent;
public void doLayout() {
if (editingComponent != null) {
Dimension cSize = getSize();
Dimension eSize = editingComponent.getPreferredSize();
int n = lastPath.getPathCount();
Rectangle r = new Rectangle();
r = tree.getBounds(r);
eSize.width = r.width - (offset * n);
editingComponent.setSize(eSize);
editingComponent.setLocation(offset, 0);
editingComponent
.setBounds(offset, 0, eSize.width, cSize.height);
setSize(new Dimension(eSize.width + offset, cSize.height));
}
}
void setLocalCopy(JTree tree, TreePath lastPath, int offset,
Component editingComponent) {
this.tree = tree;
this.lastPath = lastPath;
this.offset = offset;
this.editingComponent = editingComponent;
}
}
}