如何以更高的像素密度显示我的 Java (Swing GUI) 应用程序?

How can I display my Java (Swing GUI) application with a higher pixel density?

我的应用程序像素化/模糊,就好像我没有视网膜(高 PPI)显示器一样。我怎样才能增加 canvas 的像素密度,使一切看起来都清晰?

操作系统: macOS Mojave 10.14.4 Java: "12" 2019-03-19

我试过变换、缩放、渲染提示等。但我似乎无法获得更高的像素密度。

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class SimpleCanvas
{
    private JFrame     frame;
    private CanvasPane canvas;
    private Graphics2D graphic;
    private Image      canvasImage;

    /**
     * Creates and displays a SimpleCanvas of the specified size and background 
     */
    public SimpleCanvas(String title, int width, int height, Color bgColour) {
        frame = new JFrame();
        canvas = new CanvasPane();
        frame.setContentPane(canvas);
        frame.setTitle(title);
        canvas.setPreferredSize(new Dimension(width,height));
        frame.pack();
        Dimension size = canvas.getSize();
        canvasImage = canvas.createImage(size.width,size.height);
        graphic = (Graphics2D) canvasImage.getGraphics();
        graphic.setColor(bgColour);
        graphic.fillRect(0,0,size.width,size.height);
        graphic.setColor(Color.black);
        frame.setVisible(true);

        // higher quality rendering
        graphic.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        graphic.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        graphic.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
        graphic.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
        graphic.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
        graphic.setRenderingHint(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_ENABLE);
        graphic.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
        graphic.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);
    }

    /** 
     * Draws a disc on this SimpleCanvas centred at x,y with radius r with colour c.
     */
    public void drawDisc(int x, int y, int r, Color c) {
        int d = r*2;
        setForegroundColour(c);
        graphic.fillOval(x - r, y - r, d, d); 
    }

    class CanvasPane extends JPanel {
        public void paint(Graphics g) {
            g.drawImage(canvasImage,0,0,null);
        }
    }

}

我认为可悲的答案是:不可能。

当您查看此 answer 2013 年的内容时,您会发现人们并没有找到在他们的 swing 应用程序中 "force" 更高 DPI 的方法。

据我所知,这没有任何改变。

真正令人难过的答案是 Java 不是一种用于创建真正出色的 "modern" 用户体验的好语言,至少对于 "fat" 桌面 GUI 客户端而言是这样。正如您在另一个答案中看到的那样,Java9 承诺会做得更好,但似乎:事实并非如此。

如果有的话,答案 可能会尝试 JavaFX。这本身就是一个问题,因为正确捆绑 JavaFX 应用本身可能会变成一个问题。