Avatar billede aslan Nybegynder
01. september 2002 - 20:12 Der er 9 kommentarer og
1 løsning

Se data indeks ikke view Indeks i JTree

Jeg er ved at bygge et simpel forum i en JTree, problemet er bare at jeg skal bruge data indekset på JTree'en og ikke view indekset som følgende kode giver:

int selRow = tree.getRowForLocation(e.getX(), e.getY());

Har nogen en løsning til dette?
Avatar billede jword Nybegynder
02. september 2002 - 09:48 #1
data indekset er det du får via din treemodel:
getIndexOfChild(Object parent, Object child);
Avatar billede aslan Nybegynder
02. september 2002 - 13:39 #2
Det funger ikke? Når jeg forsøger således får jeg 3 ligemeget hvad?

        top = new DefaultMutableTreeNode("Forum");
        treeModel = new DefaultTreeModel(top);
        treeModel.addTreeModelListener(this);                         
        tree = new JTree(treeModel);

        int selRow = treeModel.getIndexOfChild(top,node);
Avatar billede jword Nybegynder
02. september 2002 - 14:01 #3
Hvor får du din node fra? Hvis den retunerer 3 må det næsten være fordi noden ligger som nummer 4 under parent.

Jeg har ikke helt så meget styr på brug af DefaultMutableTreeNodes. Min erfaring er at det er for besværligt at bruge.
Avatar billede aslan Nybegynder
02. september 2002 - 14:12 #4
Jamen hva vil du råde mig til at bruge istedet ? Og har du erfaringer med hvordan man opdater en JTree, når jeg forsøger således:
treeModel.reload();
sker der ikke noget?
Avatar billede jword Nybegynder
02. september 2002 - 14:16 #5
Jeg implementerer normal en TreeModel selv, dvs. bygger den over en datastruktur der findes i forvejen.

Jeg opdaterer normalt ved at fyre nogle TreeModelEvents af på eventuelle listeners. De er dog lidt tricky at konstruere, langt det hurtigste er simpelt at bygge træet forfra.
Avatar billede aslan Nybegynder
02. september 2002 - 14:20 #6
Jeg har implementeret TreeModelListener hvordan kan jeg så "bygge" træet forfra igen som du siger?
Avatar billede jword Nybegynder
02. september 2002 - 17:55 #7
Du skal først have styr på din datastructur. Dernæst tager du den som udgangspunkt for at kreere din treemodel. Her er en relativ simpel treemodel bygget udfra en datastruktur (et filsystem):


package lib.gui;


import javax.swing.*;
import javax.swing.tree.*;
import java.io.*;

import java.util.Map;
import java.util.HashMap;

/**
*  This adopted from the swing connection on java.sun.com. Ive added a simple DirectoryNode
* to this class. For allowing sorting of directories versus files, and to keep a buffer between
* the model and the listing of files. Seems to work remarkable faster when u have first listed
* the content of a directory. Next step would be to create nodes in advance. First though, I will
* test how well this fits into the app.
*
* @author    Stig Tanggaard.
* @created    30. juni 2002
*/
public class FileSystemModel extends AbstractTreeModel implements Serializable {

    String root;

    private Map map;


    /**
    *Constructor for the FileSystemModel object
    */
    public FileSystemModel() {
        //this("c://");    //if windows
   
        this(System.getProperty("user.home"));
    }
   


    /**
    *Constructor for the FileSystemModel object
    *
    * @param  startPath  Description of the Parameter
    */
    public FileSystemModel(String startPath) {
       
        root = startPath;
       
        map = new HashMap();

    }


    /**
    *  Gets the root attribute of the FileSystemModel object
    *
    * @return    The root value
    */
    public Object getRoot() {
        return new File(root);
    }


    /**
    *  Gets the child attribute of the FileSystemModel object
    *
    * @param  parent  Description of the Parameter
    * @param  index  Description of the Parameter
    * @return        The child value
    */
    public Object getChild(Object parent, int index) {

        if (exists((File) parent)) {

            SimpleDirectoryNode node = getNode((File) parent);

            return node.getChild(index);
        } else {

            SimpleDirectoryNode node = addSimpleDirectoryNode((File) parent);

            return node.getChild(index);
        }

        /*
        *  File directory = (File)parent;
        *  String[] children = directory.list();
        *  return new File( directory, children[index] );
        */
    }


    /**
    *  Gets the childCount attribute of the FileSystemModel object
    *
    * @param  parent  Description of the Parameter
    * @return        The childCount value
    */
    public int getChildCount(Object parent) {
        File fileSysEntity = (File) parent;
        if (fileSysEntity.isDirectory()) {
            String[] children = fileSysEntity.list();
            return children.length;
        } else {
            return 0;
        }
    }


    /**
    *  Gets the leaf attribute of the FileSystemModel object
    *
    * @param  node  Description of the Parameter
    * @return      The leaf value
    */
    public boolean isLeaf(Object node) {
        return ((File) node).isFile();
    }


    /**
    *  Description of the Method
    *
    * @param  path      Description of the Parameter
    * @param  newValue  Description of the Parameter
    */
    public void valueForPathChanged(TreePath path, Object newValue) {
    }


    /**
    *  Gets the indexOfChild attribute of the FileSystemModel object
    *
    * @param  parent  Description of the Parameter
    * @param  child  Description of the Parameter
    * @return        The indexOfChild value
    */
    public int getIndexOfChild(Object parent, Object child) {
        File directory = (File) parent;
        File fileSysEntity = (File) child;
        String[] children = directory.list();
        int result = -1;

        for (int i = 0; i < children.length; ++i) {
            if (fileSysEntity.getName().equals(children[i])) {
                result = i;
                break;
            }
        }

        return result;
    }


   
    /**
    *  Method for determining wether a SimpleDirectoryNode of the argument file
    * allready exists.
    *
    * @param  file  Description of the Parameter
    * @return      Description of the Return Value
    */
    public boolean exists(File file) {

        return map.containsKey(file.getPath());
    }



    /**
    *  Gets the node attribute of the FileSystemModel object
    *
    * @param  file  Description of the Parameter
    * @return      The node value
    */
    public SimpleDirectoryNode getNode(File file) {

        return (SimpleDirectoryNode) map.get(file.getPath());
    }


    /**
    *  Adds a feature to the SimpleDirectoryNode attribute of the FileSystemModel object
    *
    * @param  file  The feature to be added to the SimpleDirectoryNode attribute
    * @return      Description of the Return Value
    */
    public SimpleDirectoryNode addSimpleDirectoryNode(File file) {

        System.out.println(file.getPath());
       
        SimpleDirectoryNode node = new SimpleDirectoryNode(file);

        map.put(file.getPath(), node);

        return node;
    }




    /**
    *  Needs some updating scheme.
    *
    * @author    Stig Tanggaard
    * @created    30. juni 2002
    */
    class SimpleDirectoryNode extends Object {

        File[] nodes;


        /**
        *Constructor for the SimpleDirectoryNode object
        *
        * @param  file  Description of the Parameter
        */
        public SimpleDirectoryNode(File file) {

            File[] files = file.listFiles();

            nodes = new File[files.length];

            int index = 0;

            for (int i = 0; i < files.length; i++) {
                if (files[i].isDirectory()) {
                    nodes[index] = files[i];
                    index++;
                }
            }

            for (int i = 0; i < files.length; i++) {
                if (!files[i].isDirectory()) {
                    nodes[index] = files[i];
                    index++;
                }
            }

        }


        /**
        *  Gets the child attribute of the SimpleDirectoryNode object
        *
        * @param  index  Description of the Parameter
        * @return        The child value
        */
        public File getChild(int index) {

            return nodes[index];
        }

    }
   
   
   
   




}
Avatar billede aslan Nybegynder
03. september 2002 - 21:46 #8
Jeg synes ikke rigtig jeg kan bruge dit eksempel til noget.... det er en helt anden måde jeg har sat det op.
Avatar billede jword Nybegynder
03. september 2002 - 21:57 #9
Det var ment som et eksempelt på en treemodel. Du spurgte til hvordan jeg ville gøre det, og mit svar er at lave en implementation af treemodel. At rode rundt med defaultmutabletreenodes etc. får du ikke noget godt ud af.
Avatar billede aslan Nybegynder
01. oktober 2002 - 13:17 #10
hhmm
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester