如何使单选按钮和复选框根据系统分辨率改变大小?

How can I make Radio Buttons and Check Boxes change size relative to the system resolution?

我知道有很多解决方案可以帮助更改单选按钮或复选框的大小,但我需要一种方法来在我的 .css 文件中使用 em 使大小相对,或者其他一些内联解决方案。

我试图让我的控件在 720p、1080p 和 4K 下显示相同的大小。除了 RadioButton 和 CheckBox 之外的所有其他控件都可以通过将 em 用于任何选择器控件大小来工作。我将在下面为每个控件包含一些相关的代码片段。

RadioButton.css基本字体大小在另一个文件中定义

.RadioButton {
    -fx-font-size: 1em;
}

.RadioButton .radio  {
    -fx-background-insets: 0em;
    -fx-background-radius: 0.833333em;
    -fx-border-insets: 0em;
    -fx-border-radius: 0.833333em;
    -fx-padding: 0.5em;
}

.RadioButton:focused .radio {
    -fx-background-insets: 0em;
    -fx-background-radius: 0.833333em;
    -fx-border-insets: 0em;
    -fx-border-radius: 0.833333em;
    -fx-padding: 0.5em;
}

.RadioButton:hover .radio {
    -fx-background-insets: 0em;
    -fx-background-radius: 0.833333em;
    -fx-border-insets: 0em;
    -fx-border-radius: 0.833333em;
    -fx-padding: 0.5em;
}
.RadioButton:armed .radio {
    -fx-background-insets: 0em;
    -fx-background-radius: 0.833333em;
    -fx-border-insets: 0em;
    -fx-border-radius: 0.833333em;
    -fx-padding: 0.5em;
}

.RadioButton .dot {
    -fx-background-insets: 0em;
    -fx-background-radius: 0.833333em;
    -fx-padding: 0.4em;
}

.RadioButton:selected .dot {
    -fx-background-insets: 0em;
}

截图

当所有这些都被使用时,RadioButton 会随着分辨率从 4K -> 1080p -> 720p 变得越来越大 这让我觉得控件的某些部分仍然在使用它自己的内部硬大小。我知道通常你只是改变填充值来实现不同的大小,但正如你所看到的,填充值已经在这里用 em 设置了。

Checkbox.css

.CheckBox {
    -fx-font-size:  1em;
}

.CheckBox .box {
    -fx-background-insets: 0em;
    -fx-background-radius: 0.166667em;
    -fx-border-insets: 0em;
    -fx-border-radius: 0.166667em;
    -fx-padding: 0.5em;
}

.CheckBox:focused .box {
    -fx-background-insets: 0em;
    -fx-background-radius: 0.166667em;
    -fx-border-insets: 0em;
    -fx-border-radius: 0.166667em;
}

.CheckBox:hover .box {
    -fx-background-insets: 0em;
    -fx-background-radius: 0.166667em;
    -fx-border-insets: 0em;
    -fx-border-radius: 0.166667em;
}

.CheckBox:armed .box {
    -fx-background-insets: 0em;
    -fx-background-radius: 0.166667em;
    -fx-border-insets: 0em;
    -fx-border-radius: 0.166667em;
}

.CheckBox .mark {
    -fx-background-insets: 0.083333em 0em 0.083333em 0em, 0em;
    -fx-padding: 0.5em;
    -fx-shape: "M0,4H2L3,6L6,0H8L4,8H2Z";
}

截图

这与 RadioButton 文件非常相似,其中所有值都使用 em 而不是硬值。作为标记一部分的 -fx-shape 是否会导致所有 em 值失败,因为它是硬值?

预期

我的最终目标是让单选按钮和复选框在不同的分辨率下保持完全(非常接近)相同的大小。

不确定我是否回答了 yopur 问题,我对 javafx 一无所知。

但简单来说 CSS,这似乎可行:

div {
    margin: 10px;
}

#container1 {
    font-size: 20px;
}

#container2 {
    font-size: 30px;
}

#container3 {
    font-size: 40px;
}

input {
    font-size: inherit;
    width: 0.8em;
    height: 0.8em;
}
<div id="container1">
  <input type="radio" id="r1" name="test" 
         checked>
  <label for="r1">elem 1</label>
  <input type="radio" id="r2" name="test">
  <label for="r2">elem 2</label>
</div>
<div id="container2">
  <input type="radio" id="r21" name="test2" 
         checked>
  <label for="r21">elem 1</label>
  <input type="radio" id="r22" name="test2">
  <label for="r22">elem 2</label>
</div>
<div id="container3">
  <input type="radio" id="r31" name="test3" 
         checked>
  <label for="r31">elem 1</label>
  <input type="radio" id="r32" name="test3">
  <label for="r32">elem 2</label>
</div>

好的,我使用 创建的实用程序找到了我自己的问题的答案 并稍微改变一下以适应我的需要。我的大部分代码都很好,但我使用的选择器似乎不适用于这两个。我将把两个修改过的文件放在下面...

单选按钮

.radio-button {
    /*-fx-font-size: 1em;*/
}

.radio-button .radio  {
    -fx-background-insets: 0em;
    -fx-border-insets: 0em;
    -fx-border-radius: 1em;
    -fx-padding: 0.25em;
}

.radio-button .dot {
    -fx-background-insets: 0em;
    -fx-background-radius: 0.833333em;
    -fx-padding: 0.3em;
}

这些是更改尺寸所需的唯一选择器。我还有其他一些用于悬停、聚焦等的选择器,但它们仅适用于没有大小变化的样式。一个很大的变化是

.RadioButton -> .radio-button

复选框

.check-box {
    /*-fx-font-size: 1em;*/
}

.check-box .box {
    -fx-background-insets: 0em;
    -fx-background-radius: 0.166667em;
    -fx-border-insets: 0em;
    -fx-border-radius: 0.166667em;
    -fx-padding: 0.2em;
}

.check-box .mark {
    -fx-background-insets: 0.083333em 0em 0.083333em 0em, 0em;
    -fx-padding: 0.4em;
    -fx-shape: "M0,4H2L3,6L6,0H8L4,8H2Z";
}

就像 RadioButton 一样,还有其他选择器用于样式,但不用于调整大小。所有悬停、聚焦等选择器都将默认为我也在 .box 选择器中使用的默认值。这两个 -fx-padding 标签会影响标记和框的大小,并且根据我的问题对它们进行了一些更改。不过,与 RadioButton 一样,主要的变化是从

.CheckBox -> .check-box

我仍然不太明白为什么这会导致任何问题,因为只要正确添加了样式表,它们应该都能正常工作,但在我的例子中,.check-box 是唯一一个按我想要的方式运行的.

希望这对遇到类似问题的人有所帮助!