javafx - 使ListView无法通过鼠标选择

时间:2013-12-16 21:57:47

标签: listview javafx selection

JavaFX中是否有一个选项可以取消通过鼠标选择ListView项目的可能性?

我想在没有任何用户互动的情况下显示ListView

7 个答案:

答案 0 :(得分:13)

您也可以尝试:

listview.setMouseTransparent( true );
listView.setFocusTraversable( false );

答案 1 :(得分:8)

将列表设置为鼠标透明也会阻止具有可交互自定义列表单元格的单元格接受焦点。

理想的解决方案是使用特殊选择模型:

import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.control.MultipleSelectionModel;

public class NoSelectionModel<T> extends MultipleSelectionModel<T> {

    @Override
    public ObservableList<Integer> getSelectedIndices() {
        return FXCollections.emptyObservableList();
    }

    @Override
    public ObservableList<T> getSelectedItems() {
        return FXCollections.emptyObservableList();
    }

    @Override
    public void selectIndices(int index, int... indices) {
    }

    @Override
    public void selectAll() {
    }

    @Override
    public void selectFirst() {
    }

    @Override
    public void selectLast() {
    }

    @Override
    public void clearAndSelect(int index) {
    }

    @Override
    public void select(int index) {
    }

    @Override
    public void select(T obj) {
    }

    @Override
    public void clearSelection(int index) {
    }

    @Override
    public void clearSelection() {
    }

    @Override
    public boolean isSelected(int index) {
        return false;
    }

    @Override
    public boolean isEmpty() {
        return true;
    }

    @Override
    public void selectPrevious() {
    }

    @Override
    public void selectNext() {
    }
}

然后在列表视图中设置模型:

listView.setSelectionModel(new NoSelectionModel<MyType>());

答案 2 :(得分:5)

您可以使用事件处理程序阻止列表视图鼠标单击购买

listview.addEventFilter(MouseEvent.MOUSE_PRESSED, new EventHandler<MouseEvent>() {

            @Override
            public void handle(MouseEvent event) {
                System.out.println(">> Mouse Clicked");
                event.consume();
            }
        });

答案 3 :(得分:1)

Mordechai的方法非常有效。
我试图用JFoenix JFXListView的另一个添加项发表评论,但是代码格式不好,所以我创建了这个答案:

如果您使用的是JFoenix和JFXListView,则还具有在单元格选择上仍然可以看到JFXRippler的行为。
为了防止这种情况或更改涟漪效果,请覆盖单元格工厂:

//Replace T with your specific type.
listView.setCellFactory(param -> new JFXListCell<T>(){
          @Override
          protected void updateItem(T item, boolean empty) {
              super.updateItem(item, empty);
              cellRippler = new JFXRippler(); //create empty rippler
          }
      });

答案 4 :(得分:0)

也许这个Pointe你正确的方向? 限制焦点1

如果不是,设置自定义FocusModel可能有帮助吗?

答案 5 :(得分:0)

          @Override
          protected void updateItem(T item, boolean empty) {
              super.updateItem(item, empty);
              updateSelected(false);
          }

每次单击一个单元格时,都会调用该单元格的updateItem,因此您可以在此处取消选择它。如果检查基类Cell.java。它使用这种方法来防止选择空单元格。

    protected void updateItem(T item, boolean empty) {
        setItem(item);
        setEmpty(empty);
        if (empty && isSelected()) {
            updateSelected(false);
        }
    }

答案 6 :(得分:0)

尝试输入代码:

list.setFocusTraversable( false );

和CSS

.list-cell:odd, .list-cell:even
{
    -fx-background-color: white;
    -fx-text-fill: black;
}