2014-09-06 84 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