1

問題のSSCCEは次のとおりです。動的にデータを入力していますJTreeが、何も起きていません。

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;

public class DynamicTreeDemo extends JFrame
                        implements ActionListener {
private int newNodeSuffix = 1;
private static String ADD_COMMAND = "add";
private static String REMOVE_COMMAND = "remove";
private static String CLEAR_COMMAND = "clear";

private JTree jtrMainMenu;
DefaultMutableTreeNode   rootNode = null;
DefaultTreeModel treeModel;
public DynamicTreeDemo() {
    super(new BorderLayout());

    //Create the components.
    jtrMainMenu = new JTree();
    populateTree();

    JButton addButton = new JButton("Add");
    addButton.setActionCommand(ADD_COMMAND);
    addButton.addActionListener(this);

    JButton removeButton = new JButton("Remove");
    removeButton.setActionCommand(REMOVE_COMMAND);
    removeButton.addActionListener(this);

    JButton clearButton = new JButton("Clear");
    clearButton.setActionCommand(CLEAR_COMMAND);
    clearButton.addActionListener(this);

    //Lay everything out.
    jtrMainMenu.setPreferredSize(new Dimension(300, 150));
    add(jtrMainMenu, BorderLayout.CENTER);

    JPanel panel = new JPanel(new GridLayout(0,3));
    panel.add(addButton);
    panel.add(removeButton); 
    panel.add(clearButton);
add(panel, BorderLayout.SOUTH);
}


    public void populateTree() {
  Vector<Vector<String>> data =GetDataFromDB();           
 java.util.List<String> list =GetListFromDB();
        int i=0;;
 int size=list.size();
 treeModel=(DefaultTreeModel)jtrMainMenu.getModel();  

 ((DefaultMutableTreeNode)  (treeModel.getRoot())).removeAllChildren();
 treeModel.reload();
 rootNode = new DefaultMutableTreeNode("JewelleryERPApplication");
 treeModel=new DefaultTreeModel(rootNode);


 DefaultMutableTreeNode p1=null, p2=null,p3=null,p4=null,p5=null;


     while(i<size){

        if(list.get(i).length()==2){
          p1 = addObject(null, data.get(i).elementAt(1),true);  

        }else 
        if(list.get(i).length()==4){
           p2 = addObject(p1, data.get(i).elementAt(1),true);   

     }else if
       (list.get(i).length()==6){
             p3 = addObject(p2, data.get(i).elementAt(1),true);   

     }
     else if
       (list.get(i).length()==8){
             p4 = addObject(p3, data.get(i).elementAt(1),true);    

     }  
     else if
       (list.get(i).length()==10){
             p5 = addObject(p4, data.get(i).elementAt(1),true);    

     }      
         i++;
     }

    jtrMainMenu.setModel(treeModel);
   ((DefaultMutableTreeNode)  (treeModel.getRoot())).getChildCount();
    jtrMainMenu.revalidate();
    jtrMainMenu.repaint();
}


public DefaultMutableTreeNode addObject(DefaultMutableTreeNode parent,
                                        Object child, 
                                        boolean shouldBeVisible) {


          DefaultMutableTreeNode childNode = 
            new DefaultMutableTreeNode(child);



    if (parent == null) {
        parent = rootNode;
    }

//It is key to invoke this on the TreeModel, and NOT DefaultMutableTreeNode
    treeModel.insertNodeInto(childNode, parent, 
                             parent.getChildCount());

     jtrMainMenu.setModel(treeModel);

    //Make sure the user can see the lovely new node.
    if (shouldBeVisible) {
        jtrMainMenu.scrollPathToVisible(new TreePath(childNode.getPath()));
    }

    return childNode;
} 

/**
 * Create the GUI and show it.  For thread safety,
 * this method should be invoked from the
 * event-dispatching thread.
 */
private static void createAndShowGUI() {
    //Create and set up the window.
    JFrame frame = new JFrame("DynamicTreeDemo");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    //Create and set up the content pane.
    DynamicTreeDemo newContentPane = new DynamicTreeDemo();
    newContentPane.setOpaque(true); //content panes must be opaque
    frame.setContentPane(newContentPane);

    //Display the window.
    frame.pack();
    frame.setVisible(true);
}

public static void main(String[] args) {
    //Schedule a job for the event-dispatching thread:
    //creating and showing this application's GUI.
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            createAndShowGUI();
        }
    });
}
}
4

1 に答える 1

4

コードには多くの問題がありますが...主な問題 (私が思うに) は、モデルをリロードするとルート ノードがデフォルトで折りたたまれているという事実です。

ルート ノードが非表示になっている場合、および/またはそのハンドルが非表示になっている場合、何もロードされていないように見えます。

テストのためにこれらの要素を再表示します。

モデルがリロードされたら、ルート ノードを展開することもできます...

ここに画像の説明を入力

!! 警告 !!これをルートディレクトリで実行しないでください!! すべての子ディレクトリをスキャンしますが、実際に待つよりも時間がかかる可能性があります:P

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;

public class FileTree {

    public static void main(String[] args) {
        new FileTree();
    }

    public FileTree() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private DefaultTreeModel model;
        private JTree tree;

        public TestPane() {
            setLayout(new BorderLayout());

            tree = new JTree();
            File rootFile = new File(".");
            DefaultMutableTreeNode root = new DefaultMutableTreeNode(rootFile);
            model = new DefaultTreeModel(root);

            tree.setModel(model);
            tree.setRootVisible(true);
            tree.setShowsRootHandles(true);

            add(new JScrollPane(tree));

            JButton load = new JButton("Load");
            add(load, BorderLayout.SOUTH);

            load.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {

                    DefaultMutableTreeNode root = (DefaultMutableTreeNode) model.getRoot();
                    root.removeAllChildren();
                    model.reload();
                    File rootFile = (File) root.getUserObject();

                    addFiles(rootFile, model, root);

                    tree.expandPath(new TreePath(root));

                }
            });

        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

        protected void addFiles(File rootFile, DefaultTreeModel model, DefaultMutableTreeNode root) {

            for (File file : rootFile.listFiles()) {
                DefaultMutableTreeNode child = new DefaultMutableTreeNode(file);
                model.insertNodeInto(child, root, root.getChildCount());
                if (file.isDirectory()) {
                    addFiles(file, model, child);
                }
            }

        }
    }
}

コードレビュー

から直接拡張することは避けてくださいJFrame。あなたの例の外見から、あなたはそうではありませんでしたが、ハッキングしましたが、とにかくお勧めできません...

これ...

jtrMainMenu.setPreferredSize(new Dimension(300, 150));
add(jtrMainMenu, BorderLayout.CENTER);

これはお勧めできません。 JTreeに追加する必要がありますJScrollPane

これ...

private static void createAndShowGUI() {
    //Create and set up the window.
    JFrame frame = new JFrame("DynamicTreeDemo");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    //Create and set up the content pane.
    BadTree newContentPane = new BadTree();
    newContentPane.setOpaque(true); //content panes must be opaque
    frame.setContentPane(newContentPane);

    //Display the window.
    frame.pack();
    frame.setVisible(true);
}

Windowから拡張するものは拡張する他のコンテナに追加できないため、(あなたの例に基づいて)どちらも機能しませんWindow

基本コンポーネントが から拡張されている場合を除き、JComponent他のコンポーネントは不透明でなければなりません (JLabelこれは明らかな例外です) newContentPane

于 2013-03-05T04:50:17.307 に答える