如何以更高的像素密度显示我的 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 应用本身可能会变成一个问题。
我的应用程序像素化/模糊,就好像我没有视网膜(高 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 应用本身可能会变成一个问题。