This is a known problem of sorts. It is called the Raster Problem.
JDK 9 and later support windows hi-dpi mode so you now have a scaled JPanel.
Something like 1.33 scale, the exact value depending on your windows DPI
setting.
The lines are all drawn independently, and the "y" is mapped to the
closest device pixel
and the height of all of these rather than being the impossible "1.33"
device pixels wide
is 1 device pixel wide. So you end up with gaps.
The fillRect case (so far as I can see) handles this better because it
will occasionally fill 2 pixels wide rather than leaving a gap.
I am not sure why (what should be) the wide line code, filling spans,
isn't doing
that too. So there is likely a bug here, but a fix for that can't solve
the raster problem.
At best you'd get what is happening with fillRect.
Turning on anti-aliased rendering may be the easiest option for you.
You'll then get blended rendering of course.
Or you will need to be more conscious of the effects of fractional scaling
on lo-res devices.
Another workaround is
-Dsun.java2d.uiScale=1
-phil.
On 12/20/18 3:11 AM, Michał Błaszak wrote:
Hi All,
I hope this is a known problem but just in case it’s not.
Trying to make an app drawing something on JPanel I noticed some
annoying inaccuracies.
The attached piece of code is supposed to draw a series of lines one
below the other (swapping colors are to demonstrate what's happening).
The result is presented in the following picture:
That means that some pixels are unreachable.
I tested it on several jdk releases. Results are:
OpenJDK Runtime Environment (build 1.8.0_40-b25): Works correctly
OpenJDK Runtime Environment (build 9+181): Wrong behavior
OpenJDK Runtime Environment 18.3 (build 10.0.2+13): Wrong behavior
OpenJDK Runtime Environment 18.9 (build 11.0.1+13): Wrong behavior
The same inaccuracies are observable when using drawRect() or fillRect().
I wanted to report is a bug but I do not know how to do it.
Thank you for looking at it.
Best regards
*Michał Błaszak*
Section Manager, Research & Development