如果我使用 JavaFX 选择一行,如何激活 Tableview 中的切换按钮?

问题描述 投票:0回答:0

我有一张桌子。它有一个语音频道列表。每行都有一个切换按钮,可以收听或静音通道。我有两个侦听器,一个用于单击一行,另一个用于选择切换按钮。如果单击一行,如何更改按钮状态? (比如我点击“语音频道1”,那一排的按钮变成了“静音”,换句话说,如果我选择一个频道,我会自动开始收听)。

public class VoiceChannel {
    private final StringProperty voiceChannelName = new SimpleStringProperty();

    public VoiceChannel(String userName) {
        setVoiceChannelName(userName);
    }

    public final StringProperty voiceChannelNameProperty() {
        return this.voiceChannelName;
    }

    public final String getVoiceChannelName() {
        return this.voiceChannelNameProperty().get();
    }

    public final void setVoiceChannelName(String voiceChannelName) {
        this.voiceChannelNameProperty().set(voiceChannelName);
    }
}
public class Main extends Application {
    @Override
    public void start(Stage stage) {

        TableView<VoiceChannel> voiceChannelTable = new TableView<>();
        TableColumn<VoiceChannel, String> voiceChannelNameColumn = new TableColumn<>("Channel Name");
        voiceChannelNameColumn.setCellValueFactory(cellData ->    cellData.getValue().voiceChannelNameProperty());
        TableColumn<VoiceChannel, VoiceChannel> ListenMuteColumn = new TableColumn<>("Listen/Mute");
        ListenMuteColumn.setCellValueFactory(cellData -> new ReadOnlyObjectWrapper<>(cellData.getValue()));

        ObservableSet<VoiceChannel> channels = FXCollections.observableSet();
        channels.add(new VoiceChannel("Voice Channel 1"));
        channels.add(new VoiceChannel("Voice Channel 2"));
        channels.add(new VoiceChannel("Voice Channel 3"));
        channels.add(new VoiceChannel("Voice Channel 4"));
        channels.add(new VoiceChannel("Voice Channel 5"));

        voiceChannelTable.getSelectionModel().selectedItemProperty().addListener((observableValue, oldValue, newValue) -> {
            if(newValue != null) {
                System.out.println(newValue.getVoiceChannelName() + " selected");
            }
        });

        ListenMuteColumn.setCellFactory(c -> new TableCell<>() {
            private final ToggleButton button = new ToggleButton();
            {
                button.selectedProperty().addListener((obs, wasSelected, isNowSelected) -> {
                    if (isNowSelected) {
                        System.out.println("Now listening to " + getItem().getVoiceChannelName());
                    } else {
                        System.out.println(getItem().getVoiceChannelName() + " muted");
                    }
                });
                button.textProperty().bind(Bindings.when(button.selectedProperty()).then("Mute").otherwise("Listen"));
                setAlignment(Pos.CENTER);
            }

            @Override
            public void updateItem(VoiceChannel item, boolean empty) {
                super.updateItem(item, empty);
                if (empty) {
                    setGraphic(null);
                } else {
                    setGraphic(button);
                }
            }
        });

        voiceChannelTable.getColumns().add(voiceChannelNameColumn);
        voiceChannelTable.getColumns().add(ListenMuteColumn);

        voiceChannelTable.getItems().addAll(channels);

        Scene scene = new Scene(new BorderPane(voiceChannelTable), 400, 300);
        stage.setScene(scene);
        stage.show();
    }

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

}

我似乎无法让听众互相交谈。我在网上看到一个使用回调的例子,但我不熟悉这个过程。

javafx tableview togglebutton listen
© www.soinside.com 2019 - 2024. All rights reserved.