# Scrollbar usage ## What is covered In this tutorial, we will show you how to add scrollbars to scrollable lists using Compose for Desktop. ## Scrollbars applying You can apply scrollbars to scrollable components. The scrollbar and scrollable components share a common state to synchronize with each other. For example, VerticalScrollbar can be attached to ScrollableColumn, and LazyColumnFor and HorizontalScrollbar can be attached to ScrollableRow and LazyRowFor. ```kotlin import androidx.compose.desktop.Window import androidx.compose.foundation.HorizontalScrollbar import androidx.compose.foundation.VerticalScrollbar import androidx.compose.foundation.background import androidx.compose.foundation.horizontalScroll import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.rememberScrollbarAdapter import androidx.compose.foundation.verticalScroll import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.IntSize import androidx.compose.ui.unit.dp fun main() { Window(title = "Scrollbars", size = IntSize(250, 400)) { Box( modifier = Modifier.fillMaxSize() .background(color = Color(180, 180, 180)) .padding(10.dp) ) { val stateVertical = rememberScrollState(0f) val stateHorizontal = rememberScrollState(0f) Box( modifier = Modifier .fillMaxSize() .verticalScroll(stateVertical) .padding(end = 12.dp, bottom = 12.dp) .horizontalScroll(stateHorizontal) ) { Column { for (item in 0..30) { TextBox("Item in ScrollableColumn #$item") if (item < 30) { Spacer(modifier = Modifier.height(5.dp)) } } } } VerticalScrollbar( modifier = Modifier.align(Alignment.CenterEnd) .fillMaxHeight(), adapter = rememberScrollbarAdapter(stateVertical) ) HorizontalScrollbar( modifier = Modifier.align(Alignment.BottomStart) .fillMaxWidth() .padding(end = 12.dp), adapter = rememberScrollbarAdapter(stateHorizontal) ) } } } @Composable fun TextBox(text: String = "Item") { Box( modifier = Modifier.height(32.dp) .width(400.dp) .background(color = Color(200, 0, 0, 20)) .padding(start = 10.dp), contentAlignment = Alignment.CenterStart ) { Text(text = text) } } ``` ![Scrollbars](scrollbars.gif) ## Lazy scrollable components with Scrollbar You can use scrollbars with lazy scrollable components, for example, LazyColumn. ```kotlin import androidx.compose.desktop.Window import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.VerticalScrollbar import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.rememberScrollbarAdapter import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.IntSize import androidx.compose.ui.unit.dp fun main() { Window(title = "Scrollbars", size = IntSize(250, 400)) { LazyScrollable() } } @OptIn(ExperimentalFoundationApi::class) @Composable fun LazyScrollable() { Box( modifier = Modifier.fillMaxSize() .background(color = Color(180, 180, 180)) .padding(10.dp) ) { val state = rememberLazyListState() val itemCount = 1000 LazyColumn(Modifier.fillMaxSize().padding(end = 12.dp), state) { items(itemCount) { x -> TextBox("Item in ScrollableColumn #$x") Spacer(modifier = Modifier.height(5.dp)) } } VerticalScrollbar( modifier = Modifier.align(Alignment.CenterEnd).fillMaxHeight(), adapter = rememberScrollbarAdapter( scrollState = state, itemCount = itemCount, averageItemSize = 37.dp // TextBox height + Spacer height ) ) } } @Composable fun TextBox(text: String = "Item") { Box( modifier = Modifier.height(32.dp) .fillMaxWidth() .background(color = Color(0, 0, 0, 20)) .padding(start = 10.dp), contentAlignment = Alignment.CenterStart ) { Text(text = text) } } ``` ![Lazy component](lazy_scrollbar.gif) ## Theme applying Scrollbars support themes to change their appearance. The example below shows how to use the DesktopTheme appearance for the scrollbar. ```kotlin import androidx.compose.desktop.DesktopTheme import androidx.compose.desktop.Window import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.rememberScrollbarAdapter import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.ScrollableColumn import androidx.compose.material.Text import androidx.compose.foundation.VerticalScrollbar import androidx.compose.material.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.graphics.Color import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.IntSize fun main() { Window(title = "Scrollbars", size = IntSize(280, 400)) { MaterialTheme { DesktopTheme { Box( modifier = Modifier.fillMaxSize() .background(color = Color(180, 180, 180)) .padding(10.dp) ) { val state = rememberScrollState(0f) ScrollableColumn( modifier = Modifier.fillMaxSize().padding(end = 12.dp), scrollState = state ) { for (item in 0..30) { TextBox("Item in ScrollableColumn #$item") if (item < 30) { Spacer(modifier = Modifier.height(5.dp)) } } } VerticalScrollbar( modifier = Modifier.align(Alignment.CenterEnd) .fillMaxHeight(), adapter = rememberScrollbarAdapter(state) ) } } } } } @Composable fun TextBox(text: String = "Item") { Box( modifier = Modifier.height(32.dp) .fillMaxWidth() .background(color = Color(0, 0, 0, 20)) .padding(start = 10.dp), contentAlignment = Alignment.CenterStart ) { Text(text = text) } } ``` ![Themed scrollbar](themed_scrollbar.gif)