DefaultTreeTableModel

hallo Leute,
ich möchte ein iniFile auslesen und das in einem JXtreetable anzeigen.wenn ich die Werte in der Table änderne,müssen die Änderungen auch in Inifile anzeigen werden.
als nächstes wenn jemand anders das Inifile zur laufzeit ändert müss meine Anwendung über die Änderung mitbekommen und die Änderung in der Table beziehungsweise auch im Baum geändert werden müssen.
meine Frage ist? reich mir das DefaultTreeTableModel oder müss ich eigene TreeTableModel schreiben?
hat Jemand ein änliches Beispiel?

Vielen Dank im Voraus

Änderungen, die am Modell vorgenommen werden, in die Datei zu schreiben, wäre vermutlich schon mit dem Default model möglich: Man kann dort einen Listener anhängen, der bei jeder Änderung benachrichtigt wird, und die geänderte INI-Datei rausschreibt - zumindest gehe ich davon aus, dass die Listener auch benachrichtigt werden, wenn man in der “Tabelle” etwas ändert (und wenn nicht, müßte man nur eine Methode anpassen).

Umgekehrt wird’s schwierig bis unmöglich: Mit reinem Java kann man nicht “mitbekommen”, dass eine Datei von einem anderen Programm geändert wurde. Es gibt native Bibliotheken, die ähnliche Funktionen haben - zumindest für die Überwachung von Verzeichnissen. Für Dateien müßte ich auch erst Websuchen, könnte es aber geben - und wenn nicht, kann man sie sich selbst schreiben. Eine Alternative, die sich mit geringem Aufwand umsetzen ließe, wäre ein eigener Thread, der mit geringer Priorität läuft, und in regelmäßigen Abständen prüft, wann die Datei zuletzt geändert wurde, und sie wenn nötig neu einliest… das ist eigentlich nicht so schön, aber … -_- wenn die Alternative wäre, dass man sich selbst irgendeine Betriebssystemspezifische Native Bibliothek schreibt, wäre das eben schon deutlich einfacher…

Danke für die schnelle Antwort.
wäre denn möglich wenn mehrere programme die Selbe Interface für IniFile implemntieren,.und ein programm davon das Inifile ändert,so dass die anderen das mitbekommen?
wenn ja wie kann ich das machen?

gruss
kokito

Selbst das ist nicht ohne weiteres möglich. Wenn zwei mal das gleiche Programm gestartet wird, dann sind das vollständig unterschiedliche Programme, die voneinander nichts wissen (und das ist auch gut so - meistens ;)) Es gibt für solche Sachen halt manchmal Workarounds - aber ob es z.B. angebracht wäre, die Daten zwischen den Programmen über Sockets oder ähnliches auszutauschen, ist so erstmal schwer zu sagen…

Hallo,
ich habe mal gehört dass ich das so machen kann.ich habe ein Interface für meine Inifile die Impliemtiert müss .die sieht so aus


    public String getValue(String hSection, String hKey) throws Exception;

    public Set getKeySet(String hSection) throws Exception;

    public void addSection(String newSection)  throws Exception;
    public void removeKey(String hSection, String hKey) throws FileNotFoundException, Exception;

    public void removeSection(String hSection);

    public void renameSection(String hOldSection,String hNewSection);

    public void setValue(String Section, String Key, String Value) throws Exception;

    public void addAdListener( AdListener listener ) throws Exception;```

und meine View wo mein JXtreetable erzeugt wird :sieht so aus

public class MyJxTreeTable extends javax.swing.JPanel {

Set<String> sectionSet;
Set<String>  keySet;

public MyJxTreeTable() {
    initComponents();
    createTreeTable();
}

/** This method is called from within the constructor to
 * initialize the form.
 * WARNING: Do NOT modify this code. The content of this method is
 * always regenerated by the Form Editor.
 */
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
private void initComponents() {

    jScrollPane1 = new javax.swing.JScrollPane();
    jXTreeTable1 = new org.jdesktop.swingx.JXTreeTable();

    jScrollPane1.setViewportView(jXTreeTable1);

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
    this.setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addContainerGap()
            .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE)
            .addContainerGap())
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addContainerGap()
            .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 275, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addContainerGap(14, Short.MAX_VALUE))
    );
}// </editor-fold>                        
// Variables declaration - do not modify                     
private javax.swing.JScrollPane jScrollPane1;
private org.jdesktop.swingx.JXTreeTable jXTreeTable1;
// End of variables declaration                   

private void createTreeTable() {

    sectionSet = new TreeSet<String>();
    keySet = new TreeSet<String>();
    String value;
    String comment;
    DefaultMutableTreeNode sectionNode = null;
    DefaultMutableTreeNode keyNode = null;
    DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode(new LaodData("Root", "", "", true));

    try {
        sectionSet = IniFile().getSectionSet();
        Iterator<String> itsection = sectionSet.iterator();
        while (itsection.hasNext()) {
            sectionNode = new DefaultMutableTreeNode(new MyJxTreeTable(itsection.next(), " ", "", true));
            rootNode.add(sectionNode);
            LaodData hcd = (LaodData) sectionNode.getUserObject();
            keySet = (TreeSet<String>) getIniFile().getKeySet(hcd.getSectionKey());
            Iterator<String> itkey = keySet.iterator();
            while (itkey.hasNext()) {
                String key = itkey.next();
                value = getIniFile().getValue(hcd.getSectionKey(), key);
                comment = getIniFile().getComment(hcd.getSectionKey(), key);
                keyNode = new DefaultMutableTreeNode(new LaodData(key, value, comment, true));
                sectionNode.add(keyNode);
            }
        }
    } catch (Exception ex) {
        ex.printStackTrace();
    }

    ResourceTreeTableModel model = new ResourceTreeTableModel(rootNode);
    jXTreeTable1 = new JXTreeTable(model);
    jXTreeTable1.setRootVisible(false);
    Highlighter highlighter = HighlighterFactory.createSimpleStriping(HighlighterFactory.GENERIC_GRAY);
    jXTreeTable1.setHighlighters(highlighter);
    jXTreeTable1.setShowGrid(true, true);
    jXTreeTable1.setFillsViewportHeight(false);
    jXTreeTable1.setEditable(true);
    jScrollPane1.setViewportView(jXTreeTable1);
}

wie kann ich eine Listener implemntieren dass er alle informiert wenn eine änderung auftritt dass alle die tabelle updaten??
ich habe leider keine Idee wie das geht.
Danke für die Hilfe

Sag mal, willst du uns ärgern?
Das Banner da über dem Smilie ist für witzige Sprüche geeigntet, und nicht, um darin Quellcode zu posten.

Wenn du das nicht auf die Reihe bekommst, wie man in einem Forum richtig postet - lernen, lesen, lernen.

Bitte löschen!

edtit: Erstaunlch ist die Uhrzeit! Seit halb 12 hat noch keiner bemerkt, wie dieser Post das Allgemeinbild des Forums zerstört, obwohl seit dem mehrere Moderatoren anwesend waren - echt erstaunlich!

[QUOTE=Unregistriert]Hallo,
ich habe mal gehört dass ich das so machen kann.ich habe ein Interface für meine Inifile die Impliemtiert müss .die sieht so aus


public interface IniFileInterface{

    public String getValue(String hSection, String hKey) throws Exception;

    public Set getKeySet(String hSection) throws Exception;

    public void addSection(String newSection)  throws Exception;
    public void removeKey(String hSection, String hKey) throws FileNotFoundException, Exception;

    public void removeSection(String hSection);

    public void renameSection(String hOldSection,String hNewSection);

    public void setValue(String Section, String Key, String Value) throws Exception;

    public void addAdListener( AdListener listener ) throws Exception;

und meine View wo mein JXtreetable erzeugt wird :sieht so aus


public class MyJxTreeTable extends javax.swing.JPanel {

    Set<String> sectionSet;
    Set<String>  keySet;

    public MyJxTreeTable() {
        initComponents();
        createTreeTable();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        jXTreeTable1 = new org.jdesktop.swingx.JXTreeTable();

        jScrollPane1.setViewportView(jXTreeTable1);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE)
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 275, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(14, Short.MAX_VALUE))
        );
    }// </editor-fold>                        
    // Variables declaration - do not modify                     
    private javax.swing.JScrollPane jScrollPane1;
    private org.jdesktop.swingx.JXTreeTable jXTreeTable1;
    // End of variables declaration                   

    private void createTreeTable() {

        sectionSet = new TreeSet<String>();
        keySet = new TreeSet<String>();
        String value;
        String comment;
        DefaultMutableTreeNode sectionNode = null;
        DefaultMutableTreeNode keyNode = null;
        DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode(new LaodData("Root", "", "", true));

        try {
            sectionSet = IniFile().getSectionSet();
            Iterator<String> itsection = sectionSet.iterator();
            while (itsection.hasNext()) {
                sectionNode = new DefaultMutableTreeNode(new MyJxTreeTable(itsection.next(), " ", "", true));
                rootNode.add(sectionNode);
                LaodData hcd = (LaodData) sectionNode.getUserObject();
                keySet = (TreeSet<String>) getIniFile().getKeySet(hcd.getSectionKey());
                Iterator<String> itkey = keySet.iterator();
                while (itkey.hasNext()) {
                    String key = itkey.next();
                    value = getIniFile().getValue(hcd.getSectionKey(), key);
                    comment = getIniFile().getComment(hcd.getSectionKey(), key);
                    keyNode = new DefaultMutableTreeNode(new LaodData(key, value, comment, true));
                    sectionNode.add(keyNode);
                }
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        ResourceTreeTableModel model = new ResourceTreeTableModel(rootNode);
        jXTreeTable1 = new JXTreeTable(model);
        jXTreeTable1.setRootVisible(false);
        Highlighter highlighter = HighlighterFactory.createSimpleStriping(HighlighterFactory.GENERIC_GRAY);
        jXTreeTable1.setHighlighters(highlighter);
        jXTreeTable1.setShowGrid(true, true);
        jXTreeTable1.setFillsViewportHeight(false);
        jXTreeTable1.setEditable(true);
        jScrollPane1.setViewportView(jXTreeTable1);
    }

wie kann ich eine Listener implemntieren dass er alle informiert wenn eine änderung auftritt dass alle die tabelle updaten??
ich habe leider keine Idee wie das geht.
Danke für die Hilfe

ps :sorry war nich mit absicht.:slight_smile:

Mit diesem Code wird niemand was anfangen können. Beschreibe präzise was deine Frage ist, und poste gegebenenfalls den relevanten Code, am besten als KSKB