Радиокнопки JavaFX не работают (невозможно выбрать) - PullRequest
0 голосов
/ 17 февраля 2019

Я хочу создать проект, который конвертирует разные базы, но мои радиокнопки не работают.Я делаю три разных VBox, чтобы добавить кнопки, но работает только третий столбец.Я довольно новичок в JavaFX, поэтому я был бы признателен, если бы кто-нибудь мог мне помочь.Спасибо!Вот мой код

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.RadioButton;
import javafx.scene.control.TextField;
import javafx.scene.control.ToggleGroup;
import javafx.scene.layout.*;
import javafx.scene.text.Text;
import javafx.scene.text.TextAlignment;
import javafx.stage.Stage;

import java.math.BigInteger;

public class Main extends Application {

private ToggleGroup group;
private TextField txtfield;
private TextField output;
private int base = 10;

public static void main(String[] args) {
    launch(args);
}

@Override
public void start(Stage primaryStage) {
    BorderPane root = new BorderPane();
    StackPane title = new StackPane();
    Text t = new Text("Gib die Basis und die Zahl ein!");
    t.setTextAlignment(TextAlignment.CENTER);
    title.getChildren().add(t);
    FlowPane center = new FlowPane();
    center.setPrefSize(400, 300);
    HBox input = new HBox();
    VBox base1 = new VBox();
    VBox base2 = new VBox();
    VBox base3 = new VBox();
    input.setPrefSize(400, 100);
    base1.setPrefSize(50, 150);
    base2.setPrefSize(50, 150);
    base3.setPrefSize(50, 150);
    group = new ToggleGroup();
    for (int i = 2; i < 35; i++) {
        RadioButton b = new RadioButton(String.valueOf(i));
        if (i == 10) {
            b.setSelected(true);
        }
        b.setToggleGroup(group);
        b.setOnMouseClicked(mouseEvent -> {
            base = Integer.valueOf(b.getText());
            update();
        });

        if (i % 3 == 2) {
            base1.getChildren().add(b);
            b.setTranslateX(110);
        } else if (i % 3 == 0) {
            base2.getChildren().add(b);
            b.setTranslateX(120);
        } else {
            base3.getChildren().add(b);
            b.setTranslateX(130);
        }
    }
    output = new TextField();
    txtfield = new TextField();
    txtfield.setTranslateY(50);
    txtfield.setTranslateX(100);
    txtfield.setOnKeyTyped(keyEvent -> {
        update();
    });
    input.getChildren().add(txtfield);
    center.getChildren().add(input);
    center.getChildren().add(base1);
    center.getChildren().add(base2);
    center.getChildren().add(base3);
    root.setCenter(center);
    root.setTop(title);
    root.setBottom(output);
    primaryStage.setScene(new Scene(root, 400, 400));
    primaryStage.show();
}

private void update() {

    try {
        output.setText(String.valueOf(new BigInteger(txtfield.getText(), base)));
    } catch (NumberFormatException e) {
        output.setText("Nan");
    }
}
}

Вот как программа должна (и выглядит) как Appliaction

1 Ответ

0 голосов
/ 17 февраля 2019

Я полагаю, что использование вами StackPane может блокировать события мыши от регистрации на ваших RadioButtons.

Хотя я обычно не делаю этого, ниже приведен реконфигурированный макет, который вы можете использовать в качестве прыжкаТочка отклонения для вашего кода.Я немного упростил раскладку, и все радиокнопки работают по желанию:

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.RadioButton;
import javafx.scene.control.TextField;
import javafx.scene.control.ToggleGroup;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class scratch_1 extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {

        VBox root = new VBox(10);
        root.setAlignment(Pos.CENTER);
        root.setPadding(new Insets(10));

        Label lblTitle = new Label("Gib die Basis und die Zahl ein!");
        root.getChildren().add(lblTitle);

        // The input TextField
        TextField txtInput = new TextField();
        root.getChildren().add(txtInput);

        // HBox to hold our three columns
        HBox hBoxSelections = new HBox(20);
        hBoxSelections.setAlignment(Pos.CENTER);

        // Use a GridPane for our RadioButton grid
        GridPane gridSelections = new GridPane();
        gridSelections.setAlignment(Pos.CENTER);
        gridSelections.setHgap(10);
        gridSelections.setVgap(5);

        // Our ToggleGroup to which all RadioButtons will belong
        ToggleGroup groupSelections = new ToggleGroup();

        // We need 11 rows of 3 RadioButtons, let's use a couple of for loops to populate the GridPane
        int counter = 2;
        for (int i = 0; i < 11; i++) {
            for (int j = 0; j < 3; j++) {
                RadioButton radioButton = new RadioButton("" + counter);
                radioButton.setToggleGroup(groupSelections);

                gridSelections.add(radioButton, j, i);
                counter++;
            }
        }

        // Let's add the GridPane to our root layout
        root.getChildren().add(gridSelections);

        primaryStage.setScene(new Scene(root, 400, 400));
        primaryStage.show();
    }
}

Результат:

screenshot


Обратите внимание, что я работал с вашей предыдущей публикации кода, поскольку, следовательно, в приведенном выше примере не указан ваш метод update() (или какая-либо логика, в этом отношении).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...