Avatar billede nielsbrinch Nybegynder
19. marts 2002 - 13:39 Der er 4 kommentarer og
1 løsning

Sortering af noder i JTree

Jeg har et træ der består af nogle objekter af DefaultMutableTreeNode. Hver node er lavet med en almindelig streng (på et filnavn).

Nu kunne jeg godt tænke mig at kunne sortere rækkefølgen noderne kommer i. F.eks. kunne jeg godt tænke mig at sortere det således at de noder som indeholder andre noder, kommer først. Jeg kunne tænke mig at sortere efter navn, forlæns og baglæns, osv.

Hvodden? Det første sted jeg leder er http://java.sun.com men der kommer ikke noget brugbart frem når jeg søger efter sortering af JTree.

Er der nogen der har et eksempel liggende, eller lige kan stykke et eksempel sammen?

(bemærk jeg bruger JTree, ikke JTreeTable)
Avatar billede steel Praktikant
19. marts 2002 - 14:16 #1
Hej Niels,

  Du bliver nødt til at tage fat i modellen til træet - f.eks. en DefaultTreeModel. Der er 2 forskellige metoder på en DefaultMutableTreeNode til at finde ud af, om den kan indeholde andre noder: isLeaf() og allowsChildren() <- det bestemmer også, om noden skal tegnes som mappe. (Jeg blev selv nødt til at subclasse DefaultMutableTreeNode, og selv checke, om noden ifølge modellen indeholder sub-nodes).
  Selve sorteringen af de DefaultMutableTreeNodes skulle ikke være noget problem ... toString() returnerer dit UserObject's streng-værdi, og hvis du skal sortere på andet end strenge, så bare getUserObject() på DefaultMutableTreeNode.
  Nu opdaterer jeg godt nok min DefaultTreeModel i en anden tråd end AWT-tråden, men jeg bliver nødt til at kalde nodesWereInserted(..) på modellen, og den sørger så for at affyre korrekte events ud til JTree, som så opdaterer sit View.

Var det sort snak eller?  ;]
Avatar billede nielsbrinch Nybegynder
19. marts 2002 - 14:31 #2
Sådan skaber jeg mit træ. Hvordan sørger jeg for at bruge en TreeModel på træet?

  void getTree()
  {
    String startLibrary = "C:\\Dokumenter\\Internet\\minister";

    // Træets rod initeres
    DefaultMutableTreeNode rod = new DefaultMutableTreeNode(startLibrary);

    // Træet initieres påny med den nye rod
    jTree1 = new JTree(rod);

    // Rekursiv metode kaldes
    getLibs(startLibrary, rod);

    // Ændringerne gøres synlige i GUI
    jScrollPane1.getViewport().add(jTree1, null);
  }

  void getLibs(String lib, DefaultMutableTreeNode tree)
  {
    File fil = new File(lib);
    File files[] = fil.listFiles();

    if(files.length != 0) {
      for(int i=0; i<files.length; i++) {
        String element = files[i].getName();
        DefaultMutableTreeNode node = new DefaultMutableTreeNode(element);
        if(files[i].isDirectory()) {
          tree.add(node);
          getLibs(lib+"/"+element, node);
        }
        else {
          tree.add(node);
        }
      }
    }
  }
Avatar billede nielsbrinch Nybegynder
19. marts 2002 - 14:33 #3
I øvrigt har jeg rodet lidt med om det mon var DefaultTreeModel jeg skulle bruge, men kunne ikke finde nogle funktioner på DefaultTreeModel der kunne sortere.

Så din snak var sort nok til at jeg tror du ved hvad du snakker om. Men for sort til at jeg ved hvad du snakker om :-)
Avatar billede nielsbrinch Nybegynder
19. marts 2002 - 14:40 #4
Dette må være det logiske for at bruge DefaultTreeModel på træet:

DefaultTreeModel treeModel = new DefaultTreeModel(rod);
jTree1 = new JTree(treeModel);

Men stadig forstår jeg ikke rigtig hvad jeg skal bruge det til :-)

API'en hjælper mig i hvert fald ikke.
Avatar billede steel Praktikant
19. marts 2002 - 14:48 #5
Niels,

  JTree'et repræsenterer blot et View ned på din TreeModel. Du skal selv 'om-møblere' dine noder via. DefaultMutableTreeNode's remove(..), removeAllChildren(), insert(..), osv. Det er blot TreeModel'ens ansvar at notificere sine View(s) om, at modellen er ændret.
  Jeg har desværre ikke tid til at lave det for dig - kun at pege dig i den rigtige retning.
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