Как я могу отобразить свое приложение Java (Swing GUI) с более высокой плотностью пикселей? - PullRequest
2 голосов
/ 14 мая 2019

Мое приложение выглядит довольно пиксельным / размытым, как будто у меня не было дисплея сетчатки (High PPI). Как я могу увеличить плотность пикселей холста, чтобы все выглядело четким?

Операционная система: 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);
        }
    }

}

1 Ответ

0 голосов
/ 14 мая 2019

Я думаю, что печальный ответ: не возможно.

Когда вы ознакомитесь с этим ответом от 2013 года, вы обнаружите, что люди не нашли способ «навязать» более высокое значение DPI для своих приложений Swing.

И, насколько мне известно, ничего не изменилось.

Действительно печальный ответ заключается в том, что Java не является хорошим языком для создания действительно великолепного "современного" пользовательского опыта, по крайней мере, в отношении "толстых" клиентов настольного графического интерфейса. И как вы можете видеть на этом другом ответе, Java9 обещал сделать лучше, но кажется: это не так.

Если вообще, ответ может пойти попробовать JavaFX. Что само по себе является проблемой, поскольку правильная комплектация приложения JavaFX может превратиться в собственную проблему.

...