0

ボタンクリックイベントでタブと JTree を作成するこのアプリを作成しています。問題は、ノードを JTree に追加しようとすると、JTree が更新されないことです (または、ノードが追加されません...よくわかりません)。

タブとツリーを作成する関数は次のとおりです。

jTabbedPane1.add(st,jSplitpane10);
int count = jTabbedPane1.getTabCount();
jTabbedPane1.setSelectedIndex(count-1);

DefaultMutableTreeNode root = new DefaultMutableTreeNode("All Notebooks");
DefaultMutableTreeNode notebook1 = new DefaultMutableTreeNode("Notebook 1");
root.add(notebook1);

// Create tree
JTree tree = new JTree(root);
//Create Scroll Pane for the tree
JScrollPane sp = new JScrollPane(tree);

Global.trees.add(tree);

そして、これは選択されたタブのツリーに新しいノード "Green" を追加することになっているコードです:

int i = jTabbedPane1.getSelectedIndex();
DefaultTreeModel model = (DefaultTreeModel)Global.trees.get(i).getModel();

// Find node to which new node is to be added
int startRow = 0;
String prefix = "J";
TreePath path = Global.trees.get(i).getNextMatch(prefix, startRow, Position.Bias.Forward);
MutableTreeNode node = (MutableTreeNode)path.getLastPathComponent();

// Create new node
MutableTreeNode newNode = new DefaultMutableTreeNode("green");

// Insert new node as last child of node
model.insertNodeInto(newNode, node, node.getChildCount());
model.reload(newNode);

JTree のグローバル リストの宣言も次のとおりです。

public class Global {
    public java.util.List<JTree> trees = new ArrayList<JTree>();
}Global Global;

新しいノードがツリーに表示されない理由はありますか?

4

3 に答える 3

1

JTree と JTable は、最も複雑な Swing コンポーネントです。

リロードされていると思いますが、展開されていません。JTree ルート ノードには多くの設定があります。どのようにハンドラーを表示するか、ルート ノードを表示しないかなどです。

モデル データをテキストとしてダンプするデバッグ コンソール リストを使用しています (ノード内の toString() もオーバーライドします)。そこにあるものを簡単に確認できますが、不要なノードがいくつかある場合は、それで十分です。 Netbeans のデバッガーで。

また、ツリー内のすべての行を展開して表示できるようにしてください。

あなたのコードは良いです:

// Create new node
MutableTreeNode newNode = new DefaultMutableTreeNode("green");

// Insert new node as last child of node
model.insertNodeInto(newNode, node, node.getChildCount());
model.reload(newNode);

しかし、おそらくそれは見えません。拡張する必要があります。それを行う方法は別の問題です

于 2012-09-03T12:49:20.277 に答える
0

問題をテストするための小さなサンプル アプリケーションを作成しました。ノードが正しく追加されていることがわかりましたが、展開されていません。また、への呼び出しmodel.reloadは不要のようです。

ツリーに呼び出しを追加してexpandPath、ディスプレイに新しいノードを表示させました。これがツリーを拡張しすぎていないことを再確認する必要がある場合があります。

public class Example extends JFrame {

  private JTree tree;

  public Example() {
    DefaultMutableTreeNode root = new DefaultMutableTreeNode("All Notebooks");
    DefaultMutableTreeNode notebook1 = new DefaultMutableTreeNode("Notebook 1");
    root.add(notebook1);

    tree = new JTree(root);
    JScrollPane sp = new JScrollPane(tree);

    setLayout(new BorderLayout());
    add(sp, BorderLayout.CENTER);
    add(new JButton("Go") {
    {
      addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
          Example.this.addNode();
        }
      });
    }}, BorderLayout.SOUTH);

    setDefaultCloseOperation(EXIT_ON_CLOSE);
    pack();
  }


  private void addNode() {
    DefaultTreeModel model = (DefaultTreeModel) tree.getModel();

    // Find node to which new node is to be added
    int startRow = 0;
    String prefix = "N";
    TreePath path = tree.getNextMatch(prefix, startRow,
        Position.Bias.Forward);
    MutableTreeNode node = (MutableTreeNode) path.getLastPathComponent();

    // Create new node
    MutableTreeNode newNode = new DefaultMutableTreeNode("green");

    // Insert new node as last child of node
    model.insertNodeInto(newNode, node, node.getChildCount());
    tree.expandPath(path);
  }


  public static void main(String[] args) {    
    EventQueue.invokeLater(new Runnable() {      
      @Override
      public void run() {
        new Example().setVisible(true);
      }
    });
  }
}
于 2012-09-03T13:13:47.927 に答える