tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
11
ZUGRIFFE
3136
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    waves waves ist offline Rookie
    Registriert seit
    Aug 2005
    Beiträge
    6
    ich versuche schon seit wochen einen treeviewer zu erstellen, jedoch bisher ohne erfolg. ich habe schon praktisch jedes tutorial durchgearbeitet aber scheinbar bin ich wohl zu blöd dafür. ich hoffe, hier kann mir jemand helfen.

    wie gesagt will ich einen treeviewer erstellen. ich habe ein HSSQL datenbank. das query wird ausgeführt und ich erhalte eine ArrayList mit diesen werden als String zurück:

    Code :
    1
    2
    3
    
    E-Nature
    Music
    Movies

    ich will diese werde nun in einen treeviewer packen. jeder node hat dann noch diverse subnodes (01, 02, 03 etc.) diese sollte man dann ausklappen können, indem man auf das + links von den werden klickt. also so:

    Code :
    1
    2
    3
    4
    5
    6
    
    + E-Nature
    - Music
      01
      02
      03
    + Movies

    da ich schon relativ viele tutorials durchgegangen bin und keinen erfolg hatte, wäre es super, wenn jemand mit die code "schnippsel" posten könnte!

    danke für hilfe jeglicher art!
     

  2. #2
    kabel2 kabel2 ist offline Mitglied Gold
    Registriert seit
    Aug 2005
    Beiträge
    138
    Was genau verstehst du nicht?
    Den Sinn von ITreeContentProvider?
    Den Sinn von ILabelProvider?
    Die Zusammenarbeit der beteiligten Instanzen?
    Wie du von den Datenbank-Daten auf einen Baummodell abbildest?

    Du sagst zwar, dass du verschiedene Einführungen gelesen hast, aber wo du im Augenblick stehst sagst du nicht. Zeig doch mal deine bisherigen Versuche, dann reden wir nicht aneinander vorbei.
     

  3. #3
    waves waves ist offline Rookie
    Registriert seit
    Aug 2005
    Beiträge
    6
    ich habe es gestern nun doch geschafft gemaess tutorial zumindest den beispiel treeviwer zum laufen zu bringen. nun habe ich eigentlich nur noch dieses problem:


    da ich die werte fuer den treeviewer in einer arraylist have (als strings), der treeviewer aber scheinbar einen file-typen verlangt, weiss ich nicht genau, wie ich nun diese struktur vom treeviewer anzeigen lassen kann:

    Code :
    1
    2
    3
    4
    5
    6
    
    + E-Nature
    - Music
      01
      02
      03
    + Movies

    der code vom beispiel, wo der inhalt in den treeviewer eingefuegt wird, sieht so aus:

    Code :
    1
    2
    3
    4
    5
    6
    7
    
    ...
    private TreeViewer tv = new TreeViewer(sash_form);
    tv.setContentProvider(new FileTreeContentProvider());
    tv.setLabelProvider(new FileTreeLabelProvider());
    tv.setInput(new File("C:\\"));
    tv.addFilter(new AllowOnlyFoldersFilter());
    ...

    Dort wo zur zeit "C:\\" steht, moechte ich nun die struktur von oben anzeigen. leider weiss ich nicht wie.

    Ich habe eine ArrayList mit diesen Strings:
    E-Nature
    Music
    Movies

    Ich habe dann noch weitere ArrayLists mit strings mit diesen werten:
    01
    02
    03
    etc.

    die werte von der zweiten arraylist sollen als subnode bei jedem von den 3 oben erwaehnten werten in der ersten arraylist im treeviewer ersichtlich sein.

    ich hoffe, ich konnte mein problem klarer erklaeren!
    danke fuer hilfe
    Geändert von waves (25.08.05 um 12:34 Uhr)
     

  4. #4
    kabel2 kabel2 ist offline Mitglied Gold
    Registriert seit
    Aug 2005
    Beiträge
    138
    ok, also geht es um die Konvertierung in ein Baummodell.

    Zwischen dem Holen der Daten und der Anzeige schaltet man einen "Klassenverbund", der als Modell bezeichnet wird. Das könnte hier z.b. so aussehen:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    
    package main.model;
     
    import java.util.ArrayList;
    import java.util.List;
     
    public class CD {
        private String cdName;
        private ArrayList tracks;
        
        public CD( String cdName ) {
            this.cdName= cdName;
            tracks= new ArrayList();
        }
        
        public boolean addTrack(Track o) {
            return tracks.add(o);
        }
        public List getTracks() {
            return tracks;
        }
     
        public String toString() {
            return cdName;
        }
    }
    Eine Instanz der Klasse CD repräsentiert eine CD

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
    package main.model;
     
    public class Track {
        private String trackName;
        private int trackLength; // in seconds
        private CD belongsTo;
        
        public Track(String name, int length, CD to) {
            belongsTo = to;
            trackLength = length;
            trackName = name;
        }
        
        public CD getBelongingCD() {
            return belongsTo;
        }
     
        public String toString() {
            return trackName;
        }
        
    }
    Eine Instanz der Klasse Track repräsentiert einen Track und ist immer mit einer CD assoziiert.

    Ich bau mir mit folgendem Code ein Beispielmodell:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
        ArrayList cds= new ArrayList();
        for( int i= 0; i< 3; i++ ){
            CD cd= new CD( "cd name " + i );
            for( int j= 0; j< 10; j++ ) {
                Track t= new Track( "track " + j, j*j, cd );
                cd.addTrack( t );
            }
            cds.add( cd );
        }
        ListenContentProvider lp= new ListenContentProvider( cds );

    das mit folgendem Code angezeigt werden kann:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    
    package main;
     
    import java.util.ArrayList;
    import java.util.List;
     
    import main.model.CD;
    import main.model.Track;
     
    import org.eclipse.jface.viewers.ITreeContentProvider;
    import org.eclipse.jface.viewers.Viewer;
     
    public class ListenContentProvider implements ITreeContentProvider {
     
        private List cds;
     
        public ListenContentProvider( ArrayList cds ) {
            this.cds= cds;
        }
     
        public Object[] getChildren(Object parentElement) {
            if( parentElement instanceof CD )
                return ((CD) parentElement).getTracks().toArray();
            return new Object[] {};
        }
     
        public Object getParent(Object element) {
            if( element instanceof Track )
                return ((Track) element).getBelongingCD();
            return null;
        }
     
        public boolean hasChildren(Object element) {
            return element instanceof CD;
        }
     
        public Object[] getElements(Object inputElement) {
            return cds.toArray();
     
        }
     
        public void dispose() { }
        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { }
    }

    Ich hoffe du hast die Idee dahinter verstanden und bist nicht erschlagen
     

  5. #5
    waves waves ist offline Rookie
    Registriert seit
    Aug 2005
    Beiträge
    6
    danke fuer die ausfuehrliche antwort!
    aber ich befuerchte, ich habe es nicht ganz begriffen

    ich habe mal diese klassen, die du geposted hast, in mein projekt integriert.

    was ich nun aber noch immer nicht weiss ist, wie ich diese daten nun in den treeviewer reinbringe.

    dort wo der inahlt des treeviewers eingegeben wird, sieht der code bei mir so aus:

    Code :
    1
    2
    3
    4
    5
    6
    7
    
    ...
        tv = new TreeViewer(sash_form);
        tv.setContentProvider(new FileTreeContentProvider());
        tv.setLabelProvider(new FileTreeLabelProvider());
        tv.setInput(new File("C:\\"));
        tv.addFilter(new AllowOnlyFoldersFilter());
    ...

    was muss ich denn jetzt bei:
    Code :
    1
    
    tv.setInput(new File("C:\\"));

    genau aendern, damit ich deine angegebenen inhalte im treeviewer anzeigen lassen kann?

    mit dem code von dir:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
        ArrayList cds= new ArrayList();
        for( int i= 0; i< 3; i++ ){
            CD cd= new CD( "cd name " + i );
            for( int j= 0; j< 10; j++ ) {
                Track t= new Track( "track " + j, j*j, cd );
                cd.addTrack( t );
            }
            cds.add( cd );
        }
        ListenContentProvider lp= new ListenContentProvider( cds );

    erstelle ich ja die CD objekte, wie diese aber nun in den treeviewer einfuegen?

    danke fuer weitere hilfe, bin dafuer echt dankbar!
     

  6. #6
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo!

    Ich habe das gute Beispiel von kabel2 mal ein wenig aufgebohrt
    schau mal hier:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    
     package de.tutorials;
     
     import java.util.ArrayList;
     import java.util.List;
     
     import org.eclipse.jface.viewers.ILabelProvider;
     import org.eclipse.jface.viewers.ILabelProviderListener;
     import org.eclipse.jface.viewers.ITreeContentProvider;
     import org.eclipse.jface.viewers.TreeViewer;
     import org.eclipse.jface.viewers.Viewer;
     import org.eclipse.jface.window.ApplicationWindow;
     import org.eclipse.swt.graphics.Image;
     import org.eclipse.swt.widgets.Composite;
     import org.eclipse.swt.widgets.Control;
     import org.eclipse.swt.widgets.Display;
     import org.eclipse.swt.widgets.Shell;
     
     import de.tutorials.domain.CompactDisc;
     import de.tutorials.domain.Track;
     
     public class JFaceTreeViewerExample extends ApplicationWindow {
     
        public JFaceTreeViewerExample(Shell parentShell) {
            super(parentShell);
            setBlockOnOpen(true);
            open();
        }
     
        protected Control createContents(Composite parent) {
     
            TreeViewer treeViewer = new TreeViewer(parent);
            treeViewer.setContentProvider(new ITreeContentProvider() {
                public Object[] getChildren(Object parentElement) {
                    if (parentElement instanceof List) {
                        return ((List) parentElement).toArray();
                    } else if (parentElement instanceof CompactDisc) {
                        return ((CompactDisc) parentElement).getTracks().toArray();
                    }
                    return new Object[0];
                }
     
                public Object getParent(Object element) {
                    if (element instanceof Track) {
                        return ((Track) element).getAssociatedCompactDisc();
                    } else {
                        return null;
                    }
                }
     
                public boolean hasChildren(Object element) {
                    if (element instanceof List) {
                        return ((List) element).size() > 0;
                    } else if (element instanceof CompactDisc) {
                        return ((CompactDisc) element).getTracks().size() > 0;
                    } else {
                        return false;
                    }
                }
     
                public Object[] getElements(Object inputElement) {
                    return getChildren(inputElement);
                }
     
                public void dispose() { }
     
                public void inputChanged(Viewer viewer, Object oldInput,
                        Object newInput) {  }
            });
     
            treeViewer.setLabelProvider(new ILabelProvider() {
                public Image getImage(Object element) {
                    return null;
                }
     
                public String getText(Object element) {
                    if (element instanceof CompactDisc) {
                        CompactDisc compactDisc = (CompactDisc) element;
                        return compactDisc.getName();
                    } else if (element instanceof Track) {
                        Track track = (Track) element;
                        return track.getName();
                    } else {
                        return null;
                    }
                }
     
                public void addListener(ILabelProviderListener listener) {  }
     
                public void dispose() { }
     
                public boolean isLabelProperty(Object element, String property) {
                    return false;
                }
     
                public void removeListener(ILabelProviderListener listener) { }
     
            });
     
            treeViewer.setInput(initModel());
     
            return super.createContents(parent);
        }
     
        private List initModel() {
     
            List compactDiscs = new ArrayList();
            for (int i = 0; i < 3; i++) {
                CompactDisc compactDisc = new CompactDisc("cd name " + i);
                for (int j = 0; j < 10; j++) {
                    Track t = new Track("track " + j, j * j, compactDisc);
                    compactDisc.addTrack(t);
                }
                compactDiscs.add(compactDisc);
            }
     
            return compactDiscs;
        }
     
        /**
         * @param args
         */
        public static void main(String[] args) {
            Display display = new Display();
            Shell shell = new Shell(display);
            new JFaceTreeViewerExample(shell);
        }
     }

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    
     package de.tutorials.domain;
     
     import java.util.ArrayList;
     import java.util.List;
     
     public class CompactDisc {
        String name;
     
        List tracks;
     
        public CompactDisc(String name) {
            this.name = name;
            tracks = new ArrayList();
        }
     
        public boolean addTrack(Track o) {
            return tracks.add(o);
        }
     
        public List getTracks() {
            return tracks;
        }
     
        public String getName() {
            return name;
        }
     }

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
      package de.tutorials.domain;
     
     public class Track {
        private String name;
        private int length; // in seconds
        private CompactDisc associatedCompactDisc;
        
        public Track(String name, int length, CompactDisc associatedCompactDisc) {
            this.associatedCompactDisc = associatedCompactDisc;
            this.length = length;
            this.name = name;
        }
        
        public CompactDisc getAssociatedCompactDisc() {
            return associatedCompactDisc;
        }
      
        public String getName() {
            return name;
        }
        
     }

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  7. #7
    waves waves ist offline Rookie
    Registriert seit
    Aug 2005
    Beiträge
    6
    wow super, danke! das bringt mich echt meilen weiter! werde nun mal diese klassen genauer anschauen, damit ich das auch begreife. werde dann nochmals posten, falls ich an ein problem stosse.

    aber:
    kann es sein, dass man für einen simplen treeviewer ganze 16 klassen braucht? soviele habe ich zur zeit in meinem test-projekt! das sollte doch bestimmt mit 2-3 auch funktionieren oder irre ich mich da?
     

  8. #8
    kabel2 kabel2 ist offline Mitglied Gold
    Registriert seit
    Aug 2005
    Beiträge
    138
    Von dieser Vorstellung solltest du dich lösen.

    Du kannst das ganze auch in EINE EINZIGE Klasse packen. Ohne Innere Klassen. Du wirst nur durch die Tatsache eingeschränkt, dass Java Klassen nur von einer Klasse erben können (genau genommen, nicht mal das).
     

  9. #9
    waves waves ist offline Rookie
    Registriert seit
    Aug 2005
    Beiträge
    6
    danke fuer die bisherigen tipps. ich habe den treeviewer nun auf ca. 3 klassen "runter bekommen"

    der treeviewer funktioniert jetzt auch endlich!
    nun habe ich noch ein letztes problem. ich moechte ein selection listener machen, welcher mir den angeklickten node (inkl. dem parent node) per system.out.print() ausgibt. (bzw. das ausgibt, was man im treeviewer sieht)

    leider habe ich das nicht zum laufen gebracht.

    die struktur von meinem treeviewer sieht so aus:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    
    + Music
      - 01
      - 02
      - 03
    + Movies
      - 01
      - 02
    ...


    bisher habe ich diesen code fuer den selection listener:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    treeViewer1.addSelectionChangedListener(new ISelectionChangedListener() {
      public void selectionChanged(SelectionChangedEvent event) {
      IStructuredSelection selection = (IStructuredSelection) event.getSelection();
                                
      Object selected_file = selection.getFirstElement();
      DiscInArchive ddt = (DiscInArchive) selected_file;
      System.out.println(ddt.getName());
      }
    });

    der code funktioniert jedoch nur, wenn ich einen subnode (z.b. 01, 02, etc.) anklicke, wenn ich einen parent node anklicke (z.b. Movies), dann kriege ich einen fehler.
    irgendwie muesste ich eine abfrage haben, welche rausfindet, ob dies nun ein objekt von der klasse "DiscInArchive" oder von "DiscArchive" ist.

    hat mir da jemand ein tipp?
    Geändert von waves (31.08.05 um 16:19 Uhr)
     

  10. #10
    kabel2 kabel2 ist offline Mitglied Gold
    Registriert seit
    Aug 2005
    Beiträge
    138
    du willst hier ein instanceof.
    Code :
    1
    2
    3
    
    if( o instanceof DiscArchive) {
     // cast to DiscArchive safe
    }
     

  11. #11
    waves waves ist offline Rookie
    Registriert seit
    Aug 2005
    Beiträge
    6
    DANKE kabel2!

    mein treeviewer funktioniert jetzt perfekt
     

  12. #12
    seppal0815 seppal0815 ist offline Grünschnabel
    Registriert seit
    Jul 2007
    Beiträge
    1
    Hallo,

    ich hätte versucht, dieses Beispiel zum laufen zu bringen, jedoch kann ich es leider nicht starten. Ich bekomme die Fehlermeldung
    "java.lang.NoClassDefFoundError: org/eclipse/core/runtime/IProgressMonitor". Beim herumgoogeln habe ich festgestellt, dass die folgenden 4 jar Dateien im Build-Pfad sein müssen ..EI steht für Eclipse-Installationspfad
    <EI>\plugins\org.eclipse.jface_3.2.2.M20061214-1200.jar
    <EI>\plugins\org.eclipse.core.runtime_3.2.0.v20060603.jar
    <EI>\plugins\org.eclipse.swt.win32.win32.x86_3.2.2.v3236.jar
    <EI>\plugins\org.eclipse.ui.workbench_3.2.2.M20070119-0800.jar

    Um das Beispiel zu starten, muss man dann anscheinend auch der VM noch folgendes ähnliches Argument mitgeben. Ich verwende eine neuere Version, habe das nur aus einer Beschreibung rauskopiert.
    -Djava.library.path =<EI>\plugins\org.eclipse.swt.win32_3.0.1\os\win32\x86\

    Allerdings verstehe ich nicht, wie das funktionieren soll. Ich weiß zwar, wo ich VM Argumente angeben muss, aber ich habe kein so ähnliches Verzeichnis. Ich habe nur ein jar-File "org.eclipse.swt.win32.win32.x86_3.2.2.v3236.jar".

    Bin etwas fraglos wie ich das Beispiel wirklich zum laufen bringe. Wäre über Hilfe sehr dankbar.

    Liebe Grüße
     

Ähnliche Themen

  1. Verzweiflung sg33g5m + ati
    Von Ch im Forum Hardware
    Antworten: 0
    Letzter Beitrag: 16.02.09, 21:50
  2. Wut/Verzweiflung ?
    Von Shashín-Danji im Forum Bildbearbeitung & Illustration
    Antworten: 15
    Letzter Beitrag: 08.05.07, 12:20
  3. Scrollbalken - Verzweiflung -
    Von tulusie im Forum CSS
    Antworten: 5
    Letzter Beitrag: 21.02.06, 12:16
  4. Verzweiflung!
    Von Birdie501 im Forum PHP
    Antworten: 6
    Letzter Beitrag: 29.01.05, 16:40
  5. Verzweiflung
    Von Hellie im Forum Coders Talk
    Antworten: 11
    Letzter Beitrag: 26.06.04, 19:13