user11343077
user11343077

Reputation: 11

Showing an Integer tableview in javaFx as a string

I am trying to show a tableview where when the value in the table is a integer like 1 for example I want to display a String. So far I tried to get the cellValue like this:

public void changeView() {
        if(intervall.getCellFactory().call(intervall).equals(1)) {
            intervall.getCellFactory().call(intervall).setText("Täglich");
        }
    }

And I am calling the method in my initialize after setting the cellvalue.

public void initializeTable() {

        try {

            // Ablesen
            Statement pStatement = connection.createStatement();
            flightList = FXCollections.observableArrayList();
            ResultSet myRs = pStatement
                    .executeQuery("select * from fluglinie where fluggesellschaft =\"" + fluggesellschaft + "\"");
            while (myRs.next()) {
                flightList.add(new flightRouteAddModel(myRs.getString("startFlughafen"),
                        myRs.getString("zielFlughafen"), myRs.getString("startDatum"), myRs.getString("flugzeug"),
                        myRs.getInt("intervall"), myRs.getInt("anzahlEconomy"), myRs.getInt("anzahlBusiness"),
                        myRs.getFloat("preisEconomy"), myRs.getFloat("preisBusines"), myRs.getFloat("distanz")));

            }

        } catch (Exception e) {
            System.out.println(e);

        }


        startAirport.setCellValueFactory(new PropertyValueFactory<>("startAirport"));
        targetAirport.setCellValueFactory(new PropertyValueFactory<>("targetAirport"));
        flightDate.setCellValueFactory(new PropertyValueFactory<>("flightDate"));
        airplane.setCellValueFactory(new PropertyValueFactory<>("airPlane"));
        intervall.setCellValueFactory(new PropertyValueFactory<>("intervall"));
        seatCountEco.setCellValueFactory(new PropertyValueFactory<>("countEconomy"));
        seatCountBus.setCellValueFactory(new PropertyValueFactory<>("countBusiness"));
        priceEco.setCellValueFactory(new PropertyValueFactory<>("priceEconomy"));
        priceBus.setCellValueFactory(new PropertyValueFactory<>("priceBusiness"));
        distance.setCellValueFactory(new PropertyValueFactory<>("distance"));

        table.setItems(flightList);
        changeView();

    }

But it is not working can someone maybe take a look at this? I know changing the db would be maybe a better solution but I kinda wanted to try this workaround

Upvotes: 0

Views: 321

Answers (1)

fabian
fabian

Reputation: 82451

The cellFactory returns TableCells. Calling this yourself does not result in a cell that is part of the TableView (or becomes part of it). Any TableCell with a properly impelemented equals method never yields true, if 1 (or any other Integer) is passed.

Assuming you always want to display Täglich instead of 1, the way to go about this is using a custom cellFactory for this column:

intervall.setCellFactory(col -> new TableCell<flightRouteAddModel, Integer>() {

    @Override
    protected void updateItem(Integer item, boolean empty) {
        String text = "";
        if (item != null) {
            switch(item) {
            case 1:
                text = "Täglich";
                break;
            case 7:
                text = "Wöchentlich";
                break;
            default:
                text = String.format("Alle %d Tage", item);
                break;
            }
        }
        setText(text);
    }

});

BTW: Please learn about the java naming conventions. This makes the code easier to read for other people and it should make this more readable even for yourself, since all java APIs (that I know of) use these conventions: Type names start with an uppercase letter.

Upvotes: 2

Related Questions