2012. március 5., hétfő

Cellaformázás JavaFX 2-ben

A szakdolim felületének építése során előjött egy érdekesség, amiről nem szól a fáma... akarom mondani a JavaFX tutorial: a TableView egyik oszlopában én linkeket szerettem volna látni, azaz kék, aláhúzott kattintható szöveget.

A TableView ugye egy megadott osztályhoz készül, és ennek mezőihez lehet megfeleltetni oszlopokat. A táblázat adatforrása pedig a megadott osztály példányaiból álló lista. (Ebben most nem fogok elmerülni, példakódhoz lásd: TableView tutorial)

Mivel a TableColumn osztályban nincs lehetőség formázásra, oszlop szinten, a cellaépítő függvényt kell kiegészíteni.

Tegyük fel, hogy van egy Link osztályom, aminek van egy url nevű String mezője, egy getterrel, és ehhez készítem az oszlopot. Eképpen sikerült megoldani (utána magyarázom):

TableColumn linkCol = new TableColumn("URL");
linkCol.setPrefWidth(250);
linkCol.setCellValueFactory(new PropertyValueFactory<Link, String>("url"));
final Callback<TableColumn<Link, String>, TableCell<Link, String>> cf
    = linkCol.getCellFactory();
linkCol.setCellFactory(
    new Callback<TableColumn<Link, String>, TableCell<Link, String>>() {

    public TableCell<Link, String> call(TableColumn<Link, String> param) {
        final TableCell<Link, String> cell = cf.call(param);
        cell.setStyle("-fx-text-fill: blue; -fx-underline: true");
        cell.setOnMouseClicked(new EventHandler<MouseEvent>() {

            public void handle(MouseEvent event) {
                System.out.println("LINK: " + cell.getText());
                // avagy: java.awt.Desktop.getDesktop().browse(
                //                          new URI(cell.getText()));
                // (persze a megfelelő előzetes ellenőrzésekkel)
            }
        });
        return cell;
    }
});

Vagyis először létrehozom és beállítom az oszlopot, utána lekérem a függvényt, amivel a JavaFX felépítene egy cellát, majd készítek egy saját cellaépítőt. Ebben az elsődleges dolog: meghívom a default cellaépítőt, amit lekértem az előbb, így már csak a plusz formázást kell hozzáadnom, illetve a kattintás eseménykezelőjét.