Виджеты HiDPI, но расположение макета и графика с точностью до пикселяJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Виджеты HiDPI, но расположение макета и графика с точностью до пикселя

Сообщение Anonymous »

Я создаю современное приложение (например, IntelliJ IDEA), поддерживающее DPI, но все должно быть с точностью до пикселя.
  • Я использую FlatLaf в качестве темы.
  • Я использую -Dsun.java2d.uiScale=2 для тестирования, но приложение должно поддерживать любой DPI.
  • Я использую виджеты для создания форм, диалоговых окон и панелей, они должны быть соответствующим образом масштабированы.
    Я также показываю панели в менеджерах макетов и графику во внутренних фреймах.< /li>
Проблема связана с последним пунктом, поскольку -Dsun.java2d.uiScale=2 приводит к тому, что «масштабирование становится невидимым для программы», поэтому если я заставлю внутренний кадр отображать изображение размером 512×512 пикселей, и кадр, и изображение фактически отображаются как 1024×1024 (и координаты преобразуютсяed, а активная обводка удваивается и т. д.) . Кроме того, при изменении размера любой панели (разделитель разделенной панели, внутренние края рамки) она увеличивается на 2 пикселя за раз.
Я хочу создать графический интерфейс, сопоставимый с графическим интерфейсом 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);
}
}
}


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

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»