我有一张桌子。它有一个语音频道列表。每行都有一个切换按钮,可以收听或静音通道。我有两个侦听器,一个用于单击一行,另一个用于选择切换按钮。如果单击一行,如何更改按钮状态? (比如我点击“语音频道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);
}
}
我似乎无法让听众互相交谈。我在网上看到一个使用回调的例子,但我不熟悉这个过程。