Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JTree中自定义节点上的鼠标操作:jre6和jre7之间的差异_Java_Swing_Jbutton_Jtree_Treecellrenderer - Fatal编程技术网

Java JTree中自定义节点上的鼠标操作:jre6和jre7之间的差异

Java JTree中自定义节点上的鼠标操作:jre6和jre7之间的差异,java,swing,jbutton,jtree,treecellrenderer,Java,Swing,Jbutton,Jtree,Treecellrenderer,JTree使用TreeCellRenderer和TreeCellEditor显示三个自定义节点: 一个JCheckBox 单钮扣 由任何动作组件组成的JPanel(这里北面是一个JCheckBox,南面是一个JButton) 截图: 如果您使用Java Runtime Environment 6,那么这样的树就没有问题 除了使用Java Runtime Environment 7之外,当我单击JPanel节点内的JButton时,我的问题也会出现。第一次在JPanel中单击时(以及每次停止编

JTree使用TreeCellRenderer和TreeCellEditor显示三个自定义节点:

  • 一个JCheckBox
  • 单钮扣
  • 由任何动作组件组成的JPanel(这里北面是一个JCheckBox,南面是一个JButton)
截图:

如果您使用Java Runtime Environment 6,那么这样的树就没有问题

除了使用Java Runtime Environment 7之外,当我单击JPanel节点内的JButton时,我的问题也会出现。第一次在JPanel中单击时(以及每次停止编辑带有JPanel的节点后),JButton的“单击”动画不会渲染。第一个节点JCheckBox和第二个节点JButton也与jre6和jre7完美配合

我想让它完全像以前在jre6中一样工作,有解决方法吗

注意:让按钮执行代码不是问题


也要考虑<代码>大纲>代码>,我不知道NETBESE的大纲,它是一个很好的自定义组件。这似乎证实了一个只有一个组件的单元可以完美地与jre6和jre7一起工作(注意:只有JButton的JTree或JTable可以与jre7一起工作)。但自从jre7以来,JPanel中带有JButton的单元格似乎已经损坏。
import java.awt.BorderLayout;
import java.awt.Component;
import javax.swing.AbstractCellEditor;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeCellEditor;
import javax.swing.tree.TreeCellRenderer;

class TreeNodeModel{
    public boolean isJCheckBox = false;
    public boolean isJButton = false;
    public boolean isJPanel = false;
    public Component userObject = null;
    public TreeNodeModel(String name){
        if( name.equals("JCheckBox") ){
            isJCheckBox = true;
        }else if( name.equals("JButton") ){
            isJButton = true;
        }else if( name.equals("JPanel") ){
            isJPanel = true;
        }
    }
}

class CustomTreeCellRenderer implements TreeCellRenderer{
    @Override
    public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
        Component returnValue = null;
        if ((value != null) && (value instanceof DefaultMutableTreeNode)) {
            Object userObject = ((DefaultMutableTreeNode) value).getUserObject();
            if (userObject instanceof TreeNodeModel) {
                TreeNodeModel node = (TreeNodeModel) userObject;
                if(node.isJButton){
                    returnValue = new JButton("Ok");
                }else if(node.isJCheckBox){
                    returnValue = new JCheckBox("Ok");
                }else{
                    JPanel panel = new JPanel(new BorderLayout());
                    panel.add(new JButton("Problem"), BorderLayout.SOUTH);
                    panel.add(new JCheckBox("Problem"), BorderLayout.NORTH);
                    returnValue = panel;
                }
            }
        }
        if(returnValue == null)
            returnValue = new DefaultTreeCellRenderer().getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
        return returnValue;
    }
}

class CustomTreeCellEditor extends AbstractCellEditor implements TreeCellEditor {
    public Component getTreeCellEditorComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row) {
        Component returnValue = null;
        if ((value != null) && (value instanceof DefaultMutableTreeNode)) {
            Object userObject = ((DefaultMutableTreeNode) value).getUserObject();
            if (userObject instanceof TreeNodeModel) {
                TreeNodeModel node = (TreeNodeModel) userObject;
                if(node.isJButton){
                    returnValue = new JButton("Ok");
                }else if(node.isJCheckBox){
                    returnValue = new JCheckBox("Ok");
                }else{
                    JPanel panel = new JPanel(new BorderLayout());
                    panel.add(new JButton("Problem"), BorderLayout.SOUTH);
                    panel.add(new JCheckBox("Problem"), BorderLayout.NORTH);
                    returnValue = panel;
                }
            }
        }
        return returnValue;
    }
    @Override
    public Object getCellEditorValue() { return null; }
}

public class MyTestRendererEditor extends JFrame {
    public MyTestRendererEditor() { 
        DefaultMutableTreeNode node = new DefaultMutableTreeNode("root");
        node.add(new DefaultMutableTreeNode(new TreeNodeModel("JCheckBox")));
        node.add(new DefaultMutableTreeNode(new TreeNodeModel("JButton")));
        node.add(new DefaultMutableTreeNode(new TreeNodeModel("JPanel")));

        final JTree tree = new JTree(new DefaultTreeModel(node));
        tree.setCellRenderer(new CustomTreeCellRenderer());
        tree.setCellEditor(new CustomTreeCellEditor());
        tree.setEditable(true);

        getContentPane().add(new JScrollPane(tree));
        pack();
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    public static void main(String[] args) { 
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new MyTestRendererEditor();
            }
        });     
    }
}