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,是。。。不同的