Straßenverwaltung (GUI-Elemente zur Laufzeit erstellen)

  • Java

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Radinator.

    Straßenverwaltung (GUI-Elemente zur Laufzeit erstellen)

    Hey,
    ich sitze zur Zeit an einem Schulprojekt, welches eine Art "Straßenverwaltung" darstellt, auf welchem man Fahrzeuge sehen soll, wie sie auf Straßen fahren, an Kreuzungen abbiegen, und so weiter.
    Das Programm an sich steht bereits, aber jetzt geht es um die Visualisierung, sprich GUI. Dafür muss ich nämlich quasi zur Laufzeit GUI-Elemete erstellen, schließlich spawnen die Autos ja in unregelmäßigen Abständen und auch prinzipiell undendlich. Jetzt verzweifle ich aber ein wenig daran, da ich bis jetzt im Internet immer nur lese, dass man in Java keine GUI-Elemente zur Laufzeit erstellen kann. Es muss doch aber einen Weg geben, wie sich das vernünftig umsetzen lässt?

    Danke schon einmal für eure Hilfe.
    Hi @FunnySunny!

    Zu deiner Aufgabe:

    Erstell dir eine Basisklasse KraftWagen, von der du dann weitere abstrahierungen macht. KW hat dann halt mind. 3 Eigenschaften(Farbe, Position, Größe).

    Im Hauptprogramm legst du dir eine Liste(ArrayList) an, in die du dann zur Lauzeit Objekte hinzufügst.
    Angenommen auf deine Straßen sollen nur normale PKWs und Lkws fahren, dann erstellst du einfach 2 Klassen, die von KW erben und zur Lauzeit erzeugst du per Zufall neue Objekte(LKW oder PKW) fügst sie in die Liste ein und lässt in der Repaint-Methode die Liste durchlaufen und zeichnest jedes Objekt.

    In dem Beispiel einfach Rechteck mit Location = Position des aktuellen elements, Größe legst du mit Size fest und die Farbe, damit du die Autos unterscheiden kannst.
    Das ganze kannst du jetz nicht nur für Autos, sondern auch für im Prinzip für alles andere auch machen(Personen, Tiere, Häuser ;D)

    zum Entfernen würde ich vor dem Repaint prüfen, ob die Postion außerhalb des "Playgrounds" ist, wenn ja, dann auf unsichtbar setzten(entsprechende Eigenschaft musste yhalt dannnoch implementieren) und dann die Liste alle 2Sekundendurchgehen und wenn du beim durchlaufen auf unsichtbare Einträge stößt, dann removen und/oder auf null setzten.

    Lg Radinator
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    Hey und danke schonmal für deine Hilfe! :)

    Yep, wie gesagt, das eigentliche Programme steht schon komplett mit Fahrzeugen, Strassen, Krezungen, Parkplätzen usw. und funktioniert soweit auch. Mir geht es hier wirklich nur um die GUI. :)
    Ich habe es sogar mittlerweile geschafft, JPanels in ein "übergeordnetes" Panel zur Laufzeit zu zeichnen. Das Problem ist aber, dass das warum auch immer nur mit einem Layout Manager funktioniert. Die Positionen meines Panels sollen aber (logischerweise) durch X- und Y-Koordinaten absolut bestimmt werden. Laut Internet soll man JComponents absolut positionieren können, indem man den Layout Manager des "Parent-Panels" via panel.setLayout(null) löscht. Allerdings funktioniert in meinem Fall dann das Erstellen zu Laufzeit nicht mehr. Mein Code:

    Java-Quellcode

    1. JPanel testPanel = new JPanel();
    2. testPanel.setPreferredSize(new Dimension(20, 20));
    3. testPanel.setLocation(50, 50);
    4. city.add(testPanel);
    5. city.revalidate();
    Dieser funktioniert auch wunderbar, solange city einen Layout Manager hat (natürlich wird dann setLocation() ignoriert). Sonst allerdings nicht. Ideen? :)
    Also ich würde dAs nec mit preferencedsize sondere nur einfach mit setsize machen. Ka, warum es diese methode preferencedsize gibt, habs aber auhc nie nachgeschaut weil nie geebraucht ;D
    stackoverflow.com/questions/17…etsize-methods-in-compone

    lg Radinator
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    Mach nach dem erzeugen und hinzufügen auf das Frame ​jpnel.setVisible(true)
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    Nope, das hat leider auch nicht geholfen. ^^
    EDIT: Ah, Problem gefunden! Es lag an dem ​city.revalidate(), welches anscheinend ohne Layout-Manager ​city.repaint() heißen muss. Bin mal gespannt wie sich das später auf die Performance auswirkt, aber fürs erste funktioniert das so. Danke @Radinator für deine Hilfe. :)
    Unterschied zwischen repaint und reinvalidate: stackoverflow.com/questions/10…ing-revalidate-vs-repaint
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell