Como você torna os componentes do JPanel como um nó no JTree utilizáveis?
Quando clico no JButton, nada acontece. Isso se aplica mesmo a um JScrollPane que eu coloquei (mostra, mas não rola). Por que o JPanel não está na frente? Tenho a sensação de que algo precisa ser substituído. Deveria ser a expansão da peça que não é a flecha? Se sim, como isso é feito?
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import javax.swing.tree.*;
public class test {
public test() {
JTree tree = createTree();
tree.setToggleClickCount(0);
tree.setRowHeight(50);
tree.setCellRenderer(new PanelRenderer());
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new JScrollPane(tree));
f.setSize(400, 400);
f.setLocation(200, 200);
f.setVisible(true);
}
private JTree createTree() {
int children = 4;
int grandChildren = 3;
DefaultMutableTreeNode root = new DefaultMutableTreeNode();
DefaultMutableTreeNode node;
for (int j = 0; j < children; j++) {
node = new DefaultMutableTreeNode();
root.add(node);
for (int k = 0; k < grandChildren; k++)
node.add(new DefaultMutableTreeNode());
}
DefaultTreeModel model = new DefaultTreeModel(root);
return new JTree(model);
}
public static void main(String[] args) {
new test();
}
}
class PanelRenderer implements TreeCellRenderer {
JPanel panel;
public PanelRenderer() {
panel = new JPanel(new BorderLayout());
}
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded,
boolean leaf, int row, boolean hasFocus) {
panel.add(new JLabel("aloha"), BorderLayout.WEST);
JButton fg = new JButton("fg");
panel.add(fg, BorderLayout.EAST);
fg.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent d) {
System.out.println("hello");
}
});
panel.setPreferredSize(new Dimension(200, 500));
return panel;
}
}
Isto é para MadProgrammer, que diz que Renderers e Editores fazem uma imagem do que você coloca. Neste exemplo, os JButtons são clicáveis.
import javax.swing.*;
import javax.swing.tree.*;
import java.awt.event.*;
import java.awt.*;
import javax.swing.event.*;
import java.util.*;
public class test extends JFrame {
public test() {
super("TreeDemo");
setSize(500, 500);
JPanel p = new JPanel();
p.setLayout(new BorderLayout());
JButton theParent = new JButton("Feature Set #1");
JButton thefeature = new JButton("sdfdsfds");
JButton feature2 = new JButton("Second Feature");
JButton feature3 = new JButton("Third Feature");
DefaultMutableTreeNode top = new DefaultMutableTreeNode(theParent, true);
DefaultMutableTreeNode n1 = new DefaultMutableTreeNode(thefeature, true);
DefaultMutableTreeNode n2 = new DefaultMutableTreeNode(feature2, true);
DefaultMutableTreeNode n3 = new DefaultMutableTreeNode(feature3, false);
n1.add(n3);
top.add(n1);
top.add(n2);
JTree tree = new JTree(top);
p.add(tree, BorderLayout.NORTH);
getContentPane().add(p);
TestRenderer tr = new TestRenderer();
TestEditor1 te = new TestEditor1();
tree.setEditable(true);
tree.setCellRenderer(tr);
tree.setCellEditor(te);
}
public class TestEditor1 implements TreeCellEditor {
public TestEditor1() {
}
public void addCellEditorListener(CellEditorListener l) {
}
public void cancelCellEditing() {
}
public Object getCellEditorValue() {
return this;
}
public boolean isCellEditable(EventObject evt) {
if (evt instanceof MouseEvent) {
MouseEve,nt mevt = (MouseEvent) evt;
if (mevt.getClickCount() == 1) {
return true;
}
}
return false;
}
public void removeCellEditorListener(CellEditorListener l) {
}
public boolean shouldSelectCell(EventObject anEvent) {
return true;
}
public boolean stopCellEditing() {
return false;
}
public Component getTreeCellEditorComponent(JTree tree, Object value, boolean isSelected, boolean expanded,
boolean leaf, int row) {
DefaultMutableTreeNode temp = (DefaultMutableTreeNode) value;
JComponent temp2 = (JComponent) temp.getUserObject();
return temp2;
}
}
public class TestRenderer implements TreeCellRenderer {
transient protected Icon closedIcon;
transient protected Icon openIcon;
public TestRenderer() {
}
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded,
boolean leaf, int row, boolean hasFocus) {
DefaultMutableTreeNode temp = (DefaultMutableTreeNode) value;
JComponent temp2 = (JComponent) temp.getUserObject();
temp2.setBackground(UIManager.getColor("Tree.textBackground"));
return temp2;
}
public void setClosedIcon(Icon newIcon) {
closedIcon = newIcon;
}
public void setOpenIcon(Icon newIcon) {
openIcon = newIcon;
}
}
public static void main(String args[]){
JFrame frame = new test();
frame.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
frame.pack();
frame.setVisible(true);
}