Артефакт BoxLayout при масштабировании дисплея на 125%

#java #swing #boxlayout #hidpi

#java #качать #boxlayout #hidpi

Вопрос:

Этот простой пользовательский интерфейс Java swing BoxLayout , по-видимому, приводит к тому, что определенные пиксели не отображаются (что приводит к артефактам / мусору), когда масштабирование моего дисплея установлено на 125% (Windows 10):

 import javax.swing.*;

public class Test {

    public static void main(String[] args) {
        JPanel container = new JPanel();
        JPanel panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
        for(int i = 1; i <= 3; i  ) panel.add(new JButton("Button "   i));
        JFrame frame = new JFrame();
        container.add(panel);
        frame.add(container);
        frame.pack();
        frame.setVisible(true);
    }
  
}
  

Результат:

Скриншот

Между кнопками 2 и 3 существует разрыв в один пиксель. Меня не сильно беспокоит сам пробел, но пиксели в этом промежутке (в пределах ширины кнопок) заполнены мусором. На скриншоте это выглядит как смещенная часть кнопки, но в целом это может измениться всякий раз, когда эта область перерисовывается (например, после наведения курсора мыши на кнопку 2), часто из-за недавно перерисованного компонента (часто более очевидного в более сложном приложении). Предположительно, это просто неинициализированные данные из-за какого-то несоответствия размеров, вызванного масштабированием дисплея и определенными значениями положения.

Последний раз тестировался с openjdk-14.0.2. (Предположительно, это может произойти только с тех пор, как JEP 263 добавил поддержку «HiDPI Graphics» в Java 9.)

Я делаю что-то не так? Есть ли способ избежать этой проблемы или обойти ее? Это проблема в BoxLayout или это более фундаментальная проблема? В принципе, что происходит?

Комментарии:

1. Java 8 здесь. Между кнопками нет промежутка. (Просто говорю)

2. bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8253530