- < li>Я использую FlatLaf в качестве темы.
- Я использую -Dsun.java2d.uiScale=2 для тестирования, но приложение должно поддерживать любой DPI.
Я использую виджеты для создания форм, диалоговых окон и панелей управления, они должны быть соответствующим образом масштабированы. - Я также показываю панели в менеджерах макетов и графику во внутренних фреймах.
Я хочу создать графический интерфейс, сопоставимый с графическим интерфейсом IntelliJ IDEA или веб-приложения, в которых виджеты «читабельны», а разделители и размеры перемещаются по пикселям устройства, а не по «логическим пикселям».
Я знаю, как сделать изображение пиксельным, настраиваю Transform во время перерисовки, но я не могу «упаковать» (внутренний) кадр в изображение, если изображение имеет нечетные размеры!
Кто-нибудь знает, как это сделать? добиться этого с наименьшими усилиями (т. е. не нужно создавать целые платформы)?

SSCCE:
Код: Выделить всё
import java.awt.*;
import javax.swing.*;
import java.awt.image.*;
import com.formdev.flatlaf.*;
public final class Scratch extends JDesktopPane {
public static void main(String... args) {
SwingUtilities.invokeLater(() -> {
FlatLaf.setup(new FlatDarkLaf());
JFrame f = new JFrame();
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.setContentPane(new Scratch());
f.setSize(600, 600);
f.setVisible(true);
});
}
public Scratch() {
add(new MyInternalFrame());
}
private static class MyInternalFrame extends JInternalFrame {
public MyInternalFrame() {
setResizable(true);
setContentPane(new Document());
setSize(512, 512);
setVisible(true);
}
}
private static class Document extends JPanel {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
// Create custom image to curcumvent any shenanigans with the Panel's g.
BufferedImage image = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = image.createGraphics(); // forgot to dispose kek
g2.drawOval(0, 0, getWidth() - 1, getHeight() - 1);
g2.drawString(getWidth() + "×" + getHeight(), 4, getHeight() - 4);
g.drawImage(image, 0, 0, null);
}
}
}
У меня есть подозрение, что вся среда IntelliJ IDE работает с uiScale=1, и этот отдельный Определения LAF обновляются «на лету», чтобы отразить «визуальное» масштабирование. Например, на этом снимке экрана главное окно имеет ширину более 2400 пикселей (на моем рабочем компьютере с коэффициентом масштабирования IDE 1,25), а небольшой текст под выбранной кнопкой стилизован с помощью UIResource размером 17pt:

Подробнее здесь: https://stackoverflow.com/questions/790 ... d-graphics