zwei JApplets in einem Container + GUI-Komponente

Mattata

Mitglied
Hallo!

Ich melde mich hier mal ganz kleinlaut mit einem grundlegenden Verständnisproblem, was GUI Komponenten in Verbindung mit JApplets angeht.

Wir sollen als Semesterprojekt eine Infografik erstellen, die in einem JApplet angezeigt wird. Das Ganze braucht nur in NetBeans lauffähig zu sein und soll nicht in eine Website eingebunden werden.
Meine Infografik habe ich bereits fertig programmiert, ich kann verschiedene Jahresstatistiken aus einer txt-Datei auslesen und demnach verändert sich das Aussehen der Grafik, die in dem JApplet angezeigt wird.

Nun möchte ich aber um zwei Jahre zu vergleichen zwei JApplets nebeneinander anzeigen lassen und zusätzlich die Option zum Auswählen des Jahres für jedes Applet bieten. Ich brauche also irgendetwas, wo ich beide Applets und die Auswahl-Komponente einbetten kann.

Leider habe ich auch nach mehrstündigem Lesen von verschiedenen Texten nicht verstanden, wie ich dies umsetzen kann. Ich habe schon versucht, das Applet in ein JPanel umzubauen (hab das so verstanden, dass man dadrin mittels der paintComponent-Methode ebenfalls zeichnen kann) und dieses dann in einem JFrame anzuzeigen, aber leider blieb der Frame leer.

Java:
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        JFrame f = new JFrame();
    f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    f.setSize( 800, 800 );
    f.add( new JApplet1() ); //JApplet1 ist mein fertiges Applet
    f.setVisible( true );
    }

}


Bisher habe ich was GUIs angeht nur mit dem NetBeans GUI-Builder in Verbindung mit Desktop-Applikationen gearbeitet, aber leider habe ich auch mit dessen Hilfe nicht hinbekommen, das Applet in einen Container zu packen.
Da ich zugegeben ziemlich unter Zeitdruck bin, würde ich am liebsten mein fertiges Applet nicht mehr großartig umschreiben müssen.

Ich hoffe sehr, dass jemand bereit ist, mir zumindest noch einen Denkanstoß zu geben, denn ich bin hier gerade ein wenig am Verzweifeln.

liebe Grüße,

Matta
 
Bisher habe ich was GUIs angeht nur mit dem NetBeans GUI-Builder in Verbindung mit Desktop-Applikationen gearbeitet, aber leider habe ich auch mit dessen Hilfe nicht hinbekommen, das Applet in einen Container zu packen.
Im Studium sollten GUI Builder verboten werden ;-)
Prinzipiell musst Du alles was Du vorher direkt ins JApplet gepackt hast auf ein JPanel packen, dieses kannst Du dann beliebig oft mit unterschiedlichen Daten initialisieren. Diese Instanzen kannst Du dann in einem JApplet anzeigen lassen. (kann man auch in einen JFrame packen, aber ihr sollt ja ein JApplet verwenden)

Kann mir gut vorstellen, dass das mit einem GUI Builder nicht so einfach ist, hatte allerdings noch nie mit eine solchen zu tun - zum Glück;-)
 
Vielen Dank für die schnelle Antwort!

Ich habe jetzt dennoch eine andere Lösung gefunden. Ich lasse meine Grafik einfach zweimal in demselben Applet anzeigen, also nebeneinander. Jetzt muss ich nur noch schauen, dass ich die Auswahlliste noch reinbekomme. Vielleicht lasse ich sie aber auch einfach als separates Fenster anzeigen.

lG,

Marlies
 
Es sind nun weitere Probleme aufgetaucht.
Und zwar möchte ich aus meinem Applet heraus die main-Methode eines JFrames starten. Dies klappt aber nicht, weil ich den Parameter args nicht übergeben kann, da die Variable nicht gefunden wird.

Außerdem ist mir generell nicht klar, wie ich es schaffe, Methoden neu aufzurufen, um den Inhalt des Applets zu verändern, ohne es komplett neu ausführen zu müssen. Zunächst hatte ich alles in die init()-Methode geschrieben, aber die wird ja auch nur ein einziges Mal ausgeführt.
Wenn ich alle Methodenaufrufe in die paint-Methode schreibe, was wahrscheinlich sowieso die reinste Katastrophe ist, funktionieren einige Methoden nicht (arrayoutofboundsException). Das wäre aber die einzige Möglichkeit, sie aus einer anderen Klasse heraus erneut ausführen zu können (mit repaint()).

Hat jemand noch einen Rat?
 
Es sind nun weitere Probleme aufgetaucht.
Und zwar möchte ich aus meinem Applet heraus die main-Methode eines JFrames starten. Dies klappt aber nicht, weil ich den Parameter args nicht übergeben kann, da die Variable nicht gefunden wird.
Das musst du mir mal genauer erklären was du damit meinst. Der JFrame ist ein Container auf dem du "zeichen" kannst, aber es selber besitzt keine main-Methode.

Außerdem ist mir generell nicht klar, wie ich es schaffe, Methoden neu aufzurufen, um den Inhalt des Applets zu verändern, ohne es komplett neu ausführen zu müssen.
Wenn ich es richtig verstehe willst du beim durchlaufen deines Applets, die Components verändern.

Ich würde es so angehen, dass du die eine einfache Methode schreibst z.B. rebuildGUI(); diese mit deinen änderungen füllst und ein repaint des frames durchführst.

Gruß
 
Hey, danke für die Antwort!

Ich habe jetzt soweit alles fertig, nur gibt es noch ein Problem, dessen Lösung mir einfach nicht einfallen will:
Die Variablen die das Aussehen meines Applets bestimmen, werden in externen Klassen verarbeitet. Wenn ich das Aussehen ändere, indem ich meine Methoden mit anderen Jahresdaten erneut ausführe (der User kann das Jahr in einem J-Frame auswählen), wird das Applet aber erst neu gezeichnet, wenn ich die Größe des Fensters ändere. Gibt es irgendeinen Weg, dem Applet aus einer anderen Klasse heraus zu befehlen, dass es sich neu zeichnen soll?
Mit repaint habe ich mein Glück schon versucht, nur leider ist diese Methode ja nicht static und ich müsste erst ein neues Objekt meines Applets erzeugen. Dieses kann ich dann aber wiederum nicht aus der Klasse heraus starten, weil Applets ja eigentlich dafür gedacht sind, dass sie im Browser angezeigt werden.
Vielleicht ergibt sich dieses Problem daraus, dass ein JApplet mit dem Browser interagieren soll und nicht mit java-klassen. Oder was meint ihr?
 
Vielleicht ergibt sich dieses Problem daraus, dass ein JApplet mit dem Browser interagieren soll und nicht mit java-klassen. Oder was meint ihr?
Die Frage verstehe ich nicht so ganz. Ein Applet besteht auch aus java Klassen. Das Problem ist vermutlich der Aufbau des Programms. ;-)
Du kannst auf Änderungen im Frame oder auf dessen Schliessen per Listener reagieren!?
Der Frame wird doch vom Applet erzeugt?

Mit repaint habe ich mein Glück schon versucht, nur leider ist diese Methode ja nicht static
Was würde das nutzen? Du willst ja das Neuzeichnen eines Objektes anfordern.
 
Versuch es mal anstelle von repaint ode zusätzlich mit DEIN_FRAME.validate();
dann müsste es funktionieren.

Das mit der static-Methode kann ich nicht ganz nachvollziehen. Ist denn die Klasse in der du die GUI neu erzeugst oder änderst static?

Könntest vieleicht bisl Code posten?!
 
Zuletzt bearbeitet:
Vielen Dank für Eure Tips.
Ich habe sehr viel mit statischen Variablen herumgewurstet und ziemlich unsauber programmiert.
Mein Programm besteht aus einer worker-Klasse, die alles berechnet, einer file-reader-klasse, meinem Applet und einem JFrame, wo der Nutzer die Änderungen vornehmen kann, damit das Applet seine Gestalt ändert.
Ich weiß leider nicht so genau, was ich für Code-Teile posten soll... Ich kann ja einfach mall alles posten.
Viele Methoden sind doppelt, weil mein Applet sozusagen aus zwei Bildern besteht, die unabhängig voneinander gezeichnet werden.

Ich arbeite viel mit zweidimensionalen Arrays (Matrizen), weil mein Applet am Ende zwei Parkplätze mit 10x10 Autos unterschiedlicher Farbe darstellt. Es soll eine Infografik zu den Neuzulassungen unterschiedlicher Lackfarben sein. Vielleicht hilft das, um mein Gewurtschel etwas besser zu verstehen.

Meine Worker-Klasse:
Java:
public class randomArrange {
    static int[][] matrixFarben = new int[10][10]; //erstellt 10x10-Matrix für Farben
    static int[][] matrixFarben2 = new int[10][10];
    static Point[][] matrixKoord = new Point[10][10]; //erstellt Koordinaten-Matrix
    static int[] numberOfCars; //Prozentzahl für jede Farbe
    static int[] numberOfCars2; //Prozentzahl für jede Farbe

    public static void erstelleKoordSys() {
        int x = 130;
        int y = 0;
        for (int i = 0; i <= 9; i++) {
            for (int j = 0; j <=9; j++) {
                matrixKoord[i][j] = new Point (x, y);
                x = x+57;
            }
            if (i % 2 == 0) {
            x = 130;
            y = y+78;
            }
            else { x = 130; y = y+88; }

        }
    }


    //mischt das Array nochmals durch
    private static java.util.Random rnd = new java.util.Random();
    public static void swap(int[][] x, int a, int b, int c, int d) {

        int t = x[a][b]; x[a][b] = x[c][d]; x[c][d] = t;
}
    public static int[][] shuffle(int[][] x) {
        for(int i = x.length; i > 1; i--) {
            for(int j = x.length; j>1; j--) {
                swap(x, i-1, j-1, rnd.nextInt(i), rnd.nextInt(j));
            }
        }
        return x;
}


    public static int[][] baueSortMatrix() {
        numberOfCars = fileReader.readFile();
    int index = 0;
    int anzahl = 1;
        for (int i = 0; i <= 9; i++) {
            for (int j = 0; j <=9; j++) {
                if (index <= 7) {
                    if (anzahl < numberOfCars[index]) {
                        matrixFarben[i][j] = index;
                        anzahl++;
                    } else {
                        anzahl = 0;
                        matrixFarben[i][j] = index++;
                        anzahl++;
                      }
            
                }

            }
        }
        return matrixFarben;
    }
    
    public static int[][] baueSortMatrix2() {
        numberOfCars2 = fileReader.readFile2();
    int index = 0;
    int anzahl = 1;
        for (int i = 0; i <= 9; i++) {
            for (int j = 0; j <=9; j++) {
                if (index <= 7) {
                    if (anzahl < numberOfCars2[index]) {
                        matrixFarben2[i][j] = index;
                        anzahl++;
                    } else {
                        anzahl = 0;
                        matrixFarben2[i][j] = index++;
                        anzahl++;
                      }
            
                }

            }
        }
        return matrixFarben2;
    }


    static File sourceimage = new File ("");

    public static void baueBildMatrix(int[][] farbMatrix) {
        for (int i = 0; i <= 9; i++) {
            for (int j = 0; j <=9; j++) {
                try {
                if (farbMatrix[i][j] == 0 && (i % 2 == 0)) {
                        sourceimage = new File ("blau0.gif");
                    JApplet1.matrixImage[i][j] = ImageIO.read(sourceimage);
                     } else if (farbMatrix[i][j] == 0 && (i % 2 == 1)) {
                         sourceimage = new File ("2blau0.gif");
                    JApplet1.matrixImage[i][j] = ImageIO.read(sourceimage);
                    } else if (farbMatrix[i][j] == 1 && (i % 2 == 0)) {
                        sourceimage = new File ("grau1.gif");
                    JApplet1.matrixImage[i][j] = ImageIO.read(sourceimage);
                    } else if (farbMatrix[i][j] == 1 && (i % 2 == 1)) {
                        sourceimage = new File ("2grau1.gif");
                    JApplet1.matrixImage[i][j] = ImageIO.read(sourceimage);
                    } else if (farbMatrix[i][j] == 2 && (i % 2 == 0)) {
                        sourceimage = new File ("gruen2.gif");
                    JApplet1.matrixImage[i][j] = ImageIO.read(sourceimage);
                    } else if (farbMatrix[i][j] == 2 && (i % 2 == 1)) {
                        sourceimage = new File ("2gruen2.gif");
                    JApplet1.matrixImage[i][j] = ImageIO.read(sourceimage);
                    } else if (farbMatrix[i][j] == 3 && (i % 2 == 0)) {
                        sourceimage = new File ("rot3.gif");
                    JApplet1.matrixImage[i][j] = ImageIO.read(sourceimage);
                    } else if (farbMatrix[i][j] == 3 && (i % 2 == 1)) {
                        sourceimage = new File ("2rot3.gif");
                    JApplet1.matrixImage[i][j] = ImageIO.read(sourceimage);
                    } else if (farbMatrix[i][j] == 4 && (i % 2 == 0)) {
                        sourceimage = new File ("bunt4.gif");
                    JApplet1.matrixImage[i][j] = ImageIO.read(sourceimage);
                    } else if (farbMatrix[i][j] == 4 && (i % 2 == 1)) {
                        sourceimage = new File ("2bunt4.gif");
                    JApplet1.matrixImage[i][j] = ImageIO.read(sourceimage);
                    } else if (farbMatrix[i][j] == 5 && (i % 2 == 0)) {
                        sourceimage = new File ("gelb5.gif");
                    JApplet1.matrixImage[i][j] = ImageIO.read(sourceimage);
                    } else if (farbMatrix[i][j] == 5 && (i % 2 == 1)) {
                        sourceimage = new File ("2gelb5.gif");
                    JApplet1.matrixImage[i][j] = ImageIO.read(sourceimage);
                    } else if (farbMatrix[i][j] == 6 && (i % 2 == 0)) {
                        sourceimage = new File ("weiss6.gif");
                    JApplet1.matrixImage[i][j] = ImageIO.read(sourceimage);
                    } else if (farbMatrix[i][j] == 6 && (i % 2 == 1)) {
                        sourceimage = new File ("2weiss6.gif");
                    JApplet1.matrixImage[i][j] = ImageIO.read(sourceimage);
                    } else if (farbMatrix[i][j] == 7 && (i % 2 == 0)) {
                        sourceimage = new File ("schwarz7.gif");
                    JApplet1.matrixImage[i][j] = ImageIO.read(sourceimage);
                    } else
                        sourceimage = new File ("2schwarz7.gif");
                    { JApplet1.matrixImage[i][j] = ImageIO.read(sourceimage); }
                    

                } catch (MalformedURLException ex) {
                        //Logger.getLogger(randomArrange.class.getName()).log(Level.SEVERE, null, ex);
                } catch (IOException e) { }
            }
        }
    }

    public static void baueBildMatrix2(int[][] farbMatrix) {
        for (int i = 0; i <= 9; i++) {
            for (int j = 0; j <=9; j++) {
                try {
                if (farbMatrix[i][j] == 0 && (i % 2 == 0)) {
                        sourceimage = new File ("blau0.gif");
                    JApplet1.matrixImage2[i][j] = ImageIO.read(sourceimage);
                     } else if (farbMatrix[i][j] == 0 && (i % 2 == 1)) {
                         sourceimage = new File ("2blau0.gif");
                    JApplet1.matrixImage2[i][j] = ImageIO.read(sourceimage);
                    } else if (farbMatrix[i][j] == 1 && (i % 2 == 0)) {
                        sourceimage = new File ("grau1.gif");
                    JApplet1.matrixImage2[i][j] = ImageIO.read(sourceimage);
                    } else if (farbMatrix[i][j] == 1 && (i % 2 == 1)) {
                        sourceimage = new File ("2grau1.gif");
                    JApplet1.matrixImage2[i][j] = ImageIO.read(sourceimage);
                    } else if (farbMatrix[i][j] == 2 && (i % 2 == 0)) {
                        sourceimage = new File ("gruen2.gif");
                    JApplet1.matrixImage2[i][j] = ImageIO.read(sourceimage);
                    } else if (farbMatrix[i][j] == 2 && (i % 2 == 1)) {
                        sourceimage = new File ("2gruen2.gif");
                    JApplet1.matrixImage2[i][j] = ImageIO.read(sourceimage);
                    } else if (farbMatrix[i][j] == 3 && (i % 2 == 0)) {
                        sourceimage = new File ("rot3.gif");
                    JApplet1.matrixImage2[i][j] = ImageIO.read(sourceimage);
                    } else if (farbMatrix[i][j] == 3 && (i % 2 == 1)) {
                        sourceimage = new File ("2rot3.gif");
                    JApplet1.matrixImage2[i][j] = ImageIO.read(sourceimage);
                    } else if (farbMatrix[i][j] == 4 && (i % 2 == 0)) {
                        sourceimage = new File ("bunt4.gif");
                    JApplet1.matrixImage2[i][j] = ImageIO.read(sourceimage);
                    } else if (farbMatrix[i][j] == 4 && (i % 2 == 1)) {
                        sourceimage = new File ("2bunt4.gif");
                    JApplet1.matrixImage2[i][j] = ImageIO.read(sourceimage);
                    } else if (farbMatrix[i][j] == 5 && (i % 2 == 0)) {
                        sourceimage = new File ("gelb5.gif");
                    JApplet1.matrixImage2[i][j] = ImageIO.read(sourceimage);
                    } else if (farbMatrix[i][j] == 5 && (i % 2 == 1)) {
                        sourceimage = new File ("2gelb5.gif");
                    JApplet1.matrixImage2[i][j] = ImageIO.read(sourceimage);
                    } else if (farbMatrix[i][j] == 6 && (i % 2 == 0)) {
                        sourceimage = new File ("weiss6.gif");
                    JApplet1.matrixImage2[i][j] = ImageIO.read(sourceimage);
                    } else if (farbMatrix[i][j] == 6 && (i % 2 == 1)) {
                        sourceimage = new File ("2weiss6.gif");
                    JApplet1.matrixImage2[i][j] = ImageIO.read(sourceimage);
                    } else if (farbMatrix[i][j] == 7 && (i % 2 == 0)) {
                        sourceimage = new File ("schwarz7.gif");
                    JApplet1.matrixImage2[i][j] = ImageIO.read(sourceimage);
                    } else
                        sourceimage = new File ("2schwarz7.gif");
                    { JApplet1.matrixImage2[i][j] = ImageIO.read(sourceimage); }


                } catch (MalformedURLException ex) {
                        //Logger.getLogger(randomArrange.class.getName()).log(Level.SEVERE, null, ex);
                } catch (IOException e) { }
            }
        }
    }

}

Die Methoden mit einer 2 dahinter sind für das zweite Bild in meinem JApplet.

Mein Applet:
Java:
public class JApplet1 extends JApplet {

    /**
     * Initialization method that will be called after the applet is loaded
     * into the browser.
     */

    static BufferedImage background1 ;
    static BufferedImage background2 ;
    static Image [][] matrixImage = new Image[10][10]; // enthält Bilder der Autos
    static Image [][] matrixImage2 = new Image[10][10]; // enthält Bilder der Autos

    public void init() {
        String[] args = new String[0];
        AuswahlGUI.main(args);
        
        this.setSize(1500, 830);
        randomArrange.erstelleKoordSys();
        randomArrange.baueBildMatrix(randomArrange.shuffle(randomArrange.baueSortMatrix()));
        randomArrange.baueBildMatrix2(randomArrange.shuffle(randomArrange.baueSortMatrix2()));
        try {
        if ((AuswahlGUI.jComboBox1.getSelectedItem().toString().equals("1980")) ||
                (AuswahlGUI.jComboBox1.getSelectedItem().toString().equals("1985"))) {
            JApplet1.background1 = ImageIO.read(this.getClass().getResource("boden8085.jpg")); }
        else if ((AuswahlGUI.jComboBox1.getSelectedItem().toString().equals("1990")) ||
                (AuswahlGUI.jComboBox1.getSelectedItem().toString().equals("2008"))) {
            JApplet1.background1 = ImageIO.read(this.getClass().getResource("boden902008.jpg")); }
        else { JApplet1.background1 = ImageIO.read(this.getClass().getResource("boden2005.jpg")); }
        } catch (MalformedURLException ex) {
            Logger.getLogger(JApplet1.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException e) { }

        try {
        if ((AuswahlGUI.jComboBox2.getSelectedItem().toString().equals("1980")) ||
                AuswahlGUI.jComboBox2.getSelectedItem().toString().equals("1985")) {
            background2 = ImageIO.read(this.getClass().getResource("boden8085.jpg")); }
        else if ((AuswahlGUI.jComboBox2.getSelectedItem().toString().equals("1990")) ||
                AuswahlGUI.jComboBox2.getSelectedItem().toString().equals("2008")) {
            background2 = ImageIO.read(this.getClass().getResource("boden902008.jpg")); }
        else { background2 = ImageIO.read(this.getClass().getResource("boden2005.jpg")); }
        } catch (MalformedURLException ex) {
            Logger.getLogger(JApplet1.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException e) { }
    }

   

    public void paint(Graphics g){


    g.drawImage(background1, 0, 0, this);
            for (int i = 0; i<=9; i++) {
            for (int j = 0; j<=9; j++) {
                g.drawImage(matrixImage[i][j], (int)randomArrange.matrixKoord[i][j].getX(),
                        (int)randomArrange.matrixKoord[i][j].getY(), this);
                }
            }
        g.translate(750, 0);

        g.drawImage(background2, 0, 0, this);
        for (int i = 0; i<=9; i++) {
            for (int j = 0; j<=9; j++) {
                g.drawImage(matrixImage2[i][j], (int)randomArrange.matrixKoord[i][j].getX(),
                        (int)randomArrange.matrixKoord[i][j].getY(), this);
                }
            }

        }
}

Der File-Reader ist eher uninteressant... er liest die Prozentzahlen aus verschiedenen .txt-Dateien aus.

Naja und mein JFrame wird eben aus dem Applet heraus aufgerufen.

Ich habe keine Ahnung, ob man da jetzt durchblickt... und schimpft bitte nicht mit mir, ich weiß intuitiv, dass ich viel Mist gebaut habe. Verbesserungsvorschläge nehm ich natürlich trotzdem gern an.
 
Also so weiß ich wirklich nicht was du mit deinem Programm anstellen willst, aber darum geht es ja nicht. Mich wundert es nur, dass du Methode wie z.B. swap implementierst aber garnicht nutzt.

Was ist AuswahlGUI?

z.Z zeichnest du einfach auf dein Applet-Frame und das nur zur initialisierungszeitraum des Applets.
Wo ist denn der Anwender gefragt etwas zu tun? Wenn ich wie ich es gesehen hab auch in der init-Methode geschrieben ist, dann sieht das schlecht aus. Denn die init-Methode wird nur einmal beim ausführen des Applets auferufen.
 
Zuletzt bearbeitet:
Naja in der AUswahlGUI kann der User festlegen, welche Jahresstatistik das JApplet anzeigen soll, bzw welche txt-File eingelesen wird und ob die Autos farblich geordnet nebeneinander stehen sollen, oder zufällig angeordnet, wie auf einem Parkplatz. Danach richtet sich dann, wie das Array mit den Farben aufgebaut wird.
Hab mal zwei Screenshots dazu gepackt, zum besseres Verständnis.
Das was vorher in der init() methode stand, habe ich jetzt in die paint() verlagert.
Hmmm stimmt, swap nutze ich in der Tat nicht... wie dumm, dass ich sie nicht schon entfernt habe ;/

Ich habe einfach noch nicht verstanden, wie ich das JApplet neu zeichnen lasse, mit den neuen Werten, die sich durch den geänderten FIle-Input ergeben.
Wenn ich das JApplet mit der Maus größer oder kleiner ziehe, dann erst wird es aktualisiert.

Oder ist das anders mit meiner Programmstruktur einfach nicht möglich? Wenn ja, wie hätte ich es anders machen müssen?

lG
 

Anhänge

  • unsortiert.jpg
    unsortiert.jpg
    85,8 KB · Aufrufe: 28
  • sortiert.jpg
    sortiert.jpg
    82,6 KB · Aufrufe: 31
Moin,

also wenn ich das richtig verstehe, dann überschreibst du matrixImage[][] sowie die die koordinaten mit den uswereingaben und willst die dann neu darstellen!?
Dann sollte es an der richtigen stelle mit repaint() funktionieren.
um das Mal strukturiert aufzuschreiben:

Init<==Ausgangsbildschirm(alle Daten die zum anfang gezeichnet werden sollen).
irgendEineMethode<==Usereingaben(GUI für die eingaben, hier sollte dann nach den eingaben auch das repaint() aufgerufen werden).

sollte das repaint nicht funktionieren, kannst du auch an deiner stelle die Methode update(Graphics) nutzen. Mit ihr wird der komplette Appletbereich gelöscht und neu gezeichnet.

Zudem, weil dich das anscheinend wundert, dass wenn du das Fenster deiner Browsers änderst, dein Applet aufeinmal das richtige Zeichnet, liegt daran, dass die repaint-Methoe aufgerufen wird.
 
Zuletzt bearbeitet:
Naja, Dein Code hat ja nicht gerade viel mit Objekt orientierter Programmierung zu tun! Lernt man das heutzutage so? ;-)
Programmiere und verwende Objekte. Ausserdem kann man Bilder beliebig oft zeichen lassen und muss nicht für jede Referenz die man benötigt dieses erneut von der Festplatte laden und in einer neuen Instanz vorhalten. Du erzeugst für die zwei Darstellungen 2x100 Images obwohl Du eigentlich nur 16 verschiedene Bilder verwendest und eigentlich nur 8 bräuchstest.

Hier mal mein Vorschlag:
StatisticPanel setzt sich aus CarParkPanel (Darstellung der "Autos" auf dem Parkplatz) und ControllPanel (enthält ComboBox und CheckBox zur Steuerung der Ansicht) zusammen. Somit hat man eine geschlossene Einheit, die man beliebig oft Instanzieren und im Applet oder sonst wo wiederverwenden kann.
CarParkPanel ist wie erwähnt für die Darstellung zuständig und verwendet CarParkModel zur Datenverwaltung.
Die Klassen ImageFactory und RegistrationFactory verwende ich nur damit ohne "echte" Bilder und Datein auskomme. Damit werden einfach nur Dummy- Bilder und Werte erzeugt und man kann den Code einfach kopieren, komplilieren und ausführen.
Grundsätzlich konnte man diese aber auch verwenden und die Bilder und Zulassungsdaten von der Festplatte einzulesen und dem Programm zur Verfügung zu stellen.
Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Polygon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.util.ArrayList;

import javax.swing.BorderFactory;
import javax.swing.JApplet;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JPanel;


public class RegistrationApplet  extends JApplet {
	
	public void start() {this.setSize(500, 450);}
	
	public void init() {
		this.setLayout(new GridLayout(1, 3, 5, 5));
		this.add(new StatisticPanel());
		this.add(new StatisticPanel());
		this.add(new StatisticPanel());
	}
	
	public void stop(){}
	public void destroy(){}
	
	class StatisticPanel extends JPanel implements ActionListener {
		private CarParkPanel parkPanel;
		private CarParkModel model;
		private ControllPanel controllPanel;
		
		public StatisticPanel() {
			model = new CarParkModel(RegistrationFactory.getMatrix(0));
			parkPanel = new CarParkPanel(model);
			controllPanel = new ControllPanel(this);
			
			this.setLayout(new BorderLayout());
			this.add(parkPanel, BorderLayout.CENTER);
			this.add(controllPanel, BorderLayout.SOUTH);
		}
		
		public void actionPerformed(ActionEvent e) {
			model.updateModel(RegistrationFactory.getMatrix(controllPanel.getYear()), !controllPanel.showSorted());
			model.fireModelUpdated();
		}
		
		class ControllPanel extends JPanel {
			private JComboBox combo;
			private JCheckBox check;
			
			public ControllPanel(ActionListener listener) {
				this.setLayout(new GridLayout(2, 1));
				combo = new JComboBox(new String[] {"2008", "2009", "2010"});
				check = new JCheckBox("sortiert", true);
				combo.addActionListener(listener);
				check.addActionListener(listener);
				this.add(combo);
				this.add(check);
			}
			
			public int getYear() {
				return combo.getSelectedIndex();
			}
			
			public boolean showSorted() {
				return check.isSelected();
			}
		}
	}
	
	class CarParkPanel extends JPanel implements ModelListener {
		private CarParkModel model;
		
		public CarParkPanel(CarParkModel model) {
			this.model = model;
			this.model.addModelListener(this);
			this.setBorder(BorderFactory.createLineBorder(Color.BLACK, 3));
		}

		public void dataUpdated() {
			this.repaint();
		}
		
		public void paintComponent(Graphics g) {
			super.paintComponent(g);
			int gap = 20;
			int rows = model.getRowsCount();
			int columns = model.getColumnsCount();
			int wCar = (this.getWidth()-20)/columns;
			int hCar = (this.getHeight()-20-(rows/2-1)*gap)/rows;
			
			Graphics gP = g.create();
			gP.translate(10, 10);
			for (int r=0; r<rows; r++) {
				for (int c=0; c<columns; c++) {
					Graphics gCar = gP.create();
					gCar.translate(c*wCar, 0);
					paintCar(r, wCar, hCar, model.getValueAt(r, c), gCar);
				}
				gP.translate(0, hCar);
				if (r%2==1)
					gP.translate(0, gap);
			}
			gP.dispose();
		}
		
		private double alpha = Math.toRadians(180);
		private void paintCar(int row, int w, int h, int value, Graphics g) {
			Graphics2D g2 = (Graphics2D)g;
			if (row%2==1) {
				g2.translate(w, h);
				g2.rotate(alpha);
			}
			g2.drawImage(ImageFactory.getImage(value), 0, 0, w, h, null);
			g2.drawRect(0, 0, w, h);
			g2.dispose();
		}
	}
	
	class CarParkModel {
		private int[][] matrix;
		private ArrayList<ModelListener> listenerList;
		
		public CarParkModel(int[][] matrix) {
			this.updateModel(matrix, false);
			listenerList = new ArrayList<ModelListener>();
		}
		
		public void addModelListener(ModelListener listener){
			this.listenerList.add(listener);
		}
		
		public void updateModel(int[][] matrix, boolean shuffle) {
			this.matrix = new int[matrix.length][matrix[0].length];
			for (int i=0; i<matrix.length; i++)
				System.arraycopy(matrix[i], 0, this.matrix[i], 0, matrix[i].length);
			if (shuffle)
				this.shuffle();
		}
		
		public int getRowsCount() {
			return matrix.length;
		}
		
		public int getColumnsCount() {
			return matrix[0].length;
		}
		
		
		public int getValueAt(int p1, int p2) {
			return matrix[p1][p2];
		}
		
		public void shuffle() {
			for (int i=0; i<1000; i++) {
				int o1 = (int)(Math.random()*matrix.length);
				int o2 = (int)(Math.random()*matrix[0].length);
				int n1 = (int)(Math.random()*matrix.length);
				int n2 = (int)(Math.random()*matrix[0].length);
				int tmp = matrix[n1][n2];
				matrix[n1][n2] = matrix[o1][o2];
				matrix[o1][o2] = tmp;
			}
		}
		
		public void fireModelUpdated() {
			for (ModelListener listener : listenerList)
				listener.dataUpdated();
		}
	}
	
	interface ModelListener {
		public void dataUpdated();
	}
}

class ImageFactory {
	private static Image[] image= new Image[10];
	private static Color[] color = new Color[] {Color.BLACK, Color.MAGENTA, Color.DARK_GRAY, Color.GREEN, Color.RED,
												Color.BLUE, Color.ORANGE};
	private static Polygon polygon = new Polygon(new int[]{10, 90, 50}, new int[]{10, 10, 190}, 3); 
	
	private static Image createImage(int index) {
		BufferedImage img = new BufferedImage(100, 200, BufferedImage.TYPE_INT_RGB);
		Graphics g = img.createGraphics();
		g.setColor(Color.WHITE);
		g.fillRect(0, 0, 100, 200);
		g.setColor(color[index]);
		g.fillPolygon(polygon);
		g.dispose();
		return img;
	}
	
	public static Image getImage(int index) {
		if (image[index]==null)
			image[index] = ImageFactory.createImage(index);
		return image[index];
	}
}

class RegistrationFactory {
	private static int[][][] list;
	static {
		list = new int[3][10][10];
		for (int m=0; m<list.length; m++) {
			int count = 0;
			int typ = 0;

			for (; typ<7; typ++) {
				int typCount = 5 + (int)(Math.random()*20);
				for (int i=0; i<typCount && count<100; i++) {
					list [m][count/10][count%10] = typ;
					count++;
				}
			}
			typ--;
			while(count<100) {
				list [m][count/10][count%10] = typ;
				count++;
			}
		}
	}
	
	public static int[][] getMatrix(int index) {
		return list[index];
	}
}
ACHTUNG: Der Code ist nur mal schnell runtergeschrieben und soll zeigen, wie man sowas umsetzen könnte. Einige Fehlermöglichkeiten werden nicht abgefangen.
 

Zurück
Oben