Ich habe eine Antwort zum Javaproblem - wer hat die passende Frage :-)

melmager

Erfahrenes Mitglied
Ich beschäftige mich seit ca 2 Jahren ernsthaft mit Java und bin seit einem Jahr an einem Projekt dran - denn ich lerne besser wenn ich eine Aufgabe habe :)
Hier werde ich mal meine intressanten Aha Erlebnisse kundtun die meist zur Lösung Stunden wenn nicht sogar Tage bei mir gebraucht haben.
Eventuell steht ja der ein oder andre vor dem gleichen Problem.

Anfangen möchte ich mit dem NetBeans effect (der IDE mit der ich arbeite)

Mit NetBeans kann man recht schnell und einfache eine Swingoberfläche zusammen basteln, hat aber leider die dumme Eigenschaft das in der Defaulteinstellung swingclassen die man extenden will nicht nutzbar sind.

Wenn ich sowas mache ist die zusätzliche Function in der normalen Einstellung nicht aufrufbar:
Code:
public class Metronom extends JPanel {
  public void wakeup() {}
}

das ganze liegt daran das ,wenn man über die Design Ansicht und dort unter "Code Customizer" die IDE in der default einstellung

Code:
//zeile Init Code
jPanel1 = new javax.swing.JPanel();
// unten die Zeile Variable Declaration Code
private javax.swing.JPanel jPanel1;

erzeugt.
Den Code für die Variablen Declaration kann mann überhaupt nicht ändern und die Zeilen im Init Code nur hinter dem Gleichheitszeichen ...

Den Weg um aus der Nummer rauszukommen:

die Einstellung für die Variable auf "local" setzen , dann verschwindet die unbrauchbare Variablen Declaration.

Code:
// neue Zeile im Intit Code teil - pre-creation
ePanelMetro = new Metronom();
// die Zeile mit New auf Custom stellen und so abändern: 
//vorher:  javax.swing.JPanel jPanel1 = new javax.swing.JPanel();
javax.swing.JPanel jPanel1 = ePanelMetro;

In der Classe ProjektnameView.java am ende die Zeile einfügen:
Code:
   // End of variables declaration   (das ist die Letze Zeile die nicht editierbar ist ...)                
    
    private Metronom ePanelMetro ;  //neu

und somit kann die neue Function über "ePanelMetro.wakeup();" angesprochen werden

das Panel hat somit 2 Namen einmal die Defaultversion mit jPanel1 und die mit der wir arbeiten: ePanelMetro
 
Zuletzt bearbeitet:
aber, wenn du sowieso weißt, dass das jPanel1 ein Metronom ist, warum legst du es in deiner Klasse nicht gleich als Metronom an anstatt als JPanel? Sonst musst du bei der Benutzung von jPanel1 jedesmal einen Cast auf Metronom durchführen, wenn du Methoden wie wakeup() benutzt.

Java:
if (jPanel1 instanceof Metronom){ // zur Sicherheit
     ((Metronom)jPanel1).wakeup();
} else {
// vermutlich diese Exception
     throw new IllegalStateException("no Metronom found");
}

Gruß
Peter
 
Zuletzt bearbeitet:
Nun das Problem ist ein NetBeans Problem ... beim beim Erstellen der swingoberfläche können einige erstellte Codezeilen nicht oder nur teilweise editiert werden (kein Ahnung warum es so ist)

und stimmt, wenn man mit jPanel1 arbeitet muss ein Cast eingesetzt werden .... und so habe ich auch lange gearbeitet bis mir die oben gezeigte Version eingefallen ist.

Da NetBeans alles default mässig mit jPanel anlegt mache ich es halt mit einem "e" vorne dran statt dem "j" um auch im Code klarzustellen das es eine erweiterte Classe ist.
 
ich empfehle dir, die GUI von Hand zu erstellen, allein schon wegen der Übung. Natürlich innerhalb der IDE. Das Erstellen dauert dann halt etwas länger, aber man weiß genau, was passiert. Es besteht kein Zwang den GUI-Builder zu benutzen. Wenn du irgendwann Übung darin hast, die GUI selber zu programmieren, merkst du den Zeitvorteil durch GUI-Builder kaum mehr. Zumal wesentliche Teile der Applikation, wie z.B. die ActionListener sowieso selber geschrieben werden müssen.

Gruß
Peter
 
Ich rate auch dazu die GUI selber zu schreiben, und finde, dass dies auch mit ein bisschen Übung nachher schneller von der Hand geht als ein GUI-Editor.
 
Zipinhalt als jTree

Nach mehmaligen Anläufen hier eine Function die aus den Inhalt eines Zipfiles ein Tree macht.
Ich musste leider dazu die auflistung der enthaltenen Files sortieren - was bedeutete das ich auch aus einem Enum ein Array machen durfte.
Und ich lasse leere Verzeichnissse weg , da JTree leider nur ein Eintrag als Verzeichnis anzeigt, wenn der entsprechende Node im Tree auch ein Kind hat.

Code:
DefaultMutableTreeNode zipToTree(File infile) {
        String path[];
        DefaultMutableTreeNode node, cnode, rnode = null;
        try {
            ZipFile zipfile = new ZipFile(infile);
            Enumeration zipEntries = zipfile.entries();
            ArrayList<String> zipintern = new ArrayList<String>();
            rnode = new DefaultMutableTreeNode(zipfile.getName());
            while (zipEntries.hasMoreElements()) {
                String zeile = zipEntries.nextElement().toString();
                if (!zeile.endsWith("/")) {
                    zipintern.add(zeile);
                }
            }
            Collections.sort(zipintern);
            for (int lo = 0; lo < zipintern.size(); lo++) {
                //System.out.println(zipintern.get(lo));
                path = zipintern.get(lo).split("/");
                node = rnode;
                for (int pos = 0; pos < path.length; pos++) {
                    if (node.getChildCount() > 0) {
                        cnode = (DefaultMutableTreeNode) node.getLastChild();
                        if (!path[pos].equals(cnode.toString())) {
                            cnode = new DefaultMutableTreeNode(path[pos]);
                            node.add(cnode);
                        }
                        node = cnode;
                    } else {
                        cnode = new DefaultMutableTreeNode(path[pos]);
                        node.add(cnode);
                        node = cnode;
                    }
                }
            }
            zipfile.close();
        } catch (Exception ex) {
            System.out.println(ex);// fehler beim öffnen
        }
        return rnode;
    }
Code:
   jTreeZip.setModel(new DefaultTreeModel(zipToTree(file) ));
wer es gebrauchen kann bitte :)
 
Wenn man Java im Zusammenhang mit XML hört kommt bei der Aufgabenstellung XML erstellen immer als Antwort "DOM"
Ich möchte mal eine Lanze für XOM brechen das ist so einfach das ich das sogar verstehe :)
siehe http://www.xom.nu

Was sich beim XML erstellen mit XOM als zusätzliche Möglichkeit aufdrängt ist die Java Stack Class. Damit kann man noch einfacher beliebig verschachtelte XML Dateien erstellen.

mit addElement wird ein XML Tag erstellt und einweitereres addElemente bewirkt ein Sub XMLTag.
mit closeElement werden dann die offenen XML Tags geschlossen

Code:
class StackXml {
        private Stack<Element> stack = new Stack<Element>();
        private Element ele;

        void addElement(String name) {
            ele = new Element(name);
            stack.add(ele);
        }

        void addElement(String liste[]) {
            for (int lo=0 ; lo < liste.length; lo++) {
                addElement(liste[lo]);
            }
        }

        void addAttri(String name, String wert) {
            ele.addAttribute(new Attribute(name,wert));
        }

        void addText(String text) {
            ele.appendChild(text);
        }

        void closeElement() {
            Element cl = stack.pop();
            if (stack.empty()) {
                ele = cl;
                return;
            }
            ele = stack.peek();
            ele.appendChild(cl);
        }

        void closeElement(int level) {
            do {
                closeElement();
                level--;
            } while (level > 0);
        }

        Document getDocument() {
            while (!stack.empty()) {
                closeElement();    
            }
            Document doc = new Document(ele);
            return doc;
       }
    }

Hier mal ein Auszug aus meinem Projekt:

Code:
 StackXml store = new StackXml();

//erstelle ein Element mit Atrribute
 store.addElement("score-partwise");
 store.addAttri("version", "3.0");

//erstelle mehrere Element nacheinander (verschachtelt)
store.addElement(new String[]{"identification","creator"});
// füge dem letzten Element Text Hinzu
store.addText("demo");
// schliesse die beiden Elemente
store.closeElement(2);

damit kann man einfach, schnell und beliebig verschachtelte XML Documente erstellen

zum abspeichern habe ich die Function :

Code:
void savexmlfile(File xout) {

         Document outdoc = store.getDocument();
         try {
             OutputStream output = new FileOutputStream(xout);
           Serializer serializer = new Serializer(output, "ISO-8859-1");
           serializer.setIndent(4);
           serializer.setMaxLength(64);
           serializer.write(outdoc);
         }
         catch (Exception ex) {
            System.err.println(ex);
         }
     }

damit wird ein sauberer XML Text erstellt, mit einrückungen für besserer Lesbarkeit

das kommt bei dem oben geposteten code bei raus:
Code:
<score-partwise version="3.0">
  <identification>
    <creator>demo</creator>
  </identification>
</score-partwise>


mein Credo ist: komplexe XML Dateien erstellen ? Easy :)
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück