Ich habe gerade ein Problem mit dem Zelleneditor von JTree. Ich habe zwei verschiedene Objekte in meinem JTree, Benutzer und Bücher.JTree und CellEditor funktionieren nicht richtig, wenn zwei verschiedene Objekte im selben JTree verwendet werden
So ist der Benutzer Bianca und die Bücher sind die Knoten. Die Beschriftungen in diesen Knoten (das Auge, die Farbetikette und der Mülleimer) können ebenfalls angeklickt werden. Wenn ich jedoch meinen Zelleneditor einstelle, bekomme ich eine Null-Ausnahme. Ich denke, weil ich mit zwei verschiedenen Objekten arbeite, kann ich den Zelleneditor nicht richtig einstellen. Dies ist die spezifische Methode, wo ich glaube, ich habe das Problem:
public Component getTreeCellEditorComponent(JTree tree, Object value, boolean isSelected, boolean expanded,
boolean leaf, int row) {
Component returnValue = null;
System.out.println("loo");
if ((value != null) && (value instanceof DefaultMutableTreeNode)) {
Object userObject = ((DefaultMutableTreeNode) value)
.getUserObject();
System.out.println("b");
if(userObject instanceof Book){
Book feature = (Book) userObject;
title.setText(feature.getTitulo());
renderer.setEnabled(tree.isEnabled());
returnValue = renderer;
System.out.println("hi!!");
}
}
if (returnValue == null) {
System.out.println("hi1");
returnValue = defaultEditor.getTreeCellEditorComponent(tree, value, isSelected, expanded, leaf, row);
System.out.println(defaultEditor);
}
return returnValue;
}
Ich weiß nicht, wie der DefaultCellEditor zurückzukehren, wenn die Art des Knotens nicht Buch ist.
Unten ist mein gesamte Code, wenn jemand das Problem replizieren will:
Klasse Buch:
public class Book {
String titulo;
public String getTitulo() {
return titulo;
}
public void setTitulo(String titulo) {
this.titulo = titulo;
}
public Book(String titulo){
this.titulo = titulo;
}
}
Klasse Benutzer
public class User {
String nomeUser;
public String getNomeUser() {
return nomeUser;
}
public void setNomeUser(String nomeUser) {
this.nomeUser = nomeUser;
}
public User(String nome){
this.nomeUser = nome;
}
}
Klasse Render (verwendet, um den Zelleneditor und Zellputz des JTree)
import java.awt.Component;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.IOException;
import java.io.InputStream;
import javax.imageio.ImageIO;
import javax.swing.AbstractCellEditor;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.TreeCellEditor;
import javax.swing.tree.TreeCellRenderer;
public class Render{
public static class NodeCellRenderer implements TreeCellRenderer{
private JLabel nomeRadar;
private JPanel renderer;
private JLabel btnVisible;
private JLabel btnPaint;
private JLabel btnTrash;
DefaultTreeCellRenderer defaultRenderer = new DefaultTreeCellRenderer();
public NodeCellRenderer() throws IOException{
renderer = new JPanel(new FlowLayout(5, 5,5));
nomeRadar = new JLabel();
renderer.add(nomeRadar);
btnVisible = new JLabel();
btnPaint = new JLabel();
btnTrash = new JLabel();
InputStream visible = getClass().getResourceAsStream("/eye_visible-16.png");
InputStream invisible = getClass().getResourceAsStream("/eye_invisible-16.png");
InputStream paint = getClass().getResourceAsStream("/paint-16.png");
InputStream trash = getClass().getResourceAsStream("/trash-16.png");
btnVisible.setIcon(new ImageIcon(ImageIO.read(visible)));
btnPaint.setIcon(new ImageIcon(ImageIO.read(paint)));
btnTrash.setIcon(new ImageIcon(ImageIO.read(trash)));
nomeRadar.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e){
System.out.println("clicou no nome");
}
});
btnVisible.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e){
System.out.println("clicou no olho");
}
});
btnPaint.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e){
System.out.println("clicou no paint");
}
});
btnTrash.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e){
System.out.println("clicou no trash");
}
});
renderer.add(nomeRadar);
renderer.add(btnVisible);
renderer.add(btnPaint);
renderer.add(btnTrash);
}
@Override
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf,
int row, boolean hasFocus) {
Component returnValue = null;
// TODO Auto-generated method stub
if ((value != null) && (value instanceof DefaultMutableTreeNode)) {
Object userObject = ((DefaultMutableTreeNode) value)
.getUserObject();
if(userObject instanceof Book){
Book feature = (Book) userObject;
nomeRadar.setText(feature.getTitulo());
renderer.setEnabled(tree.isEnabled());
returnValue = renderer;
}
}
if (returnValue == null) {
returnValue = defaultRenderer.getTreeCellRendererComponent(tree,
value, selected, expanded, leaf, row, hasFocus);
}
return returnValue;
}
}
public static class ButtonCellEditor extends AbstractCellEditor implements TreeCellEditor, ActionListener, MouseListener
{
/**
*
*/
private static final long serialVersionUID = 1L;
TreeCellEditor defaultEditor = JTreeOfObjects.currentStyle;
JLabel title;
JPanel renderer;
JLabel btnVisible;
JLabel btnPaint;
JLabel btnTrash;
private Object value;
public ButtonCellEditor() throws IOException{
renderer = new JPanel(new FlowLayout(5, 5,5));
System.out.println("ulo");
title = new JLabel();
renderer.add(title);
btnVisible = new JLabel();
btnPaint = new JLabel();
btnTrash = new JLabel();
InputStream visible = getClass().getResourceAsStream("/eye_visible-16.png");
InputStream invisible = getClass().getResourceAsStream("/eye_invisible-16.png");
InputStream paint = getClass().getResourceAsStream("/paint-16.png");
InputStream trash = getClass().getResourceAsStream("/trash-16.png");
btnVisible.setIcon(new ImageIcon(ImageIO.read(visible)));
btnPaint.setIcon(new ImageIcon(ImageIO.read(paint)));
btnTrash.setIcon(new ImageIcon(ImageIO.read(trash)));
System.out.println("nossa 1");
title.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e){
System.out.println("clicou no nome");
stopCellEditing();
}
});
btnVisible.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e){
System.out.println("clicou no olho");
stopCellEditing();
}
});
btnPaint.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e){
System.out.println("clicou no paint");
stopCellEditing();
}
});
btnTrash.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e){
System.out.println("clicou no trash");
stopCellEditing();
}
});
renderer.add(title);
renderer.add(btnVisible);
renderer.add(btnPaint);
renderer.add(btnTrash);
}
@Override
public Object getCellEditorValue() {
// TODO Auto-generated method stub
//return value.toString();
return null;
}
@Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
System.out.println("clicou no b");
stopCellEditing();
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
System.out.println("clicou no d");
stopCellEditing();
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.out.println("clicou no a");
stopCellEditing();
}
@Override
public Component getTreeCellEditorComponent(JTree tree, Object value, boolean isSelected, boolean expanded,
boolean leaf, int row) {
Component returnValue = null;
System.out.println("loo");
if ((value != null) && (value instanceof DefaultMutableTreeNode)) {
Object userObject = ((DefaultMutableTreeNode) value)
.getUserObject();
System.out.println("b");
if(userObject instanceof Book){
Book feature = (Book) userObject;
title.setText(feature.getTitulo());
renderer.setEnabled(tree.isEnabled());
returnValue = renderer;
System.out.println("hi!!");
}
}
if (returnValue == null) {
System.out.println("hi1");
returnValue = defaultEditor.getTreeCellEditorComponent(tree, value, isSelected, expanded, leaf, row);
System.out.println(defaultEditor);
}
return returnValue;
}
}
}
Klasse JTreeOfObjects
public class JTreeOfObjects {
public static TreeCellRenderer renderer;
private JFrame frame;
public static JTree tree;
private DefaultTreeModel model;
private DefaultMutableTreeNode parent;
JLabel nomeRadar;
JLabel btnVisible;
JLabel btnPaint;
JLabel btnTrash;
public static TreeCellEditor currentStyle;
public void initialize() throws IOException{
frame = new JFrame("Árvore de Navegação");
parent = new DefaultMutableTreeNode("Library",true);
//DefaultMutableTreeNode undefined = new DefaultMutableTreeNode("Indefinida");
//undefined.add(new DefaultMutableTreeNode("!"));
System.out.println(parent.getUserObject());
//parent.add(undefined);
tree = new JTree(parent);
System.out.println("Current"+tree.getCellEditor());
//currentStyle = tree.getCellEditor();
renderer = new Render.NodeCellRenderer();
model = (DefaultTreeModel) tree.getModel();
tree.setEditable(true);
tree.setCellRenderer(renderer);
tree.setCellEditor(new Render.ButtonCellEditor());
//frame.getContentPane().add(tree);
nomeRadar = new JLabel();
btnVisible = new JLabel();
btnPaint = new JLabel();
btnTrash = new JLabel();
InputStream visible = getClass().getResourceAsStream("/eye_visible-16.png");
InputStream invisible = getClass().getResourceAsStream("/eye_invisible-16.png");
InputStream paint = getClass().getResourceAsStream("/paint-16.png");
InputStream trash = getClass().getResourceAsStream("/trash-16.png");
btnVisible.setIcon(new ImageIcon(ImageIO.read(visible)));
btnPaint.setIcon(new ImageIcon(ImageIO.read(paint)));
btnTrash.setIcon(new ImageIcon(ImageIO.read(trash)));
frame.getContentPane().add(btnPaint);
frame.getContentPane().add(btnVisible);
frame.getContentPane().add(btnTrash);
frame.getContentPane().add(tree);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setUndecorated(true);
frame.getRootPane().setWindowDecorationStyle(JRootPane.PLAIN_DIALOG);
frame.setSize(200, 200);
frame.setVisible(true);
}
public void adicionarNoCamada(String nomePessoa){
//DefaultTreeModel model = (DefaultTreeModel)tree.getModel();
DefaultMutableTreeNode noCamada = new DefaultMutableTreeNode(nomePessoa);
parent.add(noCamada);
}
public void adicionarLivro(String nomeCamada,Book feature) throws IOException{
//tree.get
DefaultMutableTreeNode node = null;
Enumeration e = parent.breadthFirstEnumeration();
while(e.hasMoreElements()){
node = (DefaultMutableTreeNode) e.nextElement();
if(nomeCamada.equals(node.getUserObject().toString())){
node.add(new DefaultMutableTreeNode(feature));
break;
}
else{
}
}
tree.setCellEditor(new Render.ButtonCellEditor());
}
}
Klasse Haupt App
public class MainApp {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
Book b1 = new Book("The Book of Life");
Book b2 = new Book ("The Book of Death");
User u1 = new User("Bianca");
JTreeOfObjects object = new JTreeOfObjects();
object.initialize();
object.adicionarNoCamada(u1.getNomeUser());
object.adicionarLivro(u1.getNomeUser(), b1);
object.adicionarLivro(u1.getNomeUser(), b2);
}
}
Jede Hilfe geschätzt sehr würde. Es ist kein Duplikat, da ich weiß wie man eine NullPointer Exception repariert (muss das Objekt instatieren). Ich weiß einfach nicht, was ich im Falle eines TreeCellEditors zurückgeben soll, wie ich den Standard wiederherstellen kann.
Das viel Licht werfen das Problem zu lösen. Ich werde weitere Tests machen und die Antwort aktualisieren. Danke vielmals!! –