@@ -24,6 +24,11 @@ import androidx.compose.foundation.layout.height
2424import androidx.compose.foundation.layout.offset
2525import androidx.compose.foundation.layout.size
2626import androidx.compose.foundation.verticalScroll
27+ import androidx.compose.runtime.CompositionLocalProvider
28+ import androidx.compose.runtime.getValue
29+ import androidx.compose.runtime.mutableFloatStateOf
30+ import androidx.compose.runtime.setValue
31+ import androidx.compose.ui.Alignment
2732import androidx.compose.ui.Modifier
2833import androidx.compose.ui.layout.LayoutBoundsHolder
2934import androidx.compose.ui.layout.layoutBounds
@@ -37,13 +42,16 @@ import androidx.compose.ui.unit.DpSize
3742import androidx.compose.ui.unit.dp
3843import androidx.compose.ui.window.Window
3944import androidx.compose.ui.window.WindowState
45+ import androidx.compose.ui.window.roundToDimension
4046import androidx.compose.ui.window.runApplicationTest
4147import java.awt.BorderLayout
4248import java.awt.Dimension
49+ import java.awt.Graphics
4350import java.awt.Point
4451import java.awt.event.MouseAdapter
4552import java.awt.event.MouseEvent
4653import java.awt.event.MouseWheelEvent
54+ import javax.swing.JComponent
4755import javax.swing.JLabel
4856import javax.swing.JPanel
4957import javax.swing.SwingUtilities
@@ -208,4 +216,46 @@ class SwingPanelTest {
208216 awaitIdle()
209217 assertTrue(scrollState.value > 0 , " Compose did not scroll; SwingPanel blocked the event" )
210218 }
219+
220+ @Test
221+ fun swingPanelRespondsToDensityChange () = runApplicationTest {
222+ val swingComponent = object : JComponent () {
223+ override fun paint (g : Graphics ) {
224+ g.color = java.awt.Color .RED
225+ g.fillRect(0 , 0 , width, height)
226+ }
227+ }
228+ val swingElementSize = DpSize (200 .dp, 200 .dp)
229+
230+ var densityScale by mutableFloatStateOf(1f )
231+ launchTestWindowApplication(
232+ state = WindowState (size = DpSize (500 .dp, 500 .dp))
233+ ) {
234+ Box (
235+ modifier = Modifier .fillMaxSize(),
236+ contentAlignment = Alignment .Center
237+ ) {
238+ val density = LocalDensity .current.density
239+ CompositionLocalProvider (LocalDensity provides Density (densityScale * density)) {
240+ SwingPanel (
241+ modifier = Modifier .size(swingElementSize),
242+ factory = { swingComponent }
243+ )
244+ }
245+ }
246+ }
247+
248+ awaitIdle()
249+ assertEquals(
250+ expected = swingElementSize.roundToDimension(),
251+ actual = swingComponent.size
252+ )
253+
254+ densityScale = 2f
255+ awaitIdle()
256+ assertEquals(
257+ expected = (swingElementSize * densityScale).roundToDimension(),
258+ actual = swingComponent.size
259+ )
260+ }
211261}
0 commit comments