При перемещении курсора наблюдается много мерцания. Как исправить это ? p>
( Kotlin) (Java приемлемо)
import java.awt.Color
import java.awt.Dimension
import java.awt.Graphics
import java.awt.Point
import java.awt.event.MouseEvent
import java.awt.event.MouseMotionAdapter
import javax.swing.*
import kotlin.random.Random
fun main() {
SwingUtilities.invokeLater {
val pn = object : JPanel() {
var pt: Point?=null
val w=256
val h=w
init {
addMouseMotionListener(object : MouseMotionAdapter() {
override fun mouseMoved(e: MouseEvent?) {
super.mouseMoved(e)
// efficient repainting from https://docs.oracle.com/javase/tutorial ... ining.html
var lpt=pt//make a local copy of a global nullable to keep compiler happy
if (lpt!=null)
repaint(lpt.x-w/2,lpt.y-h/2,w,h)
pt=e?.point
lpt=pt
if (lpt!=null)
repaint(lpt.x-w/2,lpt.y-h/2,w,h)
}
})
}
//few random numbers to show that indeed only the square under the cursor is being repainted
val rand= Random.Default
override fun paintComponent(g: Graphics?) {
super.paintComponent(g)
if (g!=null){
g.color= Color.red
val pt=pt
g.color = Color.red
g.fillRect(10,10,100,100)
g.color=Color.black
g.drawString(rand.nextInt(1000).toString(),10+50,10+50,)
g.color = Color.green
pt?.also {
g.fillOval(pt.x-w/2,pt.y-h/2,w,h)
g.color=Color.black
g.drawString(rand.nextInt(1000).toString(),pt.x,pt.y)
}
}
}
}
pn.add(JButton("hello"))
pn.preferredSize = Dimension(500, 500)
pn.isOpaque = false // panel must be transparent
pn.border = BorderFactory.createLineBorder(Color.black,5)
val fr = JFrame()
fr.defaultCloseOperation = WindowConstants.EXIT_ON_CLOSE
fr.isUndecorated = true
fr.background=Color(0, 0, 0,0)//notice the 0 alpha
fr.add(pn)
fr.pack()
fr.setLocationRelativeTo(null)
fr.isVisible = true
}
}
< /code>
среда < /strong>
linux 6.9.3-76060903-generic #202405300957 ~ 1738770968 ~ 22.04 ~ D5F7C84 SMP Preempt_Dynamic FED F x86_64 x86_64 x864 GNU /Linux
POP! _OS 22.04 LTS
gnome версия 42.9
Windowing System x11
openjdk 21.0.6 2025-01-21
Environment Runtime OpenJDK (Build 21.0.6+7-Ubuntu-122.04.1)
openjdk 64-битный сервер VM (Build 21.0.6+7-Ubuntu-122.04.1, смешанный режим, обмен)
Скорость обновления экрана: 60,01 Гц и 165,02 Гц (мерцание в обоих)
Масштабирование отображения: 100% и 125% (мерцание, наблюдаемое в обоих)
edit (s):
- Нет мерцания при запуске на Windows 11 < /em> вместо оригинальной операционной системы Linux, с (сборка Microsoft) в том же JDK и на том же оборудовании с тем же экраном Разрешение, скорость обновления и масштабирование. Виртуальная машина довольно поливается по сравнению с нативным оборудованием и все же не показывает мерцание - возможно, придется связаться с разницей в сборке JVM.
Подробнее здесь: https://stackoverflow.com/questions/794 ... -transpare