Nur ein Hauptfester



  • Hallo java-forum,

    ich schreibe derzeit an einem kleinen Spiel. Um gleich Missverständnis zu vermeiden muss ich sagen das es mein erstes Spiel in Java ist. Ich möchte das ganze so implementieren das ich alle Komponente selber zeichne. Das heißt auch "Buttons usw. im Hauptmenü", Spiebrett ohne auf JButton, JWhatever usw. zuzugreifen Der Hauptzweck dient hier alleine dem Lernzweck da ich mich bald Beruflich mit der Java-2D-API auseinandersetzen muss bez. will

    Na ja, da bekanntlich alle spiel in einem einzigen Fenster ablaufen möchte ich das auch so implementieren.

    Mein Problem bez. meine Frage an euch, wie manage ich das Zeichnen der Objekte.

    Ich habe eine MWindow das erbt von JFrame. Hier soll auch alles weitere passieren. Ich Habe einige Klassen z.b Spielbrett, Hauptmenü usw... In diesen Klassen soll, wie im Beispiel von Hauptmenü: das komplette Hauptmenü mit allen Buttons usw. erstellt/gezechten werden

    Aber wie verbinde das das ganze System nun am besten?
    Ich meine wie vereine ich das ganze System zu einem Fenstersystem?
    Über Ideen würde ich mich sehr freuen.

    Gruß und Danke im Voraus

    TasseJava



  • Wenn Du nur JFrame nutzen und ansonsten keine JComponents einsetzen willst, dann musst Du Dich nicht nur ums Zeichnen sondern auch ums komplette Event Dispatching selbst kümmern.

    Du könntest erstmal damit anfangen, Dir eine Schnittstelle für Deine im Fenster sichtbaren Komponenten zu spefizieren. Zum Beispiel braucht jede Komponente eine Paint Methode, die das Graphics Objekt übergeben bekommt. Dann wird jede Komponente eine Bounding Box haben bzw (besser) ein Shape. Das wirst Du benötigen, um z.B. MouseEvents an Deine Komponenten zu deligieren. An der Bounding Box bzw. dem Shape hängt dann auch eine Position (z.B. linke obere Ecke der Komponente) bzgl. dem Koordinaten-System des Fensters. Und dann brauchst Du ja sicherlich auch Methoden in der Schnittstelle, um Events zu verarbeiten, also z.B. onLeftClick(), onHover() usw.

    Du brauchst dann einen Parent Container, der alle Komponenten kennt. Auf diesem Container überschreibst Du die paintComponent(), so dass alle Deine Komponenten gezeichnet werden. Du kannst auch auf diesem Container MouseListener usw. registrieren und an die entsprechenden Methoden in Deiner Komponenten Schnittstelle delegieren. Welche Komponente vom MouseEvent betroffen ist, kannst Du über die Mouse-Position und das Shape / die Bounding Box herausfinden.



  • byto schrieb:

    Wenn Du nur JFrame nutzen und ansonsten keine JComponents einsetzen willst, dann musst Du Dich nicht nur ums Zeichnen sondern auch ums komplette Event Dispatching selbst kümmern.

    Na ja JComponent möchte ich schon verwenden. bez. möchte ich meine eigenen JComponent's implementieren, das sparrt natürlich arbeit, den alles will ich nicht selber machen. Will eigentlich nur den kompletten look von von Java wegschmeißen. So das sich das Spiel wirklich wie ein Spiel anfühlt und alles in einem Fenster läuft. Und die Grafiken bez Buttons usw. schön animiert sind... Dazu eignet sich ja die Java 2D-Api ganz gut. Jedoch habe ich ein problem das ganze zusammen zu fassen. Tipps willkommen 😉

    Wie kann ich mir zum Beispiel ein Ein Objekt bauen wo mehrer Graphics Objekte zusammen fassen, diese fest positioniere und das ganze zu meine Mainklasse schicke und dieses nur noch mit JFrame.add(); hinzugefügt und dargestellt!?

    Stelle ich mir das ganze zu einfach vor und es ist in wirklich sehr schwierig!?



  • Achso. Naja, das ist ja nicht weiter schwierig. Prinzipiell kannst Du bei jeder JComponent die paintComponent() Methode überschreiben und somit die Optik an Deine Bedürfnisse anpassen.

    Es macht aber wenig Sinn, die Position fest zu verdrahten. Das JFrame soll doch sicher eine flexible Größe haben, die sich an die Auflösung anpasst. Benutz also lieber einen LayoutManager.

    Also einfach ein JPanel als Container benutzen, diesem einen LayoutManager verpassen und dort alle Komponenten drauf klatschen. Bei den Komponenten jeweils den Look anpassen durch überschreiben von paintComponent(). Dieses JPanel dann dem JFrame hinzufügen mit frame.getContentPane().add(panel);



  • byto schrieb:

    Achso. Naja, das ist ja nicht weiter schwierig. Prinzipiell kannst Du bei jeder JComponent die paintComponent() Methode überschreiben und somit die Optik an Deine Bedürfnisse anpassen.

    Es macht aber wenig Sinn, die Position fest zu verdrahten. Das JFrame soll doch sicher eine flexible Größe haben, die sich an die Auflösung anpasst. Benutz also lieber einen LayoutManager.

    Also einfach ein JPanel als Container benutzen, diesem einen LayoutManager verpassen und dort alle Komponenten drauf klatschen. Bei den Komponenten jeweils den Look anpassen durch überschreiben von paintComponent(). Dieses JPanel dann dem JFrame hinzufügen mit frame.getContentPane().add(panel);

    Ok danke, das klappt auch soweit. Jedoch habe ich das Problem sobald ich etwas auf dem Frame habe, bekomme ich dieses nicht ersetzt.

    Setze:

    public MainWindow (JPanel pan) {
    
    		frame.getContentPane().add(pan);
    		frame.pack();
    		frame.setLocationRelativeTo(null);
    

    Doch wie handhabe ich es, wenn jetzt ein neues JPanel kommt das, dass alte ablösen/ersetzen soll?



  • frame.getContentPane().remove(oldPanel);
    frame.getContentPane().add(newPanel);

    Aber bist Du sicher, dass Du alles ersetzen willst? Warum aktualisierst Du nicht einfach den Inhalt der Komponenten??


Log in to reply