Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Hi ich bin im Moment an einer java3D Anwendung am schreiben und habe eine Klasse die von JFrame erbt und intern den Canvas3D addet(mit this.add(canvas))
Jetzt will ich die FPS-Rate einbauen und muss dazu natürlich was auf den Bildschirm schreiben und da kommt meine Frage: gibt es da eine Methode die ich überschreiben muss (wie bei JPanel paintComponent(Graphics g)) oder muss ich da am Canvas3D was machen oder wie geht das?
Edit:
Du wirst dann ja immer eine Schleife haben. Bei jedem neuen Schleifendurchlauf einfach kurz die Methode computeDelta() aufrufen. Die Variable delta kannst du anschliessend für eine flüssige Bildbewegung verwenden, da die Bewegung dann abhängig von der Bildrate ist ==> flüssige Bewegung, aber das nur so am Rande.
WIe man die FPS berechnet weiß ich schon es geht nur darum wie ich sie auf den Bildschirm bringe
Was ich so aus deinem Beitrag rauslese heißt ich soll also die paint Methode überschreiben?
Das sollte grundsätzlich möglich sein. Ich will nicht sagen, dass das "heikel" ist, aber ... WAS genau so ein Canvas3D macht, um seine Daten auf den Bildschirm zu bringen, weiß man erstmal nicht. Trotzdem... es sollte wohl gehen.
Allerdings würde es ohne
Code:
public void paint(Graphics g)
{
super.paint(g); //--------------------------------- Das hier
g.drawString("FPS: " + fps, 10, 10);
}
Obwohl in meinem ersten Buch, das ich von einer Hochschule hatte (nein, bin selber noch am Gimi), nie super.paint(g); aufgerufen wurde, was eigentlich doch recht merkwürdig ist.
Jo, wenn mich nicht alles täuscht ist das paint(g) bei einem AWT Canvas auch leer (oder macht nur ein clearen des Backgrounds). Aber bei einem Canvas3D wird da bestimmt noch einiges gemacht. Um wirklich definitiv sagen zu können, dass das in Ordnung ist, müßte man sich eigentlich nochmal den Quellcode genauer ansehen - d.h. WO genau dort das eigentliche native painten getriggert wird. Aber wer weiß ob das helfen würde. Ausprobieren geht sicher schneller
Also wenn ich das nach eurem Vorschlag mache zeichnet der zwar den Wert aber das SimpleUniverse das ich benutze klatscht schwarze Fläche drüber und man sieht es nimmer es bringt auch nichts die Schriftfarbe zu ändern
Ich hatte im Tutorial allerdings nur mit SimpleUniverse zu tun und weiß jetzt auch nicht wie man das jetzt so konfiguriert dass es transparent ist weiß dass vielleicht einer?
Ok die Frage hat siche rledigt ich hab in dem Tutorial doch noch wa sgefunden hab leider nach dem falschen STichwort gesucht
Damit alle die das selbe Problem haben nicht fragen müssen hier die Lösung:
Canvas3D vollzieht keine Größenänderung mit dem restlichen Fenster
Da braucht man eine JScrollPane ohne Scrollbar und Border- ist also unsichtbar
Dann einen Listener der alle Veränderungen an der ScrollPane auf den Canvas3D überträgt
Damit ist das Thema geklärt
EDIT: Ich hab jetzt die FPS-Rate mir einem JLAbel das untendrunter (auf der Position SOuth hängt) gelöst
mit der PAint-Sache klappt es nicht
Weiß da einer wie das geht?
Ja, mit sowas musste man zumindest rechnen. In einem Canvas3D wird beim painten eben SEHR viel mehr gemacht als in einem normalen Canvas. Da werden munter Buffer gefüllt und geswappt, und es kann eben sein, dass das, was man in der paint-Methode malt, im falschen (oder garkeinem?) Buffer landet. Wie auch immer. So geht's:
Code:
Canvas3D canvas3D = new Canvas3D(SimpleUniverse.getPreferredConfiguration(), false)
{
public void postRender()
{
super.postRender();
J3DGraphics2D g = getGraphics2D();
if (g != null) // Weiß nicht ob die Abfrage notwendig ist!?
{
g.setColor(Color.WHITE);
g.drawString("FPS: "+fps, 10, 20);
g.flush(false);
}
}
};