当前位置: 首页 > 知识库问答 >
问题:

使用枚举数据填充JavaFX TableView

公良弘毅
2023-03-14

我正在为一个游戏开发Javafx应用程序。我有一些数据存储在枚举中,但似乎不知道如何轻松地将数据添加到JavaFX TableView,有人能帮我一下吗。我将使用fxml为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个答案

范甫
2023-03-14

因为您使用的是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);
        }
    }
});
table.getItems().addAll(Hiscore.values());
 类似资料:
  • 问题内容: 我有一个表映射String-> Integer。 我想用数据库中的值填充该枚举,而不是静态地创建一个枚举。这可能吗 ? 因此,与其静态地解决这个问题,不如: 我想动态创建这个枚举,因为数字{0,1,2,3}基本上是随机的(因为它们是由数据库的AUTOINCREMENT列自动生成的)。 问题答案: 否。枚举始终固定在编译时。您执行此操作的唯一方法是动态生成相关的字节码。 话虽如此,您可能

  • 问题内容: 有没有一种方法可以填充JavaFX 或枚举的所有枚举? 这是我尝试的: 在另一个类中,我试图填充一个: 但是我得到一个错误: 我显然也遇到了同样的问题。 问题答案: 如果setItems需要一个ObservableList,则必须给它一个而不是一个数组。 试试这个: 编辑:James_D(请参阅注释)的解决方案是首选的解决方案:

  • 问题内容: 我想用一个枚举的所有可能值来填充列表 自从我最近爱上了,我就利用了 是否有更好的方法 (如在未混淆的衬管中)达到相同的结果? 问题答案: 我不会在一开始使用List,因为EnumSet更合适,但是您可以 要么

  • 问题内容: 我正在尝试使用我的Derby数据库数据填充Netbeans GUI-builder jTable。 我在Account.java类中使用以下代码: 理想情况下,我希望能够返回其中包含参数数据和列的tableModel,因为我知道在GUI中执行此方法是一种不好的做法。在线上的所有教程都没有显示如何将数据发送到另一个类,它们只是在GUI类中执行数据库代码。 我有一个错误,它看不到数据和列,

  • 我在Account.java类中使用以下代码: 理想情况下,我希望能够返回包含参数数据和列的tableModel,因为我知道在我的GUI中使用这种方法是不好的做法。所有在线教程都没有显示如何将数据发送到另一个类,它们只是在GUI类中执行数据库代码。 我有一个错误,它无法看到数据和列,因为它们是在我的方法的一个不可访问的部分中声明和使用的。在我完成这些之后,我需要找到一种方法来将它传递给我的GUI类

  • series(string $value,[ string $categories]) string $value $config = ['path' => './tests']; ​ $fileObject = new \Vtiful\Kernel\Excel($config); ​ $fileObject = $fileObject->fileName('tutorial.xlsx'); $