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

JavaFX tableview可调整和不可调整列

叶翰林
2023-03-14

我有一个TableView,在这个TableView中,有5列。其中一列只包含TableView中的行数,它只是对它们进行计数。以下行为是我想要实现的:

  1. 数字列应具有与其内容相适应的宽度
  2. 数字列不可缩放
  3. 其他列应可调整大小
  4. 当内容太长时,其他列可以并且应该截断它们的内容,以便它们适合TableView的区域,并且不可见水平滚动条

我有5个TableView列,我是这样创建的:

TableColumn numberColumn = new TableColumn("#");
numberColumn.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Vocable, String>, ObservableValue<String>>() {
    @Override
    public ObservableValue<String> call(TableColumn.CellDataFeatures<Vocable, String> vocableCellDataFeature) {
        return new ReadOnlyObjectWrapper(getItems().indexOf(vocableCellDataFeature.getValue()) + "");
    }
});
numberColumn.setResizable(false);
//numberColumn.setMaxWidth(numberColumn.getMaxWidth()-20);

TableColumn<Vocable, String> firstLanguageColumn = new TableColumn<>(Settings.FIRST_LANGUAGE);
firstLanguageColumn.setCellValueFactory(new PropertyValueFactory<>("firstLanguageTranslationsAsString"));
firstLanguageColumn.setMinWidth(100);

TableColumn<Vocable, String> firstLanguagePhoneticScriptColumn = new TableColumn<>(Settings.FIRST_LANGUAGE_PHONETIC_SCRIPT);
firstLanguagePhoneticScriptColumn.setCellValueFactory(new PropertyValueFactory<>("firstLanguagePhoneticScriptsAsString"));
firstLanguagePhoneticScriptColumn.setMinWidth(100);

TableColumn<Vocable, String> secondLanguagePhoneticScriptColumn = new TableColumn<>(Settings.SECOND_LANGUAGE_PHONETIC_SCRIPT);
secondLanguagePhoneticScriptColumn.setCellValueFactory(new PropertyValueFactory<>("secondLanguagePhoneticScriptsAsString"));
secondLanguagePhoneticScriptColumn.setMinWidth(100);

TableColumn<Vocable, String> secondLanguageColumn = new TableColumn<>(Settings.SECOND_LANGUAGE);
secondLanguageColumn.setCellValueFactory(new PropertyValueFactory<>("secondLanguageTranslationsAsString"));
secondLanguageColumn.setMinWidth(100);

getColumns().add(numberColumn);
getColumns().add(firstLanguageColumn);
getColumns().add(firstLanguagePhoneticScriptColumn);
getColumns().add(secondLanguagePhoneticScriptColumn);
getColumns().add(secondLanguageColumn);

getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);

所以我的问题是:如何在JavaFX TableView中实现这种行为?有可能吗?

共有1个答案

燕宏胜
2023-03-14

将列的最大和最小宽度绑定到TableView宽度的一个分数。使分数加起来为1

    ?Col.maxWidthProperty().bind(tableView.widthProperty().multiply(.25));
    ?Col.minWidthProperty().bind(amountCol.maxWidthProperty());

你真该做这样的事

    ?Col.minWidthProperty().bind(tableView.widthProperty().subtract(20).multiply(.25));

但会导致错误。它说不能设置绑定值。,但事实并非如此,因为它只存在减法导致<0的问题。.subtract(-10)很好,除了不是您想要的。

编辑:如果你调整列的大小比表格大,那么你会得到一个滚动条。所以当一个人变大时,其他人就得变小。我发现当所有列都改变一些百分比时,这很烦人,但也许这样是可以接受的。

import javafx.application.Application;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.stage.Stage;

public class TableTest extends Application {

    @Override
    public void start(Stage stage) {
        ObservableList<LineItem> items = FXCollections.observableArrayList();
        items.addAll(new LineItem(1,"string1","string2",123.45),
                     new LineItem(1,"string1","string2",123.45),
                     new LineItem(1,"string1","string2",123.45));

        TableView<LineItem> tableView = new TableView<>(items);

        TableColumn<LineItem,String> numCol = new TableColumn<>("num");
        TableColumn<LineItem,String> descCol = new TableColumn<>("desc");
        TableColumn<LineItem,String> nameCol = new TableColumn<>("name");
        TableColumn<LineItem, Double> amountCol = new TableColumn<>("amount");

        numCol.setCellValueFactory(new PropertyValueFactory<>("num"));
        descCol.setCellValueFactory(new PropertyValueFactory<>("desc"));
        nameCol.setCellValueFactory(new PropertyValueFactory<>("name"));
        amountCol.setCellValueFactory(new PropertyValueFactory<>("amount"));

        tableView.getColumns().addAll(numCol,descCol,nameCol,amountCol);

        //col width logic, or lack thereof
        numCol.setPrefWidth(20);
        numCol.setResizable(false);
        tableView.setColumnResizePolicy((TableView.ResizeFeatures param) -> {
            if (param.getColumn() == null )return false;
            double delta = param.getDelta();
            ObservableList<TableColumn> cols = param.getTable().getColumns();
            int colIdx = cols.indexOf(param.getColumn());
            param.getColumn().setMinWidth(param.getColumn().getWidth() + delta);
            param.getColumn().setMaxWidth(param.getColumn().getWidth() + delta);
            if (colIdx < cols.size() -1){
                cols.get(colIdx+1).setMinWidth(cols.get(colIdx+1).getWidth() - delta);
                cols.get(colIdx+1).setMaxWidth(cols.get(colIdx+1).getWidth() - delta);
            } else {
                stage.setWidth(stage.getWidth() + delta);
            }
            return true;
        });

        Scene scene = new Scene(tableView);
        stage.setScene(scene);
        stage.show();
    }


    public class LineItem {

        private final SimpleIntegerProperty num = new SimpleIntegerProperty();
        private final SimpleStringProperty desc = new SimpleStringProperty();
        private final SimpleStringProperty name = new SimpleStringProperty();
        private final SimpleDoubleProperty amount = new SimpleDoubleProperty();

        public SimpleIntegerProperty numProperty() {return num;}
        public SimpleStringProperty descProperty() {return desc;}
        public SimpleStringProperty nameProperty() {return name;}
        public SimpleDoubleProperty amountProperty() {return amount;}

        public LineItem(int num, String desc, String name, double amount) {
            this.num.set(num); 
            this.desc.set(desc);
            this.name.set(name);
            this.amount.set(amount);
        }
    }
}
 类似资料:
  • 问题内容: 允许用户调整窗口的宽度和高度。是否存在允许用户仅调整高度大小的方法? 谢谢。 编辑: 下面的解决方案似乎不起作用。在360x600 JFrame上, 仍然允许完全拉伸JFrame的宽度,而设置则不允许任何拉伸。 问题答案: 下面的代码可以正确完成工作。

  • jQueryUI提供resizable()方法来调整任何DOM元素的大小。 这种方法简化了元素的大小调整,否则需要花费大量时间和HTML编码。 resizable()方法在项目的右下角显示一个图标以调整大小。 语法 (Syntax) resizable()方法可以使用两种形式 - $(selector,context).resizable(options)方法 $(selector, contex

  • 已经建立了一个小的测试SWING应用程序,有三个面板。一个主JPanel,包含两个较小的JPanel。一个在左边(板面板),另一个在右边(侧板)。通过调用min、preferred和max size方法,两个内部面板都被设置为请求的特定大小。右面板中的一个按钮将父JFrame设置为not re-sizable。在父帧设置为不可调整大小之前,一切看起来都很好,这会导致(?!)调整框架和主面板的大小,

  • 我有一个包含多个的布局,底部有一个按钮。当键盘显示时,我希望我的布局保持在键盘上方。我搜索这个问题,发现应该在清单的标签中放入

  • 问题内容: 我有一个具名的,不需要让用户调整其大小。当然,我可以在每次用户尝试时重新调整它的大小,但是有什么办法不让用户将窗口打开到全屏或拉伸窗口呢? 问题答案: 编辑/更新: Xcode 10.2•Swift 5 NSWindow具有一个称为styleMask的属性,该属性使您可以控制用户可以使用哪种控件。如果不想让用户调整窗口大小,则必须使用mutating方法删除样式掩码.resizable

  • 框架设计采用NetBeans进行。我尝试了所有的解决方案,比如将布局从BorderLayout更改为GridBagLayout,甚至是这里提到的那个。