当前位置: 首页 > 知识库问答 >
问题:

不使用setCellSelectionEnabled更改焦点上的TableCell样式

寿高阳
2023-03-14

在JavaFX中没有TableView.GetSelectionModel().SetCellSelectionEnabled(true);的情况下,有没有方法在TableView中为TableCell设置样式?

我尝试了此解决方案https://community.oracle.com/thread/3528543?start=0&tstart=0,但它随机无法突出显示行

    tableView.getSelectionModel().setCellSelectionEnabled(true);
    final ObservableSet<Integer> selectedRowIndexes = FXCollections.observableSet();
    final PseudoClass selectedRowPseudoClass = PseudoClass.getPseudoClass("selected-row");


    tableView.getSelectionModel().getSelectedCells().addListener((Change<? extends TablePosition> change) -> {
        selectedRowIndexes.clear();
        tableView.getSelectionModel().getSelectedCells().stream().map(TablePosition::getRow).forEach(row -> {
            selectedRowIndexes.add(row);
        });
    });

    tableView.setRowFactory(tableView -> {
        final TableRow<List<StringProperty>> row = new TableRow<>();
        BooleanBinding selectedRow = Bindings.createBooleanBinding(() ->
                selectedRowIndexes.contains(row.getIndex()), row.indexProperty(), selectedRowIndexes);
        selectedRow.addListener((observable, oldValue, newValue) -> {
                    row.pseudoClassStateChanged(selectedRowPseudoClass, newValue);
                }
        );
        return row;
    });

共有1个答案

太叔天宇
2023-03-14

好吧。因此,只要您的单元格实际获得焦点,向您想要不同样式的列的单元格工厂提供自定义的TableCell将允许您监听TableCell的任何属性,因为您正在自己定义那个TableCell。下面是一个示例,说明如何侦听TableCell的focusedProperty并在发生这种情况时更改样式。

import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class MCVE3 extends Application {
    @Override
    public void start(Stage stage) {
        TableView<ObservableList<String>> table = new TableView<ObservableList<String>>();

        // I have no idea how to get focus on a cell unless you enable cell selection. It does not seem to be possible at all.
        table.getSelectionModel().setCellSelectionEnabled(true);

        // Initializes a column and adds it to the table.
        TableColumn<ObservableList<String>, String> col = new TableColumn<ObservableList<String>, String>("Column");
        col.setCellValueFactory(param -> new SimpleStringProperty(param.getValue().get(0)));

        // Initializes a column and adds it to the table.
        TableColumn<ObservableList<String>, String> col2 = new TableColumn<ObservableList<String>, String>("Column 2");
        col2.setCellValueFactory(param -> new SimpleStringProperty(param.getValue().get(1)));

        // We add a custom cell factory to second column. This enables us to customize the behaviour of the cell.
        col2.setCellFactory(e -> new FocusStyleCell());

        table.getColumns().addAll(col, col2);

        // Add data to the table.
        table.getItems().add(FXCollections.observableArrayList("One", "OneTwo"));
        table.getItems().add(FXCollections.observableArrayList("Two", "TwoTwo"));
        table.getItems().add(FXCollections.observableArrayList("Three", "ThreeTwo"));
        table.getItems().add(FXCollections.observableArrayList("Four", "FourTwo"));

        BorderPane view = new BorderPane();
        view.setCenter(table);

        stage.setScene(new Scene(view));
        stage.show();
    }

    /**
     * A custom TableCell that will change style on focus.
     */
    class FocusStyleCell extends TableCell<ObservableList<String>, String> {
        // You always need to override updateItem. It's very important that you don't forget to call super.updateItem when you do this.
        @Override
        public void updateItem(String item, boolean empty) {
            super.updateItem(item, empty);
            if (item == null || empty) {
                setText(null);
            } else {
                setText(item);
            }
        }

        public FocusStyleCell() {
            // We add a listener to the focusedProperty. newValue will be true when the cell gets focused.
            focusedProperty().addListener((obs, oldValue, newValue) -> {
                if (newValue) {
                    setStyle("-fx-background-color: black;");

                    // // Or add some custom style class:
                    // if (getStyleClass().contains("focused-cell")) {
                    // getStyleClass().add("focused-cell");
                    // }
                } else {
                    // If you instead wish to use style classes you need to
                    // remove that style class once focus is lost.
                    // getStyleClass().remove("focused-cell");
                    setStyle("-fx-background-color: -fx-background");
                }
            });
        }
    }

    public static void main(String[] args) {
        launch();
    }
}
 类似资料:
  • 问题:我想更改输入元素焦点上按钮的样式。 下面是模板代码: 以下是css代码: 预期输出:在输入框 1的焦点上。将1倍宽度的边框应用于输入框 2。更改按钮的背景颜色 实际输出: 1。边框应用于输入框 2。按钮的背景色没有变化 http://jsfiddle.net/6Y8GL/7/

  • 我有一个音乐播放器活动来控制歌曲的播放。我已经阅读了有关管理音频焦点的文档,并在

  • 我第一次学习材料界面。我想自定义材质UI的文本字段。当文本字段未被选中时,我可以更改其样式;当文本字段聚焦时,我无法更改其样式。我正在使用将样式注入组件。我试过这个密码 问题: 如何更改焦点文本字段的样式?我们将不胜感激

  • 当将html输入与样式化组件一起使用并将值保存为react state with onChange时,组件似乎会在每次状态更改时重新呈现,并导致输入失去焦点。有没有办法防止输入失去焦点?为什么会发生这种情况?这里有一个例子。

  • 问题内容: 聚焦输入字段时如何更改占位符的颜色?我使用此CSS设置默认颜色,但是如何更改焦点? 问题答案: 试试这个,这应该工作:

  • 问题内容: 可以更改按钮功能吗? 例如 点击,再点击一次 我已经尝试过类似,但没有结果。 我设法使叠加工作并在其中插入所需的数据。但是没有找到任何可以帮助我的帖子。我正在使用react-bootstrap。这是我的代码。 问题答案: 您可以尝试使用状态来存储颜色。也许这会让您想到解决问题的方法: 这是一个小提琴。