For faster rendering, turn off Z-buffering (this uses native fillPoly instead of Java rasterizing).
With Z-buffering enabled, faces are rasterized with interpolated Z-values, done with interpreted Java code.
Only Java 1.1 was used: no libraries or installed extras are needed.
On my PC, I get between 20 and 35 fps with this demo (lighting and z-buffering enabled). Not bad for an interpreted language.