2013-05-24 19 views
5

TableViewに入れ子になっている列の内容を "スマートに"短縮/切り詰めようとしています。私はUNCONSTRAINED_RESIZE_POLICYを使用しようとしましたが、ウィンドウサイズに基づいて列のサイズが自動的に変更されるので、実際にはCONSTRAINED_RESIZE_POLICYが好きです。私が達成しようとしている何JavaFX TableView Column Width Contents auto-truncating

String one = "SomeVeryLongString"; 

// Displayed in the column where user has shrunk it too narrow 

+-------------+ 
| Some...ring | 
+-------------+ 

// and if the user shrunk it a bit more 

+-----------+ 
| Som...ing | 
+-----------+ 

// and if they stretch it a bit 

+---------------+ 
| SomeV...tring | 
+---------------+ 

// etc... 

私はString長さを読み、自分の切り捨てを行うことの可能性を探っているが、それはユーザーが収縮として、これは動的に更新持ってすることはできません/ guiを伸ばす。私の腸は、TableViewと密接に結びついているので、JavaFX Classesでこれを行う必要があると言いますが、方法は見つけられていません。

JavaFXを使用してこれを行うにはどうすればよいですか?

答えて

7

ソリューション

標準TableCellのデフォルトオーバーラン動作では、それは文字列が切り捨てられたことを示すために、文字列の末尾の文字列と表示...だ切り捨てることです。 JavaFXのすべてのLabeledコントロールはこのように動作します。

ご質問の例では、文字列の中央に楕円記号(...)があります。それを達成するために、適切な細胞工場によって生成されたセルのset the overrun style

setTextOverrun(OverrunStyle.CENTER_WORD_ELLIPSIS); 

はellipsisesに表示されるテキスト文字列は、適切な細胞工場によって生成されたセルにsetting a new ellipsis stringによってmodifedすることができます。

setEllipsisString(ellipsisString); 
これを示し

簡単な表のセルは、次のとおりです。

class CenteredOverrunTableCell extends TableCell<Person, String> { 
    public CenteredOverrunTableCell() { 
     this(null); 
    } 

    public CenteredOverrunTableCell(String ellipsisString) { 
     super(); 
     setTextOverrun(OverrunStyle.CENTER_WORD_ELLIPSIS); 
     if (ellipsisString != null) { 
      setEllipsisString(ellipsisString); 
     } 
    } 

    @Override protected void updateItem(String item, boolean empty) { 
     super.updateItem(item, empty); 
     setText(item == null ? "" : item); 
    } 
} 

サンプルアプリケーション

CenteredOverrunTableCellは、次のサンプルアプリケーションで使用されます。

  1. 姓の欄には、中央にテキストをelidesと姓の列が中央にテキストをelidesが、何のカスタム省略記号文字列を提供しない<--->
  2. のカスタム省略記号文字列を使用しています。
  3. 電子メール列は、デフォルトのオーバーランポリシーと、オーバーラン文字列の末尾に省略記号...を配置する省略記号文字列を使用します。

elidedtableview

import javafx.application.Application; 
import javafx.beans.property.SimpleStringProperty; 
import javafx.collections.*; 
import javafx.geometry.Insets; 
import javafx.scene.Scene; 
import javafx.scene.control.*; 
import javafx.scene.control.cell.PropertyValueFactory; 
import javafx.scene.layout.VBox; 
import javafx.scene.text.Font; 
import javafx.stage.Stage; 
import javafx.util.Callback; 

public class ElidedTableViewSample extends Application { 
    private TableView<Person> table = new TableView<>(); 
    private final ObservableList<Person> data = 
     FXCollections.observableArrayList(
      new Person("Jacob", "Smith", "[email protected]"), 
      new Person("Isabella", "Johnson", "[email protected]"), 
      new Person("Ethangorovichswavlowskikaliantayaprodoralisk", "Llanfairpwllgwyngyllgogerychwyrndrobwyll-llantysiliogogogoch", "[email protected]ch.com"), 
      new Person("Emma", "Jones", "[email protected]"), 
      new Person("Michael", "Brown", "[email protected]") 
     ); 

    public static void main(String[] args) { launch(args); } 

    @Override public void start(Stage stage) { 
     stage.setTitle("Table View Sample"); 
     stage.setWidth(470); 
     stage.setHeight(500); 

     final Label label = new Label("Address Book"); 
     label.setFont(new Font("Arial", 20)); 

     TableColumn firstNameCol = new TableColumn("First Name"); 
     firstNameCol.setCellValueFactory(
       new PropertyValueFactory<Person, String>("firstName")); 
     firstNameCol.setCellFactory(new Callback<TableColumn<Person, String>, TableCell<Person, String>>() { 
      @Override public TableCell<Person, String> call(TableColumn<Person, String> p) { 
       return new CenteredOverrunTableCell("<--->"); 
      } 
     }); 

     TableColumn lastNameCol = new TableColumn("Last Name"); 
     lastNameCol.setCellValueFactory(
       new PropertyValueFactory<Person, String>("lastName")); 
     lastNameCol.setCellFactory(new Callback<TableColumn<Person, String>, TableCell<Person, String>>() { 
      @Override public TableCell<Person, String> call(TableColumn<Person, String> p) { 
       return new CenteredOverrunTableCell(); 
      } 
     }); 

     TableColumn emailCol = new TableColumn("Email"); 
     emailCol.setCellValueFactory(
       new PropertyValueFactory<Person, String>("email")); 

     table.setItems(data); 
     table.getColumns().addAll(
      firstNameCol, 
      lastNameCol, 
      emailCol 
     ); 

     final VBox vbox = new VBox(); 
     vbox.setSpacing(5); 
     vbox.setPadding(new Insets(10)); 
     vbox.getChildren().addAll(label, table); 

     table.setColumnResizePolicy(
      TableView.CONSTRAINED_RESIZE_POLICY 
     ); 

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

    class CenteredOverrunTableCell extends TableCell<Person, String> { 
     public CenteredOverrunTableCell() { 
      this(null); 
     } 

     public CenteredOverrunTableCell(String ellipsisString) { 
      super(); 
      setTextOverrun(OverrunStyle.CENTER_WORD_ELLIPSIS); 
      if (ellipsisString != null) { 
       setEllipsisString(ellipsisString); 
      } 
     } 

     @Override protected void updateItem(String item, boolean empty) { 
      super.updateItem(item, empty); 
      setText(item == null ? "" : item); 
     } 
    } 

    public static class Person { 
     private final SimpleStringProperty firstName; 
     private final SimpleStringProperty lastName; 
     private final SimpleStringProperty email; 

     private Person(String fName, String lName, String email) { 
      this.firstName = new SimpleStringProperty(fName); 
      this.lastName = new SimpleStringProperty(lName); 
      this.email = new SimpleStringProperty(email); 
     } 

     public String getFirstName() { 
      return firstName.get(); 
     } 

     public void setFirstName(String fName) { 
      firstName.set(fName); 
     } 

     public String getLastName() { 
      return lastName.get(); 
     } 

     public void setLastName(String fName) { 
      lastName.set(fName); 
     } 

     public String getEmail() { 
      return email.get(); 
     } 

     public void setEmail(String fName) { 
      email.set(fName); 
     } 
    } 
} 
+0

'setTextOverrunは()'私が探していたまさにです!非常によく一緒に答えをありがとう、ありがとう!もし可能なら+10! – SnakeDoc

関連する問題