2014-07-18 42 views
3

我想获取可处理单元格中的文本溢出到相邻单元格。我相信我不久前读到表格或treetables中没有Span函数,但它可能通过css完成。JavaFX Table/TreeTable Cell Overflow

看到这个图片。我希望第一个单元格中的日期能够延伸过去,以便可以读取它。

http://imgur.com/KvK0adK

我想我会用-overflow:可见;但我在Oracle文档中阅读:

JavaFX CSS不支持CSS布局属性,例如float,position,overflow和width。

任何人都可以在正确的方向指向我吗? CSS会更好,但是一个自定义TreeTableRow会是正确的解决方案吗?

在此先感谢。

+0

请参阅[RT-22593 Labeled popover overflow display](https://javafx-jira.kenai.com/browse/RT-22593)了解相关功能要求。 – jewelsea

+0

看起来很相似但不同(看起来他们很快就没有看到)。你认为自定义treeTableRow会工作吗? (顺便说一句,你这个人在你以前的所有帮助中都很...帮助我快速学习javafx,感谢你的工作)。 – Dustin

回答

2

样品溶液

这里是一个TableView中溢出的细胞,你也许可以适应它的TreeTableView。

class OverflowCell extends TableCell<Person, String> { 
    private Label overflowLabel = new Label(); 
    private Group overflowGroup = new Group(overflowLabel); 

    public OverflowCell() { 
     // destroy the clip. 
     clipProperty().addListener((observable, oldClip, newClip) -> { 
      if (newClip != null) { 
       setClip(null); 
      } 
     }); 
    } 

    @Override 
    protected void updateItem(String item, boolean empty) { 
     super.updateItem(item, empty); 

     if (empty || item == null) { 
      setGraphic(null); 
     } else { 
      overflowLabel.setText(item); 
      setGraphic(
       overflowGroup 
      ); 
     } 
    } 
} 

通常在TableView中细胞被削波,所以收听者在OverflowCell的构造添加到除去任何剪辑加入到细胞。 updateItem调用使用一个Group,这样标签的大小不会调整为小于它的首选大小并被忽略。

有可能有其他方法来做到这一点。自定义的行工厂可能是替代解决方案。这个OverflowCell黑客只是一个简单的想法。

示例代码

这是它在行动,你可以看到在第一行的最后一个名字是如何溢出到下一列。

overflow

道歉的代码在这里的量。

import javafx.application.Application; 
import javafx.beans.property.SimpleStringProperty; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.geometry.Insets; 
import javafx.scene.Group; 
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; 

public class TableCellOverflow extends Application { 

    private TableView<Person> table = new TableView<>(); 
    private final ObservableList<Person> data = 
      FXCollections.observableArrayList(
        new Person("Jacob", "Krzyzanowski", ""), 
        new Person("Isabella", "Johnson", "[email protected]"), 
        new Person("Ethan", "Williams", "[email protected]"), 
        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) { 
     Scene scene = new Scene(new Group()); 
     stage.setTitle("Table View Sample"); 

     table.setPrefHeight(200); 

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

     TableColumn<Person, String> firstNameCol = new TableColumn<>("First Name"); 
     firstNameCol.setMaxWidth(80); 
     firstNameCol.setCellValueFactory(
       new PropertyValueFactory<>("firstName")); 
     firstNameCol.getStyleClass().add("left-header"); 

     TableColumn<Person, String> lastNameCol = new TableColumn<>(); 
     lastNameCol.setMaxWidth(60); 
     lastNameCol.setCellValueFactory(
       new PropertyValueFactory<>("lastName")); 
     lastNameCol.setCellFactory(param -> new OverflowCell()); 

     TableColumn<Person, String> emailCol = new TableColumn<>("Email"); 
     emailCol.setMaxWidth(100); 
     emailCol.setCellValueFactory(
       new PropertyValueFactory<>("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); 

     ((Group) scene.getRoot()).getChildren().addAll(vbox); 

     stage.setScene(scene); 
     stage.show(); 
    } 

    class OverflowCell extends TableCell<Person, String> { 
     private Label overflowLabel = new Label(); 
     private Group overflowGroup = new Group(overflowLabel); 

     public OverflowCell() { 
      // destroy the clip. 
      clipProperty().addListener((observable, oldClip, newClip) -> { 
       if (newClip != null) { 
        setClip(null); 
       } 
      }); 
     } 

     @Override 
     protected void updateItem(String item, boolean empty) { 
      super.updateItem(item, empty); 

      if (empty || item == null) { 
       setGraphic(null); 
      } else { 
       overflowLabel.setText(item); 
       setGraphic(
         overflowGroup 
       ); 
      } 
     } 
    } 

    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

嘿,这很好。我添加了“-fx-table-cell-border-color:transparent;”到CSS来隐藏垂直网格线,现在看起来很完美。谢谢 – Dustin