如何在 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();
}
}
我想构建类似 this 的东西。从 k 值和 Map
这里我们有一个丑陋且无法使用 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();
}
}