【问题标题】:Insert child into JTree TreeNode and update the view将子节点插入 JTree TreeNode 并更新视图
【发布时间】:2016-09-29 11:03:34
【问题描述】:

我得到以下代码 [减少到最低限度]:

public class MainWindow extends JFrame {

    private static String StrBenutzer;
    private JPanel contentPane;

    TreeNode TreeNodeRoot = createInitTree();
    JTree tree = new JTree(TreeNodeRoot);


    static DefaultMutableTreeNode NodeRoot;
    static DefaultMutableTreeNode NodeProjekte;
    static DefaultMutableTreeNode NodeAllgemein;



    /**
     * Launch the application.
     */
    public static void initWindow() {



        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    MainWindow frame = new MainWindow();
                    frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 
                    frame.setUndecorated(false);
                    frame.setVisible(true);
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public MainWindow() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 1160, 679);


        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        SpringLayout sl_contentPane = new SpringLayout();
        contentPane.setLayout(sl_contentPane);



        sl_contentPane.putConstraint(SpringLayout.NORTH, tree, 0, SpringLayout.NORTH, contentPane);
        tree.setEditable(true);
        contentPane.add(tree);

        JButton btnAdd = new JButton("Add");
        sl_contentPane.putConstraint(SpringLayout.WEST, tree, 0, SpringLayout.WEST, btnAdd);
        sl_contentPane.putConstraint(SpringLayout.SOUTH, tree, -11, SpringLayout.NORTH, btnAdd);
        sl_contentPane.putConstraint(SpringLayout.WEST, btnAdd, 0, SpringLayout.WEST, contentPane);
        sl_contentPane.putConstraint(SpringLayout.SOUTH, btnAdd, -10, SpringLayout.SOUTH, contentPane);
        contentPane.add(btnAdd);

        JButton btnDelete = new JButton("Delete");
        sl_contentPane.putConstraint(SpringLayout.NORTH, btnDelete, 0, SpringLayout.NORTH, btnAdd);
        sl_contentPane.putConstraint(SpringLayout.WEST, btnDelete, 6, SpringLayout.EAST, btnAdd);
        contentPane.add(btnDelete);

        JButton btnInfo = new JButton("Info");
        sl_contentPane.putConstraint(SpringLayout.EAST, tree, 1, SpringLayout.EAST, btnInfo);
        sl_contentPane.putConstraint(SpringLayout.NORTH, btnInfo, 0, SpringLayout.NORTH, btnAdd);
        sl_contentPane.putConstraint(SpringLayout.WEST, btnInfo, 6, SpringLayout.EAST, btnDelete);
        sl_contentPane.putConstraint(SpringLayout.EAST, btnInfo, 59, SpringLayout.EAST, btnDelete);
        contentPane.add(btnInfo);

        JPanel panel = new JPanel();
        sl_contentPane.putConstraint(SpringLayout.NORTH, panel, 0, SpringLayout.NORTH, tree);
        sl_contentPane.putConstraint(SpringLayout.WEST, panel, 16, SpringLayout.EAST, tree);
        sl_contentPane.putConstraint(SpringLayout.SOUTH, panel, 565, SpringLayout.NORTH, contentPane);
        sl_contentPane.putConstraint(SpringLayout.EAST, panel, 39, SpringLayout.EAST, contentPane);
        contentPane.add(panel);
    }




    private static TreeNode createInitTree(){


        NodeRoot = new DefaultMutableTreeNode("User");
        NodeProjekte = new DefaultMutableTreeNode( "Projekte");
        NodeAllgemein = new DefaultMutableTreeNode( "Allgemein" );

        DefaultMutableTreeNode projectA = new DefaultMutableTreeNode("Projekt A");
        DefaultMutableTreeNode projectB = new DefaultMutableTreeNode("Projekt B");

        DefaultMutableTreeNode LinkProjectA = new DefaultMutableTreeNode("Öffnen");
        DefaultMutableTreeNode LinkProjektB = new DefaultMutableTreeNode("Öffnen");

        DefaultMutableTreeNode NotizProjektA = new DefaultMutableTreeNode("Notiz");
        DefaultMutableTreeNode NoitzProjektB = new DefaultMutableTreeNode("Notiz");

        DefaultMutableTreeNode Zeitstrahl = new DefaultMutableTreeNode("Zeitplan");
        DefaultMutableTreeNode ToDo = new DefaultMutableTreeNode("ToDo");

        NodeProjekte.add( projectA );
        NodeProjekte.add( projectB );

        projectA.add(LinkProjectA);
        projectA.add(NotizProjektA);

        projectB.add(LinkProjektB);
        projectB.add(NoitzProjektB);

        NodeAllgemein.add(Zeitstrahl);
        NodeAllgemein.add(ToDo);

        NodeRoot.add( NodeProjekte );
        NodeRoot.add( NodeAllgemein );

        return NodeRoot;
    }




    private static void addItem(String StrProjektLink, String StrProjektName){

        DefaultMutableTreeNode NodeNewProject = new DefaultMutableTreeNode(StrProjektName);
        DefaultMutableTreeNode NodeNewProjectLink = new DefaultMutableTreeNode("Link");
        DefaultMutableTreeNode NodeNewProjectNotiz = new DefaultMutableTreeNode("Notiz");

        NodeProjekte.add(NodeNewProject);
        NodeNewProject.add(NodeNewProjectLink);
        NodeNewProject.add(NodeNewProjectNotiz);






    }


    private static void deleteItem(){

    }

    private static void updateTree(){


    }




    private void addProjectFolder()
    {

    addItem("C:/Users/", "User-Directory"a);

    }




}

现在我想在从树中添加或删除一个孩子之后更新 JTree 模型。但是 Eclipse 说,我所有的变量和函数都必须是静态的,所以我不能更新元素。更新 JTree 最简单的方法是什么?

【问题讨论】:

  • "Eclipse said, that all my variables and functions have to be static" -- 不,Java(不是 Eclipse -- Java)并不是这么说的。重新阅读错误消息,然后尝试以其他方式修复它。与其将大多数字段和方法设为静态,不如将它们设为实例(当然主要方法除外),并且仅尝试以非静态方式访问它们。您遇到此问题表明您在 Java 基础知识方面存在差距,需要在尝试继续进行 GUI 编程之前填补这一空白。
  • 阅读 How to Use Trees 上的 Swing 教程中的部分以获取工作示例。 TreeDemo 示例将向您展示如何构建代码,这样您就不需要静态变量或方法。保留所有 Swing 基础知识的教程链接。

标签: java swing jtree


【解决方案1】:

您的问题看起来与 Swing 或 JTree 无关,而与静态与实例字段和方法的使用和滥用有关。在我看来,最好的解决方案是将所有字段设为私有实例字段,并将所有方法设为实例方法之上,除了 initWindow() 方法。那么解决方案就会失效。

// !! make everything private and nothing static
// also follow Java naming conventions
private TreeNode treeNodeRoot = createInitTree();
private JTree tree = new JTree(treeNodeRoot);
private DefaultMutableTreeNode nodeRoot;
private DefaultMutableTreeNode nodeProjekte;
private DefaultMutableTreeNode nodeAllgemein;


private class AddAction implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent e) {
        String message = "Enter node name:";
        String nodeName = JOptionPane.showInputDialog(MainWindow.this, message);

        // ...

        DefaultMutableTreeNode parentNode = null;
        TreePath parentPath = tree.getSelectionPath();

        // ....

        DefaultMutableTreeNode childNode = new DefaultMutableTreeNode(nodeName);
        int index = parentNode.getChildCount();
        DefaultTreeModel treeModel = (DefaultTreeModel) tree.getModel();
        treeModel.insertNodeInto(childNode, parentNode, index);
    }
}

【讨论】:

    猜你喜欢
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多