如何在 JavaFx 中创建具有 2-Way 排他性的单选按钮

How to create Radio buttons with 2-Way Exclusivity in JavaFx

我想构建类似 this 的东西。从 k 值和 Map 我想建立一个评分系统, k value 是最大投票数,map 中有 keys of names 一些人群,并将人名列表作为值。

这里我们有一个丑陋且无法使用 k=3

的预览

<table>
<tr>
    <th></th>
    <th>1</th>
    <th>2</th>
    <th>3</th>
</tr>
Group1
<tr>
    <td>Name11</td>
    <td><input type="radio" name="row-1"></td>
    <td><input type="radio" name="row-1"></td>
    <td><input type="radio" name="row-1"></td>
</tr>
<tr>
    <td>Name12</td>
    <td><input type="radio" name="row-2"></td>
    <td><input type="radio" name="row-2"></td>
    <td><input type="radio" name="row-2"></td>
</tr>
<tr>
    <td>Name13</td>
    <td><input type="radio" name="row-3"></td>
    <td><input type="radio" name="row-3"></td>
    <td><input type="radio" name="row-3"></td>
</tr>
</table>

<table>
<tr>
    <th></th>
    <th>1</th>
    <th>2</th>
    <th>3</th>
</tr>
<br>
Group2
<tr>
    <td>Name21</td>
    <td><input type="radio" name="row-4"></td>
    <td><input type="radio" name="row-4"></td>
    <td><input type="radio" name="row-4"></td>
</tr>
<tr>
    <td>Name22</td>
    <td><input type="radio" name="row-5" name="col-1"></td>
    <td><input type="radio" name="row-5"></td>
    <td><input type="radio" name="row-5"></td>
</tr>

</table>

我同意@jewelsea 在评论中提到的内容。话虽如此,在完成 link 中的演示后,我想尝试一下,看看如何实现。

到目前为止我使用的技巧是:

  • 按行或列设置切换组。
  • 创建两个 与您为 toogle 选择的相反的维数组 团体。我是说,
    • 如果您选择按行切换组,则创建一个 以列为第一维的二维数组。
    • 如果您选择按列切换组,则创建一个 按行排列的二维数组第一维。

现在,当 select 编辑单选按钮时,切换组将负责一维切换。您只需检查其他维度的单选按钮和 select 正确的单选按钮.

逻辑代码如下:

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.RadioButton;
import javafx.scene.control.ToggleGroup;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;

public class TwoWayRadioButtonDemo extends Application {
    @Override
    public void start(Stage stage) throws Exception {
        int k = 4;
        GridPane root = new GridPane();
        root.setPadding(new Insets(50));
        root.setHgap(60);
        root.setVgap(60);

        RadioButton[][] buttons = new RadioButton[k][k];
        for (int i = 0; i < k; i++) {
            ToggleGroup tg = new ToggleGroup();
            double r = i;
            for (int j = 0; j < k; j++) {
                RadioButton radio = new RadioButton();
                radio.setToggleGroup(tg);
                buttons[j][i] = radio;
                int c = j;
                radio.selectedProperty().addListener((obs, old, val) -> {
                    if (val) {
                        for (int t = 0; t < buttons[c].length; t++) {
                            buttons[c][t].setSelected(t == r);
                        }
                    }
                });
                root.add(radio, j, i);
            }
        }
        Scene scene = new Scene(root);
        stage.setScene(scene);
        stage.setTitle("2 Way Radio Button");
        stage.show();
    }
}