Графика Java Swing отображается непоследовательно, когда масштаб системы в области прокрутки составляет 125 %.JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Графика Java Swing отображается непоследовательно, когда масштаб системы в области прокрутки составляет 125 %.

Сообщение Anonymous »


при 100% масштабировании экрана нарисованная фигура всегда «идеальна до пикселя».


Изображение


при масштабировании экрана 125 % одна и та же фигура в этом случае иногда рисуется так, как будто у нее есть дополнительный ряд пикселей сверху (1), а не так, как должно быть (2). Эти фигуры рисуются списком на панели прокрутки, и при прокрутке вверх и вниз они мерцают, меняясь от одной версии к другой, что очень бросается в глаза и отвлекает.


Изображение


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

отладка пакета; импортировать java.awt.BorderLayout; импортировать java.awt.Container; импортировать java.awt.Dimension; импортировать java.awt.Graphics; импортировать java.awt.Graphics2D; импортировать java.awt.GridLayout; импортировать javax.swing.JFrame; импортировать javax.swing.JPanel; импортировать javax.swing.JScrollPane; импортировать javax.swing.SwingUtilities; импортировать javax.swing.border.EmptyBorder; публичный класс TestBugScaling реализует Runnable { частный окончательный размер int = 38; public static void main(String[] args) { SwingUtilities.invokeLater(новый TestBugScaling()); } @Override общественный недействительный запуск () { Рамка JFrame = новый JFrame(); Frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); frame.setPreferredSize(новое измерение(400, 400)); Контейнер contentPane =frame.getContentPane(); contentPane.setLayout(новый BorderLayout()); contentPane.setPreferredSize(новое измерение (400, 400)); JScrollPane ScrollPane = новый JScrollPane (); ScrollPane.setPreferredSize(new Dimension(size + 10, 400)); ScrollPane.getVerticalScrollBar().setUnitIncrement(размер + 5); ScrollPane.getVerticalScrollBar().setBlockIncrement((размер + 5) * 2); Контейнер JPanel = новый JPanel(); контейнер.setBorder(новый EmptyBorder(5, 5, 5, 5)); контейнер.setLayout(новый GridLayout(20, 0, 0, 5)); Container.setPreferredSize(new Dimension(size + 10, (size + 5) * 20)); Container.add(новый CirclePanel()); Container.add(новый CirclePanel()); Container.add(новый CirclePanel()); Container.add(новый CirclePanel()); Container.add(новый CirclePanel()); Container.add(новый CirclePanel()); Container.add(новый CirclePanel()); Container.add(новый CirclePanel()); Container.add(новый CirclePanel()); Container.add(новый CirclePanel()); Container.add(новый CirclePanel()); Container.add(новый CirclePanel()); Container.add(новый CirclePanel()); Container.add(новый CirclePanel()); Container.add(новый CirclePanel()); Container.add(новый CirclePanel()); Container.add(новый CirclePanel()); Container.add(новый CirclePanel()); Container.add(новый CirclePanel()); Container.add(новый CirclePanel()); ScrollPane.setViewportView(контейнер); contentPane.add(scrollPane, BorderLayout.NORTH); кадр.пакет(); Frame.setVisible(истина); } общественный класс CirclePanel расширяет JPanel { общественная CirclePanel() { супер(); setPreferredSize (новый размер (размер, размер)); setMinimumSize (новый размер (размер, размер)); setMaximumSize (новый размер (размер, размер)); } @Override public voidpaintComponent(Graphics g) { Graphics2D g2 = (Graphics2D) g.create(); g2.fillOval(0, 0, getHeight(), getHeight()); g2.dispose(); } } } С помощью этого кода, если у вас масштаб экрана 100%, вы увидите плавную прокрутку кругов. Вместо этого при масштабе экрана 125 %, если вы присмотритесь, вы увидите круги, подпрыгивающие вверх и вниз на 1 пиксель не на своем месте при прокрутке...

Есть ли способ предотвратить/исправить это? что является причиной этого?

Я не возражаю против того, чтобы форма была не совсем идеальной, но меня возражает, что она мерцает и не всегда постоянна...
Ответить

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

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

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

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

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