2016-02-29 105 views
2

我正在为一款游戏开发Javafx应用程序。 我有一些数据存储在一个枚举中,但似乎无法弄清楚如何轻松地将数据添加到JavaFX TableView,有人可以帮我一把。 我将使用fxml来设计TableView。使用枚举数据填充JavaFX TableView

我想一个单独的行中的每个枚举vallue,在列我想有:

  1. 图标为图像。
  2. 排名为整数。
  3. 作为整数的等级。
  4. 经验作为一个整数。

枚举:

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; 
} 
} 
+1

要在表中显示的是什么,也就是你想每个枚举值有一行,每列有哪些内容? –

+0

首先将图标列为图像。 第二列排列为整数。 作为整数的第三列级别。 作为整数的第四列体验。 和每个Enum Vallue分开排列。 –

回答

3

确实没有区别,因为你使用的是enum:这只是工程完全相同的方式,因为它会为任何其他类一样。即你的FXML看起来像

<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> 

然后在你的控制器,你做

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 
    } 
} 

要显示的图标为图像,您需要在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); 
     } 
    } 
}); 

这当然假定getIcon()方法正在为图像返回适当的URL。 (ICON_LOCATION是没有意义的我:为什么你有反斜杠的网址是什么?)

最后,您可以填充表

table.getItems().addAll(Hiscore.values()); 
+0

感谢作品的魅力 –