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
 

Michael...

Top Contributor
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;-)
 

Mattata

Mitglied
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
 

Mattata

Mitglied
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?
 

Sued_Faust

Bekanntes Mitglied
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ß
 

Mattata

Mitglied
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?
 

Michael...

Top Contributor
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.
 

Sued_Faust

Bekanntes Mitglied
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:

Mattata

Mitglied
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.
 

Sued_Faust

Bekanntes Mitglied
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:

Mattata

Mitglied
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

Sued_Faust

Bekanntes Mitglied
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:

Michael...

Top Contributor
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.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Torschti Eingabe von Dezimalzahlen (bis zu zwei Kommastellen) Java Basics - Anfänger-Themen 11
A 1 Leerzeichen durch zwei Leerzeichen ersetzen Java Basics - Anfänger-Themen 4
K Warum wird mir hier nach dem ersten Durchlauf zwei mal "welchen Datentyp wollen sie übergeben?" ausgegeben ? Java Basics - Anfänger-Themen 1
sasnitzer java augensumme von zwei würfeln ist 1 Java Basics - Anfänger-Themen 8
krgewb Double mit zwei Nachkommastellen Java Basics - Anfänger-Themen 2
Distanz zwischen zwei Zeichenfolgen in einem String bestimmen Java Basics - Anfänger-Themen 5
D Größtes Palindrom Produkt aus zwei dreistelligen Zahlen Java Basics - Anfänger-Themen 60
berserkerdq2 Habe zwei exceptions, welche ist ein Kommunikationsfehler und welche ein Ausgabefehler? Java Basics - Anfänger-Themen 4
berserkerdq2 Zwei Klassen Erben von der Klasse A, die eine Klasse kann ich an Methoden übergeben, die als Parameter A haben, die andere nicht? Java Basics - Anfänger-Themen 3
B Erste Schritte Bisektion mit zwei Funktionen? Java Basics - Anfänger-Themen 1
G zwei Instanzen einer Klasse Java Basics - Anfänger-Themen 29
A Java-XSSFBook: zwei Sheets mergen Java Basics - Anfänger-Themen 5
C Zwei Arrays addieren und ausgeben Java Basics - Anfänger-Themen 3
J Speichern von zwei Variablen durch Auslesen aus einem Numberfield Java Basics - Anfänger-Themen 2
D Zwei verschiedene Intellij Projekte, wie benutze ich wechselseitig objekte Java Basics - Anfänger-Themen 8
berserkerdq2 Wie würde man einen regulären Ausdruck in Java schreiben, der prüft, dass zwei bestimtme Zahlen nicht nebeneinadner sind? Java Basics - Anfänger-Themen 3
K mit <<1 kann man mal 2 machen, mit >>2 geteilt durch zwei und was bewirkt <<<1 und >>>1? Java Basics - Anfänger-Themen 5
Dorfschmied Kartesisches Produkt von zwei Liste mit Hashmaps<String,String> erstellen Java Basics - Anfänger-Themen 4
F Abstand zwischen zwei Objekten berechnen wie? Java Basics - Anfänger-Themen 1
M Wie kann ich ein Array in zwei Hälften aufteilen? Java Basics - Anfänger-Themen 12
S Längster Pfad zwischen zwei Vertices in einem Graph Java Basics - Anfänger-Themen 3
S Aktuell beste Methode um zwei Bilder zu vergleichen..? Java Basics - Anfänger-Themen 1
A Zwei XML-Dateien Mergen Java Basics - Anfänger-Themen 14
U Erste Schritte nextGaussian zwischen zwei Werten Java Basics - Anfänger-Themen 19
S Multiplikation von zwei Labels Java Basics - Anfänger-Themen 7
U zwei 2D arrays auf gleich sein überprüfen Java Basics - Anfänger-Themen 14
Bademeister007 Elemente aus zwei verschiedenen Arrays miteinander vergleichen und gegeben falls entfernen Java Basics - Anfänger-Themen 14
Düsseldorf2002 Datentypen Zwei dimensionale LinkedList Java Basics - Anfänger-Themen 8
S Objekte von zwei klassen in zwei verschiedene Textdateien schreiben Java Basics - Anfänger-Themen 5
J Zwei Objekte vergleichen Java Basics - Anfänger-Themen 8
X Zwei Dimensionales Array prüfen Java Basics - Anfänger-Themen 1
G Methoden Informationen aus zwei Objekte bekommen? Java Basics - Anfänger-Themen 6
E Wie gebe ich alle Daten zwischen zwei Zeitpunkten aus? Java Basics - Anfänger-Themen 2
Q Besitzen zwei Strings identische Buchstaben, nur in anderer Reihenfolge? Java Basics - Anfänger-Themen 10
pkm Regexproblem - Wie kann ich zwei oder mehr beliebige Zeichen matchen? Java Basics - Anfänger-Themen 7
A Wieso bekomme ich hier zwei unterschiedliche Ausgaben? Java Basics - Anfänger-Themen 6
H Ein gegebenes Int Array zu Zwei Arrays zurück geben Java Basics - Anfänger-Themen 6
J zwei String Arrays miteinander vergleichen Java Basics - Anfänger-Themen 18
R Methode zwei Sortierkriterien der Klasse Comparator übergeben Java Basics - Anfänger-Themen 4
B Collections.sort mit zwei Bedingungen? Java Basics - Anfänger-Themen 4
X Textdatei: zwei-zeilenweise gleiche Zeilen rausschmeißen Java Basics - Anfänger-Themen 21
M Konkatenation von zwei Strings Java Basics - Anfänger-Themen 6
J Problem beim vergleich von zwei Integer Java Basics - Anfänger-Themen 3
D Input/Output Input von zwei Koordinaten validieren und anschließend Werte speichern Java Basics - Anfänger-Themen 7
L Zwei sortierte Subarrays mit gleicher Länge zusammenfügen Java Basics - Anfänger-Themen 2
F Zwei Dimensionles Array Java Basics - Anfänger-Themen 21
I Alle Elemente von zwei Listen vergleichen Java Basics - Anfänger-Themen 1
J Inhalte von zwei Arrays vertauschen?! Java Basics - Anfänger-Themen 6
O zwei Arrays nach Werten durchsuchen und zusammenfügen Java Basics - Anfänger-Themen 3
A Wie zwei zahlen in einer Variable speichern? Java Basics - Anfänger-Themen 7
N Zwei Daten (Datum) miteinander vergleichen, abspeichern, laden Java Basics - Anfänger-Themen 4
X Threads Zwei Threads, aber doppelte Ausgabe verhindern (synchronized) Java Basics - Anfänger-Themen 54
B Relativen Anteil von zwei Datümer auf Monatsebene umrechnen Java Basics - Anfänger-Themen 130
W Zwei Programme sollen auf eine Klasse zugreifen Java Basics - Anfänger-Themen 18
B Rückgabe von zwei Werten: String und double Java Basics - Anfänger-Themen 14
J Zwei Klassen die sich gegenseitig referenzieren - Bad practice? Java Basics - Anfänger-Themen 4
B Anzahl von Stunden / Tage von zwei Datumswerten ermitteln Java Basics - Anfänger-Themen 1
L Erste Schritte Elemente zwei Schlangen vergleichen Java Basics - Anfänger-Themen 14
N Zwei Strings mit "==" vergleichen warum TRUE Java Basics - Anfänger-Themen 2
D Input/Output InputDialog mit zwei Inputfeldern? Java Basics - Anfänger-Themen 4
D Funktion zwei Arraylisten zu verleichen ob gleich funktioniert nicht Java Basics - Anfänger-Themen 26
S Daten aus zwei Verschiedenen Tabellen in eine ArrayListe Java Basics - Anfänger-Themen 4
D Zwei Strings sind gleich bei if aber nicht true Java Basics - Anfänger-Themen 2
E Best Practice Jar-file mit zwei Klassen und externer Bibliothek über Konsole erzeugen Java Basics - Anfänger-Themen 13
J Logging erzeugt zwei dateien.... Java Basics - Anfänger-Themen 7
S zwei-dimensionales Array Java Basics - Anfänger-Themen 20
R Zwei Attribute gleichzeitig ausgeben Java Basics - Anfänger-Themen 12
javajoshi Problem mit zwei Threads und Arrays (Runnable) Java Basics - Anfänger-Themen 12
T Classpath Zwei gleiche Dateinamen in verschiedenen Projekten möglich? Java Basics - Anfänger-Themen 13
H Bubblesort-Zwei Integer auf Dekade vergleichen. Java Basics - Anfänger-Themen 6
M Wie erzeuge ich die Differenz von zwei Daten in Stunden?? Java Basics - Anfänger-Themen 2
L Den Winkel zwischen zwei Vektoren berechnen! Java Basics - Anfänger-Themen 2
jaleda100 KeyCode – zwei Tasten gleichzeitig Java Basics - Anfänger-Themen 2
M Methoden Zwei Methoden in einem Program laufen lassen...aber wie? Java Basics - Anfänger-Themen 2
M Methoden zwei methoden gleichzeitig laufen lassen Java Basics - Anfänger-Themen 4
M For-Schleife durch zwei versch. Variablen begrenzen Java Basics - Anfänger-Themen 27
B Erste Schritte Problem bei der Verknüpfung von zwei klassen Java Basics - Anfänger-Themen 8
J Methoden Zwei Methoden die fast das gleiche tun organisieren Java Basics - Anfänger-Themen 3
Bluedaishi der Monat zwischen zwei Datumsangaben Java Basics - Anfänger-Themen 15
J Best Practice Datum Differenz aus zwei Strings ermitteln Java Basics - Anfänger-Themen 8
J Ein Objekt and eine Methode übergeben zwei Schreibweisen? Java Basics - Anfänger-Themen 6
R Threads Pause zwischen zwei Schleifen Java Basics - Anfänger-Themen 1
Aprendiendo Zwei Fragen und ein geerbtes "protected"-Attribut Java Basics - Anfänger-Themen 2
S Parameterübergabe zwischen zwei Programme Java Basics - Anfänger-Themen 4
L Rekursiv zwei Strings vergleichen Java Basics - Anfänger-Themen 3
L Classpath Zwei Bibliotheken enthalten gleiche .class Datei Java Basics - Anfänger-Themen 6
S OOP Zwei JSlider in einer Klasse Java Basics - Anfänger-Themen 2
P Aus einem Array zwei Arrays machen Java Basics - Anfänger-Themen 3
ArkHeat Erste Schritte Zwei 2-dimensionale Matritzen addieren Java Basics - Anfänger-Themen 0
S Erste Schritte Zwischen zwei Punkten ein Minimumpkt./Maxima finden Java Basics - Anfänger-Themen 1
T OOP Zwei Klassen Testen (Arrary Iterieren) Java Basics - Anfänger-Themen 6
E Eine Instanzvariable und zwei Objekte Java Basics - Anfänger-Themen 14
S Durchschnitt berechnen aus zwei Textfeldern Java Basics - Anfänger-Themen 21
K Zwei Fragen zu Graphics/Graphics2D Java Basics - Anfänger-Themen 5
P Verbindung von Zwei Kreisen löschen ! Java Basics - Anfänger-Themen 6
J Zwei String-Variabeln vergleichen Java Basics - Anfänger-Themen 5
F Vererbung in zwei Richtungen? Java Basics - Anfänger-Themen 14
J Hilfe beim "Verknüpfen" von zwei Klasse Java Basics - Anfänger-Themen 15
N Mit der gleichen BlockingQueue in zwei Klassen arbeiten Java Basics - Anfänger-Themen 12
S Methoden Vergleichen von zwei Listen in der Geschwindigkeit von O(n+m) Java Basics - Anfänger-Themen 32

Ähnliche Java Themen

Neue Themen


Oben