2014-09-06 47 views
1

我有一个TableView,在这个TableView中有5列。其中一列只包含TableView中的行数,它只是对它们进行计数。下面的行为就是我想实现:JavaFX tableview resizeable and unresizeable列

  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中实现这种行为?可能吗?

回答

0

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

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

你应该很喜欢这个

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

东西除了会导致一个错误。它说A bound value cannot be set.但这不是真的,因为它只有一个减法的问题导致< 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); 
     } 
    } 
} 
+0

有趣的是,我不知道我也可以绑定这些属性!这至少可以帮助我调整其他(可调整大小)的宽度。但是,当我调整应用程序窗口大小时,此解决方案会导致调整表格列的大小。我希望以某种方式获得它,因为它的内容只需占用足够的空间,而且不会调整大小。那可能吗? – Zelphir 2014-09-08 14:28:00

+0

也许你想要[这个。 ](http://docs.oracle.com/javafx/2/api/javafx/scene/control/TableView.html#CONSTRAINED_RESIZE_POLICY)。但列不会调整大小。也许你需要一些自定义行为,如果是这样,我认为这是另一个问题。 – brian 2014-09-08 15:54:16

+0

这会让他们都变得难以理解。我正在寻找的东西,使numberColumn unresizeable,但留下其他的可调整大小 - 我知道,非常特殊;) – Zelphir 2014-09-08 19:14:24