无法在 Desktop 中为 Compose 设计 UI 布局

2024-03-21

我正在为基于的应用程序开发 UI 布局为桌面撰写 https://www.jetbrains.com/lp/compose-mpp/

它由几个复选框组成。
但里面没有任何功能为桌面撰写 https://github.com/JetBrains/compose-jb/tree/master/tutorials/Getting_Started使视图彼此对齐。

在Android中,我们可以使用Constraint Layout用于视图对齐,非常简单。
但是 Compose for Desktop 该怎么办呢?
这是我需要在 Desktop Compose 中设计的布局

这是我写的代码Main.kt文件: 但输出却截然不同。
由于没有 Compose For Desktop Layout Alignment and Sizing 的官方文档/视频,请您指导一下吗?

@Composable
@Preview
fun App() {
    MaterialTheme(
    ) {
        BoxWithConstraints {
            TwoColumnsLayout()
        }
    }
}

@Composable
fun TwoColumnsLayout() {
    Row(Modifier.fillMaxSize()) {
        Box(modifier = Modifier.fillMaxWidth(0.4f), contentAlignment = Alignment.Center) {
            LeftPaneContent()
            Divider(
                color = Color.Blue,
                modifier = Modifier
                    .fillMaxHeight()
                    .width(1.dp)
            )
        }
        RightPaneContent()
    }
}

@Composable
fun LeftPaneContent() {
    Column(
        Modifier.fillMaxSize(),
        verticalArrangement = Arrangement.Center,
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        Text(text = "Left Pane First Text Box")
        Text(text = "Left Pane Second Text Box")
        Column {
            Text(text = "Left Pane Radio button Box  ", modifier = Modifier.padding(start = 8.dp))
            val options = listOf("Option 1", "Option 2", "Option 3", "Option 4", "Option 5")
        }
        Text(text = "Left Pane bottom Text Box")
    }
}

@Composable
fun RightPaneContent() {
    Box(modifier = Modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
        Column(
            Modifier.fillMaxSize(),
            verticalArrangement = Arrangement.Center,
            horizontalAlignment = Alignment.CenterHorizontally
        ) {
            Text(text = "Right Pane First Text Box")
            Text(text = "Right Pane Second Text Box")
            Text(text = "Right Pane Third Text Box")
        }
    }
}

fun main() = application {
    Window(
        onCloseRequest = ::exitApplication,
        state = WindowState(size = DpSize(1440.dp, 768.dp))
    ) {
        App()
    }
}

我不需要完整的代码。
我只需要根据上述设计进行视图放置、对齐和调整大小方面的帮助。
我无法创建如上图所示的 UI 布局,而且也没有有关 Compose For Desktop UI 布局的文档。


ConstraintLayout在极少数情况下是您所需要的,在大多数情况下 Compose Layout 就足够了。

您可以查看 Compose 布局文档 https://developer.android.com/jetpack/compose/layouts,我认为其中充满了类似布局的示例 - 至少是其中的一部分。

您的代码中有很多错误,但一般方法是正确的。经过一些练习,你就会开始享受到比使用它更多的乐趣ConstraintLayout.

  1. TwoColumnsLayout- 不太清楚为什么你决定将左侧内容和分隔符放入Box- 它将把它们一个放在另一个之上。只需删除Box并留下内容。
  2. The Modifier.fillMaxWidth(0.4f)可以直接移入LeftPaneContent - add fillMaxHeight并删除fillMaxSize。或者,您可以创建一个Modifier参数,因此可以从TwoColumnsLayout.
  3. Use Modifier.weight(1f)仅限一名儿童Row/Column因此它会占用其他视图布局后的所有可用空间 - 更多信息可以在这个答案 https://stackoverflow.com/a/68972289/3585796.
  4. LeftPaneContent- 根据您的设计,您可能需要将前两个文本放入Row如果你希望它们大小相同 - 添加Modifier.weight(1f)每一个。
  5. RightPaneContent- 与第 3 点相同:您可能需要将第二个和第三个视图放入Row. Box拥有一个孩子是多余的,可以删除。
  6. BoxWithConstraints inside App也不使用并且可以删除。

还使用Spacer添加视图之间的间距Modifier.padding如所须。另外一个好的做法是使用修饰符作为最后一个参数进行移动 - 在这种情况下,当您需要添加/重新排序修饰符时,您不必处理尾随逗号。

这应该更接近您预期的布局:

@Composable
fun TwoColumnsLayout() {
    Row(Modifier.fillMaxSize()) {
        LeftPaneContent()
        Divider(
            color = Color.Blue,
            modifier = Modifier
                .fillMaxHeight()
                .width(1.dp)
        )
        RightPaneContent()
    }
}

@Composable
fun LeftPaneContent() {
    Column(
        verticalArrangement = Arrangement.Center,
        horizontalAlignment = Alignment.CenterHorizontally,
        modifier = Modifier
            .fillMaxHeight()
            .fillMaxWidth(0.4f)
            .padding(20.dp)
    ) {
        Row {
            Text(text = "Left Pane First Text Box", modifier = Modifier.weight(1f))
            Text(text = "Left Pane Second Text Box", modifier = Modifier.weight(1f))
        }
        Spacer(Modifier.size(20.dp))
        Column(Modifier.weight(1f).border(1.dp, color = Color.Black)) {
            Text(text = "Left Pane Radio button Box  ", modifier = Modifier.padding(start = 8.dp))
            val options = listOf("Option 1", "Option 2", "Option 3", "Option 4", "Option 5")
        }
        Spacer(Modifier.size(100.dp))
        Text(text = "Left Pane bottom Text Box")
    }
}

@Composable
fun RightPaneContent() {
    Column(
        verticalArrangement = Arrangement.Center,
        horizontalAlignment = Alignment.Start,
        modifier = Modifier
            .fillMaxSize()
            .padding(20.dp)
    ) {
        Text(text = "Right Pane First Text Box")
        Spacer(Modifier.size(20.dp))
        Row {
            Text(text = "Right Pane Second Text Box", modifier = Modifier.weight(1f))
            Spacer(Modifier.size(20.dp))
            Text(text = "Right Pane Third Text Box", modifier = Modifier.weight(1f))
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法在 Desktop 中为 Compose 设计 UI 布局 的相关文章

随机推荐

  • 计算整个 GeoDataFrame 点的质心

    我想从 geojson 文件导入一些航路点 标记 然后确定所有点的质心 我的代码计算每个点的质心 而不是该系列中所有点的质心 如何计算系列中所有点的质心 import geopandas filepath r Shiloh json gdf
  • css - 显示:表格单元格和固定宽度[重复]

    这个问题在这里已经有答案了 我有一些divs with display table cell样式 我想在其上设置固定宽度divs并在内容不合适时截断其中的文本 HTML div class row div class cell style
  • 如何在 Postgres 9.5 中替换多个特殊字符

    我有一个包含可能包含特殊字符的名称列表的表 id name 1 Joh n 2 J rgen 3 Janna 4 dyr 是否有一个函数可以将每个字符替换为另一个特定字符 不一定是无重音的 像这样的事情 SELECT id function
  • Android 发现死锁

    当我运行 Android 服务时 有时会收到 ANR 我怀疑这是因为僵局而发生的 有没有一种简单的方法可以监控 Android 或 Eclipse 中的死锁 例如显示哪个线程持有哪个锁等的实用程序 有没有办法通过查看 traces txt
  • IntelliSense:命名空间“MSXML2”在 VS2012 中没有成员“DOMDocument”

    我正在尝试编译我继承的项目 然后遇到此错误 以下是一些相关代码 include
  • 如何将 JQuery 脚本添加到单个 WordPress 页面中?

    我想将 JQuery 脚本添加到单个 WordPress 页面中 但我不知道如何操作 我想注入的脚本示例 当以纯 HTML 形式注入时 此代码可以正常工作 但如何对 Wordpress 执行相同操作呢 我个人认为将 JavaScript 添
  • div CSS 上的右角功能区

    我正在尝试在 div 中制作一条角丝带 它无处不在 我希望它看起来整洁漂亮 但它覆盖了 div 坐得不太好 The ribbons corner ribbon width 100px background e43 position abso
  • 大型 Org-mode 文件中的光标移动缓慢以及“org-do-latex-and-lated”函数

    在一个几乎有 5000 行的 org 文件中 滚动速度慢得难以忍受 除非我转动font lock mode离开 检查发生了什么profiler 减速的主要原因是函数org do latex and related 定义于org el 似乎它
  • 如何使用 wlst 更新应用程序

    从控制台如果 1 要更新应用程序 1 所做的是 1 单击部署 2 选择应用程序名称并单击更新选项 3 这里他可能会改变 i Source Path ii Deployment Plan 现在 在我的应用程序中没有指定计划路径 因此要更新应用
  • Spring boot打包后找不到资源文件

    我使用 Spring boot maven 插件将应用程序打包为 jar 文件 可以找到资源文件直接在Intellij IDEA中运行 但之后找不到资源文件 显示错误为 java io FileNotFoundException 类路径资源
  • 修改清单文件 Win32 Visual Studio 2022

    如何在 Visual Studio 2022 中 修改 生成 Win32 应用程序的程序集清单文件 项目属性 gt Win32 资源 gt 清单路径设置为 gt 使用默认设置嵌入清单 我可以将其设置为使用自定义清单 但我想要做的是获取具有默
  • 如何在 DIV 元素上合成浏览器单击事件?

    通过按钮 我可以调用click 方法来生成点击 然而 DIV 并非在所有浏览器上都具有此方法 但我可以将点击事件侦听器附加到它们 通过设置 onclick 或添加事件监听器 有什么方法可以让我以编程方式 合成 对此类元素的点击 但是不使用
  • 如何将字符串转换为浮点数组?

    您将如何转换字符串 比方说 string Numbers 0 3 5 7 9 8 6 2 0 54 6 3 转换为浮点数组 例如 float Numbers 6 0 3 5 7 9 8 6 2 0 54 6 3 我会使用来自的数据结构和算法
  • c# OCR无法识别数字(tesseract 2)

    I m trying to extract digits from the following 它失败了 我得到了 作为回报 我正在使用 google 的 tesseract 2 使用 C 开源 c 包装器 现在我想知道 这个图像是否太糟糕
  • 如何检查for循环内的唯一性?

    有没有办法检查切片 映射是否存在值 我想为切片添加一个值only如果是的话not存在于切片中 这可行 但看起来很冗长 有一个更好的方法吗 orgSlice int 1 2 3 newSlice int newInt 2 newSlice a
  • Webpack babel es6 给我错误,react-router 1.0“找不到模块”?

    我在使用react router时遇到以下错误 它所引用的错误看起来像是在我的应用程序代码之外 但在react router库本身中 ERROR in react router lib Router js Module not found
  • 在Android中查找包含View的Window

    我找不到获得参考的方法Window包含任意Viewv 我发现获取窗口令牌 http developer android com reference android view View html getWindowToken 但我不知道如何使
  • Android BottomNavigationView 与闪屏返回堆栈问题

    所以我设置了我的BottomNavigationView like here https youtu be Covu3fPA1nQ 使用导航组件库 一切正常 每个选项卡都可以保留其后堆栈 但是 如果我添加一个启动屏幕 Fragment an
  • 如何管理应用程序工厂模式中的额外模块?

    我正在使用带有应用程序工厂模式的烧瓶 我确实知道应用程序工厂模式仅在工厂函数中管理配置对象 如下面的代码所示 def create app config app config from object config sentry init a
  • 无法在 Desktop 中为 Compose 设计 UI 布局

    我正在为基于的应用程序开发 UI 布局为桌面撰写 https www jetbrains com lp compose mpp 它由几个复选框组成 但里面没有任何功能为桌面撰写 https github com JetBrains comp