防止列宽调整大小

时间:2017-10-14 23:43:29

标签: javafx tableview

如何防止列宽调整大小?我有一个表,我想知道我是否可以简单地禁用拖动选项来调整列的宽度。有没有办法做到这一点,或者我是否必须手动设置每列的最大和最小宽度,以便用户无法操作?这个问题是我表格的标题/标题中的文字小于它下面的行中的文字。将宽度设置为列宽会使其变小,然后您无法在下面的单元格中看到信息。

此外,如果有一种方法可以禁用重新排列列,那也很好。我基本上希望我设置的根本不会改变。如果无法做到这一点,我可能只是用自己的图像替换每个表,以便它根本无法操作。

1 个答案:

答案 0 :(得分:1)

防止调整列的大小

here,我们可以知道setResizable(boolean)允许您选择用户是否可以调整列的大小。将max和min width设置为相同的值会阻止用户调整列的大小,但不会阻止用户调整列的大小。此外,用户在尝试调整列的大小时将看到调整大小光标但不会看到默认光标。

防止重新排序列

JavaFX 9

为了防止用户重新排序列,在JavaFX 9引入setReorderable(boolean)isReorderable()reorderableProperty方法和{reorderable之前,没有直接的解决方案。 TableColumnBase类中的{1}}字段。以下是源代码片段:

package javafx.scene.control;
//some imports and JavaDoc comments
@IDProperty("id")
public abstract class TableColumnBase<S,T> implements EventTarget, Styleable {
    //some code
    // --- Reorderable
    /**
     * A boolean property to toggle on and off the 'reorderability' of this column
     * (with drag and drop - reordering by modifying the appropriate <code>columns</code>
     * list is always allowed). When this property is true, this column can be reordered by
     * users simply by dragging and dropping the columns into their desired positions.
     * When this property is false, this ability to drag and drop columns is not available.
     *
     * @since 9
     */
    private BooleanProperty reorderable;
    public final BooleanProperty reorderableProperty() {
        if (reorderable == null) {
            reorderable = new SimpleBooleanProperty(this, "reorderable", true);
        }
        return reorderable;
    }
    public final void setReorderable(boolean value) {
        reorderableProperty().set(value);
    }
    public final boolean isReorderable() {
        return reorderable == null ? true : reorderable.get();
    }
    //some code
}

如果您的应用程序基于JavaFX 9,那么您很幸运。只需在您想要的表格列上调用setReorderable(false)即可。

JavaFX 8

如果您的应用程序基于JavaFX 8或更早版本,则可以使用com.sun.javafx.scene.control.skin.TableHeaderRow,其中包含isReorderingsetReorderingreorderingProperty方法和reorderingProperty领域。以下是源代码片段:

package com.sun.javafx.scene.control.skin;
//some imports and JavaDoc comments
public class TableHeaderRow extends StackPane {
    //some code
    private BooleanProperty reorderingProperty = new BooleanPropertyBase() {
        @Override protected void invalidated() {
            TableColumnHeader r = getReorderingRegion();
            if (r != null) {
                double dragHeaderHeight = r.getNestedColumnHeader() != null ?
                    r.getNestedColumnHeader().getHeight() :
                    getReorderingRegion().getHeight();

                dragHeader.resize(dragHeader.getWidth(), dragHeaderHeight);
                dragHeader.setTranslateY(getHeight() - dragHeaderHeight);
            }
            dragHeader.setVisible(isReordering());
        }

        @Override
        public Object getBean() {
            return TableHeaderRow.this;
        }

        @Override
        public String getName() {
            return "reordering";
        }
    };
    public final void setReordering(boolean value) { reorderingProperty().set(value); }
    public final boolean isReordering() { return reorderingProperty.get(); }
    public final BooleanProperty reorderingProperty() { return reorderingProperty; }
    //some code
}

方法和字段与JavaFX 9中TableColumnBase中的方法和字段的工作方式相同,只是名称不同。

您希望将TableHeaderRow对象作为TableView皮肤的子对象获取:

TableView<MyType> table = new TableView<MyType>();
//some code
//DISPLAY THE TABLE OR GETSKIN WILL RETURN NULL
com.sun.javafx.scene.control.skin.TableHeaderRow header = null;
for (Node node : table.getSkin().getChildren()) 
    if (node instanceof com.sun.javafx.scene.control.skin.TableHeaderRow) 
        header = (com.sun.javafx.scene.control.skin.TableHeaderRow) node;
if (header == null); //Table not rendered
header.setReorderable(false);

在访问外观之前,必须先渲染TableView,因为从TableView.getSkin()获取的TableViewSkin是用户界面控件的直观表示。正如官方JavaFx JavaDoc所说,Skin

  

用于定义用户界面的可视化表示的基类   通过定义表示皮肤的节点的场景图来控制。一个   用户界面控件在Skinnable接口后面抽象。

因此,如果未呈现TableView,则Skin将为null,因为没有任何可视化表示。

请注意,由于Java API中的模块阻止您访问任何sun包,因此无法在Java 9或更高版本中使用第二种方法。

修改

在JavaFX 8或更早版本中,有一个名为impl_setReorderable(boolean)的方法已弃用,但可以完美地运行,与JavaFX 9中的setReorderable(boolean)非常相似。