Announcement

Collapse
No announcement yet.

Eigene Pakete / kleines Problem mit externen Klassen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Eigene Pakete / kleines Problem mit externen Klassen

    Hallo und schon wieder ich...
    bei meiner zur Zeit exzessiven Arbeit mit Java sind folgende Fragen bzw. Probleme aufgetaucht:

    1. Ich habe inzwischen für ein Projekt ein Set von Klassen gebastelt, die sich für ein Paket ala java.awt.* o.ä. anbieten. Kann mir jemand sagen wie ich ein solches Paket selbst erstellen kann, in welches verzeichnis das dann gehört, und so weiter ???

    2. Ein etwas heikleres und mir unverständliches Problem: Ich habe für meine 'MDI-Anwendung' jeweils eine Klasse für den MainFrame und den ChildFrame gebastelt. Diese habe ich der Übersichtlichkeit halber in eigene .java-Dateien ausgelagert. Nun möchte ich z.B. in der MainFrame-Klasse die Größe des Fensters, die Hintergrundfarbe und die Sichtbarkeit (setVisible(true)) im Konstruktor voreinstellen.
    Nun ist aber folgendes passiert: Wenn ich im Hauptprogramm eine instanz der MainFrame-Klasse erzeuge wird diese nicht angezeigt bis ich dort explizit setVisible(true) aufrufe. Wenn ich dies tue erscheint zwar das Fenster, aber nichtin de korrekten Größe etc. Also meine Frage: Wenn ich in anderen Programmiersprachen z.B. für eine Windowklasse im Konstruktor Voreinstellungen für Größe und Erscheinungsbild treffe, werden diese berücksichtigt. Ist das bei Java anders ???

    Vielen Dank für jede Hilfe

    Jürgen

  • #2
    Hallo Jürgen,

    Zu 1:
    Die Klassen die du in ein Package haben willst müssen ganz oben
    das Schlüsselwort package stehen haben:

    package alpha.beta.gamma

    Deine Klassen findest du dann in gamma wieder. Auf der Platte gibt es dazu analog einen Ordner ...\alpha\beta\gamma.

    Zu2:
    rufe vorher MainFrame.pack() und dann MainFrame.setVisible(true) auf.

    Gruss

    Thomas Tasio

    Comment


    • #3
      Hi Thomas,
      das wird ja langsam unheimlich... Du gibst mir ja fast schon eine Java-Schulung. Wenn ich mal nach Bayern komme kann ich ja die Schulungskosten in Form von Gerstensaft bezahlen ;-)
      So, nun frage ich mal ganz blöd einiges zu Deinen Anregungen:

      zu 1. ich habe mehrere Klassen in einer .java-Datei... geht das mit den Paketen so überhaupt oder braucht jede Klasse eine eigene .java-Datei. Und was heisst das alpha.beta.gamma ???

      zu 2. wo rufe ich die von Dir erwähnten Statements auf: Im Konstruktor der MainFrame-Klasse, oder wo ???

      Ich hoffe, die Fragen sind nicht zu blöde

      Jürge

      Comment


      • #4
        Hallo Jürgen,

        Zu 1:

        Jede Klasse braucht eine eigene Java Datei. Eine Klasse auf mehrere Dateien
        zu verteilen wie in C (glaube ich) geht nicht. Wenn allerdings eine Klasse eine
        andere Klasse besitzt - man nennt das innere Klasse - dann können in einer *.java
        Datei auch zwei und mehr Klassen enthalten sein. Das entscheidende ist, dass
        die Klasse die die innere(n) Klasse(n) durch ihre geschweiften Klammern einschliesst
        diejenige ist die der Datei den Namen gibt.

        Bei den *.class Files (also dem kompilierten Quelltext)schaut's ganz anders aus:

        Im oben geschilderten Fall - Klasse hat eine innere Klasse - findest du auf der Platte
        3 *.class Files:
        KlassenName.class
        KlassenName$InnereKlasse.class
        KlassenName$$1.class

        Weiter:
        Wozu packages gut sind weisst du ja von Delphi. Die von mir gewählten Namen
        waren willkürlich. Entscheidend ist dass sie der Punktnotation genügen müssen, und dass
        das Schlüsselwort package AM ANFANG einer Klassendefinition steht. Nachfolgend ein Minimalbeispiel
        welches all dieses nochmal praktisch demonstrieren soll.
        Danach zu Frage 2:

        package de.tasior.examples; <br>
        <br>
        public class InnerClassDemo <br>
        { <br>
        private InnerClass innerClass = new InnerClass(); <br>
        <br>
        public static void main(String[] args) <br>
        { <br>
        InnerClassDemo innerClassDemo = new InnerClassDemo(); <br>
        System.out.println(innerClassDemo.toString()); <br>
        } <br>
        <br>
        public String toString() <br>
        { <br>
        return "Message from class InnerClassDemo and the inner class: "+innerClass.toString();<br>
        } <br>
        <br>
        private class InnerClass//Innere Klasse <br>
        { <br>
        public String toString() <br>
        { <br>
        return "Hello Jürgen, i am the inner class"; <br>
        } <br>
        }//Ende InnerClass <br>
        }//Ende InnerClassDemo <br>

        Wenn du das Beispiel kompiliert hast, dann schau dir mal die erzeugte Ordnerstruktur an:
        Ein exaktes Abbild der package Anweisung (abzüglich der Ordner deines Projektes).
        Mithilfe der Anweisung import de.tasior.examples.*; könntest du die Klasse InnerClassDemo
        sowie weitere in diesem package befindlichen Klassen (wegen dem .*) in einem anderen Projekt
        beispielsweise einbinden und benutzen.

        Zu Frage 2:
        Aufruf frühestens nach allen Initialisierungen im Frame, oder wenn du den Frame instanziert hast.
        Experimentiere mal mit pack() und validate(), auf alle Fälle zum Schluss setVisible(true).

        Gruss

        Thomas Tasio

        Comment


        • #5
          Hi Thomas,
          ich glaube Du solltest Dir mal die Source ansehen. Der Einfachheit halber schlage ich mal einen Austausch der E-Mailadressen vor. Also ich gebe Dir mal eine von meinen 'Tarnadressen' bei einem Freemailer, weil ich die Erfahrung gemacht habe, daß das Posten von Mailadressen in Foren allgemein zu Junkmail in riesigen Mengen führt, und das wollen wir ja beide nicht ;-)

          Also mail mir doch bitte einfach mal Deine Adresse an [email protected]. Als Antwort bekommst Du meine 'richtige' Adresse und einen alles sagenden Auszug aus meinen Sourcen. Mein Problem ist nämlich auch mit Deinen Tips nicht zu beheben.

          By the way: Mit 'Das Fenster erscheint nicht in der korrekten Größe meinte ich NICHT, daß es in irgendeiner Größe erscheint. Es ist so, daß ich im Konstruktor der MainFrame-Klasse folgendes stehen habe:

          setTitle("Irgendein Titel");
          setSize(640,480);
          setVisible(true);
          addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent e){System.exit(0)}});

          // Desktop fuer MDI-Anwendung anpassen

          desktop = new JDesktopPane(); // DesktopPane erstellen
          desktop.setDesktopManager(new DefaultDesktopManager()); // Standard DesktopManager
          setContentPane(desktop); // ContentPane ersetzen

          // Menu fuer Mainframe erstellen

          mb = new JMenuBar(); // Menuleiste erstellen

          fileMenu = new JMenu("Datei"); // Datei-Menu erstellen

          // Items für Dateimenu erstellen und in Menu einbinden

          fileNewItem = new JMenuItem("Neu"); // Neu Item erstellen
          fileMenu.add(fileNewItem); // und einbinden
          fileNewItem.addActionListener(this); // ActionListener zuordnen

          fileExitItem = new JMenuItem("Beenden"); // Beenden-Item erstellen
          fileMenu.add(fileExitItem); // und einbinden
          fileExitItem.addActionListener(this); // ActionListener zuordnen

          mb.add(fileMenu); // Dateimenu in Menuleiste einbinden

          setJMenuBar(mb); // Menuleiste in Fenster einbinden
          };

          So, wenn ich den MainFrame in der Applikation instantiiere, bekomme ich vom Fenster nichts zu sehen, bis ich DORT (Main-Funktion) setVisible(true) aufrufe. wenn ich dies tue erscheint der MainFrame nicht etwa wie erwartet und von anderen Programmiersprachen gewohnt in richtiger Größe und mit den Initialisierungen aus o.g. Konstruktor sondern nur die Titelzeile.
          Warum kann ich in Java offensichtlich den Konstruktor der Mainframe-Klasse nicht für Initialisierungen benutzen ?

          Ich flipp' noch aus

          Gruß

          Jürge

          Comment


          • #6
            Hallo Thomas,

            kleine Korrektur zu deinen (sehr guten) Ausführungen: Es ist nicht richtig, dass jede Klasse eine eigene Java Datei braucht. Man kann auch ohne innere Klassen mehrere Klassen in eine Datei packen. Zu beachten ist nur, dass lediglich eine Klasse innerhalb einer Datei 'public' sein darf (geht auch in Packages). Auf die anderen Klassen kann man also nicht von außen zugreifen.

            @Jürgen,

            falls es sich noch nicht erledigt haben sollte: ich habe auch mal ein Swing MDI-Programm erstellt, bei dem die Initialisierungen im Kontruktor sind. Bei Interesse kann ich es dir zuschicken.

            Gruß,
            Mari

            Comment


            • #7
              Hi Mario,
              aber immer... reich rüber die Info ! Informationen sind mir immer willkommen. E-Mailadresse findest Du oben.

              Danke

              Jürge

              Comment


              • #8
                Hallo Jürgen,

                die Mail ist unterwegs...

                Gruß,
                Mari

                Comment

                Working...
                X