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 ;-)
Annonceindlæg tema
Forsvar & beredskab
Cybersikkerhed, realtidsdata og robuste it-systemer er blevet fundamentet for moderne forsvar.
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?
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é
31. marts 2003 - 19:03
#3
Giv mig lige 30 min ca.
31. marts 2003 - 19:05
#4
Ok, der er aligevel spisetid :-)
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()); } }
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>
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
01. april 2003 - 00:14
#8
Altså i en tabel inde i cellen?
01. april 2003 - 09:29
#9
Ja, hvis man kan det
06. november 2003 - 13:34
#10
Lukker
Kurser inden for grundlæggende programmering