Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Populating JavaFX TableView with Enum data

I'm working on an Javafx Application for a game. I got some Data stored in an enum but can't seem to figure out how to easily add the data to JavaFX TableView, can someone help me out. I'll be using fxml to style the TableView.

I would like every enum vallue in an seperate row, in the columns i would like to have:

  1. Icon as an Image.
  2. Rank as an Integer.
  3. Level as an Integer.
  4. Experience as an Integer.

The Enum:

package org.fryslan.ec.hiscore;

import org.fryslan.ec.Core;

public enum Hiscore {

OVERALL(0, "Overall", null),
ATTACK(1, "Attack", "skill_icon_attack.gif"),
DEFENCE(2, "Defence", "skill_icon_defence.gif"),
STRENGTH(3, "Strength", "skill_icon_strength.gif"),
HITPOINTS(4, "Hitpoints", "skill_icon_hitpoints.gif"),
RANGED(5, "Ranged", "skill_icon_ranged.gif"),
PRAYER(6, "Prayer", "skill_icon_prayer.gif"),
MAGIC(7, "Magic", "skill_icon_magic.gif"),
COOKING(8, "Cooking", "skill_icon_cooking.gif"),
WOODCUTTING(9, "Woodcutting", "skill_icon_woodcutting.gif"),
FLETCHING(10, "Fletching", "skill_icon_fletching.gif"),
FISHING(11, "Fishing", "skill_icon_fishing.gif"),
FIREMAKING(12, "Firemaking", "skill_icon_firemaking.gif"),
CRAFTING(13, "Crafting", "skill_icon_crafting.gif"),
SMITHING(14, "Smithing", "skill_icon_smithing.gif"),
MINING(15, "Mining", "skill_icon_mining.gif"),
HERBLORE(16, "Herblore", "skill_icon_herblore.gif"),
AGILITY(17, "Agility", "skill_icon_agility.gif"),
THIEVING(18, "Thieving", "skill_icon_thieving.gif"),
SLAYER(19, "Slayer", "skill_icon_slayer.gif"),
FARMING(20, "Farming", "skill_icon_farming.gif"),
RUNECRAFTING(21, "Runecrafting", "skill_icon_runecraft.gif"),
HUNTER(22, "Hunter", "skill_icon_hunter.gif"),
CONSTRUCTION(23, "Construction", "skill_icon_construction.gif");

private int id;
private String name;
private String icon;
private final String ICON_LOCATION = Core.class.getResource("\\resources\\hiscore\\").getPath();
public static String hiscoreData;

Hiscore(int id, String name, String icon) {
    this.id = id;
    this.name = name;
    this.icon = icon;
}

public int getId() {
    return id;
}

public String getName() {
    return name;
}

public int getRank() {
    String data = hiscoreData.split(" ")[id];
    return Integer.parseInt(data.split(",")[0]);
}

public int getLevel() {
    String data = hiscoreData.split(" ")[id];
    return Integer.parseInt(data.split(",")[1]);
}

public int getExperience() {
    String data = hiscoreData.split(" ")[id];
    return Integer.parseInt(data.split(",")[2]);
}

public String getIcon() {
    return ICON_LOCATION + icon;
}
}
like image 894
Piet Jetse Avatar asked Oct 31 '25 10:10

Piet Jetse


1 Answers

There's really no difference because you are using an enum: this just works exactly the same way as it would for any other class. I.e your FXML looks like

<TableView fx:id="table">
  <columns>
    <TableColumn fx:id="iconCol" text="Icon"/>
    <TableColumn fx:id="rankCol" text="Rank"/>
    <TableColumn fx:id="levelCol" text="Level"/>
    <TableColumn fx:id="experience" text="Experience"/>
  </columns>
</TableView>

Then in your controller you do

public class Controller {

    @FXML
    private TableView<Hiscore> table ;
    @FXML
    private TableColumn<Hiscore, String> iconCol ;
    @FXML
    private TableColumn<Hiscore, Number> rankCol ;
    @FXML
    private TableColumn<Hiscore, Number> levelCol ;
    @FXML
    private TableColumn<Hiscore, Number> experienceCol ;

    public void initialize() {
        iconCol.setCellValueFactory(cellData -> new SimpleStringProperty(cellData.getValue().getIcon()));
        rankCol.setCellValueFactory(cellData -> new SimpleIntegerProperty(cellData.getValue().getRank()));
        // etc etc
    }
}

To display the icon as an image, you need a cell factory on the iconCol:

iconCol.setCellFactory(col -> new TableCell<Hiscore, String>() {
    private final ImageView imageView = new ImageView();
    @Override 
    protected void updateItem(String imageURL, boolean empty) {
        super.updateItem(image, empty) ;
        if (empty) {
            setGraphic(null);
        } else {
            Image image = new Image(imageURL, true);
            imageView.setImage(image);
            setGraphic(imageView);
        }
    }
});

This of course assumes that the getIcon() method is returning the appropriate URL for the image. (ICON_LOCATION makes no sense to me: why do you have backslashes in a URL?)

Finally, you can populate the table with

table.getItems().addAll(Hiscore.values());
like image 115
James_D Avatar answered Nov 03 '25 01:11

James_D



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!