Java JTree单元格编辑器getCellEditorValue()方法返回错误的对象

Java JTree单元格编辑器getCellEditorValue()方法返回错误的对象,java,swing,jcombobox,jtree,Java,Swing,Jcombobox,Jtree,我试图在JTree中使用渲染器对于我正在开发的Swing应用程序,自定义渲染器仅在树是叶对象且由流布局组成时使用。一个带有图像的空标签,一个JComboBox,最后是一个包含字符串的标签 最初,通过HazardRenderer.java中的getTreeCellrenderComponent()方法将字符串值传递给Renderer。然后使用HazardComboBox中的setText()方法对其进行设置。java编辑器然后获取选定的呈现器实例,并使用相同的setText()设置文本方法 可以找

我试图在
JTree
中使用
渲染器
对于我正在开发的Swing应用程序,自定义渲染器仅在树是叶对象且由流布局组成时使用。一个带有图像的空标签,一个
JComboBox
,最后是一个包含字符串的标签

最初,通过
HazardRenderer.java中的
getTreeCellrenderComponent()
方法将字符串值传递给
Renderer
。然后使用
HazardComboBox中的
setText()
方法对其进行设置。java
编辑器然后获取选定的呈现器实例,并使用相同的
setText()设置文本
方法

可以找到我最初的问题,尽管我对问题的理解有所改变,但是
HazardEditor.java
中的
getCellEditorValue()
似乎正在返回并更改
JLabel
,这不是我的意图,我需要它来更新
JComboBox
,我该怎么做?我将事件直接附加到
JComboBox

comboBox.addItemListener(itemListener);
Main.java

public class Main {
  public JComponent makeUI() {
    JTree tree = new JTree();
    tree.setEditable(true);
    tree.setRootVisible(false);
    tree.setCellRenderer(new HazardRenderer());
    tree.setCellEditor(new HazardEditor());
    //tree.setModel() excluded for brevity
    return new JScrollPane(tree);
  }
  public static void main(String[] args) {
    EventQueue.invokeLater(() -> {
      JFrame f = new JFrame();
      f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
      f.getContentPane().add(new Main().makeUI());
      f.pack();
      f.setLocationRelativeTo(null);
      f.setVisible(true);
    });
  }
}
HazardComboBox.java

public class HazardComboBox extends JPanel {
    private JLabel lblLabel = new JLabel("Placeholder");
    private JComboBox comboBox = new JComboBox(HazardSelection.values());

    public HazardComboBox() {
        setBackground(Color.WHITE);
        setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));

        JLabel label = new JLabel("");
        label.setIcon(new ImageIcon(HazardComboBox.class.getResource("/javax/swing/plaf/metal/icons/ocean/file.gif")));
        add(label);

        comboBox.setBorder(new EmptyBorder(2, 5, 2, 5));
        comboBox.setBackground(Color.WHITE);
        add(comboBox);

        lblLabel.setFont(new Font("Tahoma", Font.PLAIN, 11));
        add(lblLabel);
    }

    public JComboBox getComboBox() {
        return comboBox;
    }

    public JLabel getLabel() {
        return lblLabel;
    }

    public void setText(String name) {
        getLabel().setText(name);
    }

}
HazardRenderer.java

public class HazardRenderer implements TreeCellRenderer {
    private HazardComboBox leafRenderer = new HazardComboBox();
    private DefaultTreeCellRenderer nonLeafRenderer = new DefaultTreeCellRenderer();

    @Override
    public Component getTreeCellRendererComponent(JTree tree, Object hazard, boolean selected, boolean expanded, boolean leaf,
            int row, boolean hasFocus) {
        if (leaf) {
            leafRenderer.setText(hazard.toString());
            return leafRenderer;
        }
        return nonLeafRenderer.getTreeCellRendererComponent(tree, hazard, selected, expanded, leaf, row, hasFocus);
    }

}
HazardEditor.java

    public class HazardEditor extends AbstractCellEditor implements TreeCellEditor {

    private HazardRenderer renderer = new HazardRenderer();
    private HazardComboBox component;
    private DefaultMutableTreeNode treeNode;
    //private ServerInfo info;
    private JComboBox comboBox;
    private String val;

    @Override
    public Component getTreeCellEditorComponent(JTree tree, Object value,
            boolean isSelected, boolean expanded, boolean leaf, int row) {

        val = value.toString();
        component = (HazardComboBox)renderer.getTreeCellRendererComponent(tree, value, isSelected, expanded, leaf, row, true);

        if(leaf) {

            treeNode = (DefaultMutableTreeNode)value;

            //info = (ServerInfo)treeNode.getUserObject();

            comboBox = component.getComboBox();

            ItemListener itemListener = new ItemListener() {
                public void itemStateChanged(ItemEvent arg0) {
                    comboBox.removeItemListener(this);
                    fireEditingStopped();
                }
            };

            comboBox.addItemListener(itemListener);

        }
        return component;
    }

    @Override
    public Object getCellEditorValue() {
        //info.setChecked(comboBox.isSelected());
        //return info;      
        //System.out.println(component.getComboBox().getSelectedIndex());
        return val;
    }

    @Override
    public boolean isCellEditable(EventObject event) {

        if(!(event instanceof MouseEvent)) return false;

        MouseEvent mouseEvent = (MouseEvent)event;
        JTree tree = (JTree)event.getSource();

        TreePath path = tree.getPathForLocation(mouseEvent.getX(), mouseEvent.getY());

        if(path == null) return false;

        Object lastComponent = path.getLastPathComponent();

        if(lastComponent == null) return false;

        DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode)lastComponent;

        return treeNode.isLeaf();
    }

}
HazardSelection.java

public enum HazardSelection {
    NOTCONSIDERED("Not Considered"), NOTAPPLICABLE("Not Applicable"), CONSIDERED("Considered"), HAZARD("Hazard");

    private String name;

    private HazardSelection (String n) {
        name = n;
    }

    @Override
    public String toString() {
        return name;
    }
}

我是miss there stop cell editor,miss there fireXxxUpdated(从未使用AbstractCellEditor for JTree==非常讨厌这个…),AbstractWhater需要覆盖所有事件(将值从编辑器存储到模型,与JTable相同),这些事件在默认情况下以DefaultWhater实现。默认情况下,非常好的问题,结构化,使用SSCCE/MCVE,对我来说,这个问题month@mKorbel谢谢,你能再解释一下这个问题吗?我不理解您的评论。编辑器中的值必须保存到模型中,否则(XxxEditor离开后)值保持不变(XxxRenderer绘制模型中的值)是AbstractCellEditor使用ItemListener实现TreeCellEditor,是。。。differentI'm miss there stop cell editor,missing there fireXxxUpdated(从未使用AbstractCellEditor for JTree==非常讨厌这个…),AbstractWhater需要覆盖所有事件(将值从编辑器存储到模型,与JTable相同),这些事件在默认情况下以默认方式实现,非常好的问题,结构化,带有SSCE/MCVE,对我来说,这个问题month@mKorbel谢谢,你能再解释一下这个问题吗?我不理解您的评论。编辑器中的值必须保存到模型中,否则(XxxEditor离开后)值保持不变(XxxRenderer绘制模型中的值)是AbstractCellEditor使用ItemListener实现TreeCellEditor,是。。。不同的