Avatar billede joshin Nybegynder
31. marts 2003 - 17:39 Der er 9 kommentarer og
1 løsning

Vise en træ-struktur via tables / tables i tables

Hej Eksperter
Jeg har en træstruktur (Document) som jeg gerne vil vise grafisk via f.eks. tables.
En node kan udover data have et ikke fast antal atributter

Min tanke var at en node i træet blev til en table på 1x2
øverset felt indeholdene nodes data og atributter
nederste felt en table med nodens børn, hvis den har nogle
dette køres så rekursivt

Problemet er hvordan ? eller andre idéer ?

100 poient er dor kode der kommer til at virke
idéer og stumper efter fortjeneste ;-)
Avatar billede viht Nybegynder
31. marts 2003 - 18:40 #1
Vil du have et JTree OG en JTable ved siden af hinanden? Hvor JTablen så opdateres efter nodeklik i JTree?
Avatar billede joshin Nybegynder
31. marts 2003 - 19:00 #2
Det kunne måske bruges, kan ikke lige se det for mig.
Tanken var en stor tabel, men det var bare en idé
Avatar billede viht Nybegynder
31. marts 2003 - 19:03 #3
Giv mig lige 30 min ca.
Avatar billede joshin Nybegynder
31. marts 2003 - 19:05 #4
Ok, der er aligevel spisetid :-)
Avatar billede viht Nybegynder
31. marts 2003 - 19:33 #5
Her er et udkast.

Du kan navigere i træet ved at dobbeltklikke på rækkerne. Række 0 kan du ikke dobbeltklikke på da den repræsenterer den node du "er i". Denne nodes attributter vises i højre celle for noden.

// TestFrame.java:
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

import javax.xml.parsers.*;
import org.w3c.dom.*;

import java.io.File;

public class TestFrame extends JFrame {
   
    private DomTableModel model;
    private JTable table;
    private Document doc;
   
    public TestFrame() {
        super("Dom test");
        setSize(400,400);
       
        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            doc = builder.parse(new File("test.xml"));
        }
        catch(Exception e) {
            e.printStackTrace();
        }
        model = new DomTableModel(doc);
        table = new JTable(model);
        table.addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent event) {
                if( event.getClickCount() == 2 ) {
                    int index = table.getSelectedRow();
                    if( index > 0 )
                        model.setRoot(model.getElement(index));
                }
            }
        });
       
        JPanel buttonPanel = new JPanel();
        JButton button = new JButton("Tilbage");
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                model.goBack();
            }
        });
        buttonPanel.add(button);
           
        getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
        getContentPane().add(buttonPanel, BorderLayout.SOUTH);
    }

    public static void main(String[] args) {
      new TestFrame().setVisible(true);
  }
}

// DomTableModel.java:
import javax.swing.table.*;
import org.w3c.dom.*;

public class DomTableModel extends AbstractTableModel {
   
    private static String[] columns = { "Element", "Attributter" };
    private static Document doc;
    private Node root;
    private NodeList children;
   
    private static String goBack = "Tilbage...";
   
    public DomTableModel(Document doc) {
        this.doc = doc;
        root = doc.getFirstChild();
        children = root.getChildNodes();
    }
   
    public int getColumnCount() {
        return columns.length;
    }
   
    public int getRowCount() {
          return children.getLength()+1;
    }

    public String getColumnName(int column) {
        return columns[column];
    }

    public Object getValueAt(int row, int column) {
        if( row == 0 ) {
            if(column == 0)
                return root.getNodeName();
            else {
                NamedNodeMap map = root.getAttributes();
                StringBuffer buffer = new StringBuffer();
                if( map != null ) {
                    for( int i = 0; i < map.getLength(); i++ ) {
                        Node node = map.item(i);
                        buffer.append( node.getNodeName()+":"+node.getNodeValue()+" " );
                    }
                    return buffer.toString();
                }
                else
                    return "";
            }
        }
           
        if( column == 0 ) {
            return children.item(row-1).getNodeName();       
        }
        return "";
    }

    public Class getColumnClass(int column) {
        return getValueAt(0, column).getClass();
    }
   
    public boolean isCellEditable(int row, int column) {
        return false;
    }

    public void setValueAt(Object value, int row, int column) {
        switch( column ) {
            case 0: {
                // nada
            } break;
            case 1: {
                // nada
            } break;
            case 2: {
                // nada
            } break;
        }
        fireTableCellUpdated(row, column);
    }
   
    public Node getElement(int index) {
        return children.item(index-1);
    }
    public void goBack() {
        Node newRoot = null;
        if( (newRoot = root.getParentNode()) != null )
            setRoot(newRoot);
    }
   
    public void setRoot(Node node) {
        System.out.println ("root is: "+root.getNodeName());
        root = node;
        System.out.println ("new root is: "+root.getNodeName());
        children = root.getChildNodes();
        fireTableRowsDeleted(0, children.getLength());
    }
}
Avatar billede viht Nybegynder
31. marts 2003 - 19:34 #6
Den XML fil jeg testede på:

// test.xml:
<?xml version="1.0" encoding="UTF-8"?>
<settings viewname="Settings">
    <editor viewname="Editor properties">
        <initialsize width="800" height="600" viewname="Desktop size"/>
        <location x="100" y="100" viewname="Desktop location"/>
    </editor>
    <javasdk viewname="Java SDK home">
        <javahome dir="c:/programmer/j2sdk1.4.1_01/bin" viewname="Java home directory"/>
    </javasdk>
    <profiles viewname="Profiles">
        <java viewname="Java">
            <javafont name="Tahoma" size="11" style="plain" viewname="Default font"/>
            <javatab size="3" viewname="Tab size"/>
        </java>
        <plaintext viewname="Plain text">
            <plaintextfont name="Courier" size="11" viewname="Default font"/>
            <plaintexttab size="3" viewname="Tab size"/>
        </plaintext>
    </profiles>
</settings>
Avatar billede joshin Nybegynder
31. marts 2003 - 23:33 #7
Ser fornuftigt ud, jeg ville bare gerne have attributterne i en tabel istedet for en en lang række
Avatar billede viht Nybegynder
01. april 2003 - 00:14 #8
Altså i en tabel inde i cellen?
Avatar billede joshin Nybegynder
01. april 2003 - 09:29 #9
Ja, hvis man kan det
Avatar billede joshin Nybegynder
06. november 2003 - 13:34 #10
Lukker
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