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

listview单元工厂项目

梁兴修
2023-03-14

我正在使用JavaFX ListView组件,并希望使用一个自定义的单元工厂。当包含列表视图的对话框打开时,项目将正确呈现。但是,如果我尝试从基础的可观察列表中添加或删除一个项,则列表视图中的项不会正确呈现。我会让细胞复制或缺失。下面是我的自定义单元格的FXML:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?>
<?import org.controlsfx.glyphfont.Glyph?>

<VBox fx:id="vbox" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="150.0" prefWidth="300.0" spacing="5.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1">
   <padding>
      <Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
   </padding>
   <children>
      <Label fx:id="nameLabel" style="-fx-font-weight: bold; -fx-font-size: 14;" text="Mr Stephen Lowe" />
      <Label fx:id="mobileLabel" text="07798933862">
         <graphic>
            <Glyph fontFamily="FontAwesome" icon="PHONE" />
         </graphic>
         <font>
            <Font size="12.0" />
         </font>
      </Label>
      <Label fx:id="emailLabel" text="stephen.lowe@mypostoffice.co.uk">
         <graphic>
            <Glyph fontFamily="FontAwesome" icon="ENVELOPE" />
         </graphic>
         <font>
            <Font size="12.0" />
         </font>
      </Label>
      <Label fx:id="churchMemberLabel" text="Church Member" textFill="#388e3c">
         <font>
            <Font size="12.0" />
         </font></Label>
   </children>
</VBox>

下面是我的自定义ListCell子类:

/**
 *
 * @author Stephen
 */
public class MemberListViewCell extends ListCell<MemberEntity> {

    @FXML
    private Label nameLabel;

    @FXML
    private Label mobileLabel;

    @FXML
    private Label emailLabel;

    @FXML
    private Label churchMemberLabel;

    @FXML
    private VBox vbox;

    private FXMLLoader loader;

    public MemberListViewCell() {
    }

    @Override
    protected void updateItem(MemberEntity item, boolean empty) {
        super.updateItem(item, empty);
        if (empty || item == null) {
            setText(null);
        } else {
            if (loader == null) {
                loader = new FXMLLoader(getClass().getResource("/fxml/listcell.fxml"));
                loader.setController(this);
                try {
                    loader.load();
                } catch (IOException ex) {
                    Alert alert = new Alert(Alert.AlertType.ERROR);
                    alert.setTitle("Open FXML");
                    alert.setHeaderText("FXML Error");
                    String msg = "Could not load FXML for list cell factory. Inform software engineer. Terminating program.";
                    msg += ex.toString();
                    alert.setContentText(msg);
                    alert.showAndWait();
                    System.exit(1);
                }
            }

            nameLabel.setText(item.getName().getFormattedName(Name.NameFormat.FORENAME_SURNAME));
            mobileLabel.setText(item.getMobileTelephone());
            emailLabel.setText(item.getEmailAddress());
            if (item.isChurchMember()) {
                churchMemberLabel.setText("Church Member");
                churchMemberLabel.setTextFill(Paint.valueOf("#388e3c"));
            } else {
                churchMemberLabel.setText("Not Church Member");
                churchMemberLabel.setTextFill(Paint.valueOf("#d32f2f"));

            }

            setText(null);
            setGraphic(vbox);

        }
    }
}

共有1个答案

孟豪
2023-03-14

由于您为非空单元格设置了图形,因此如果单元格变为空,则需要将其设置回null:

@Override
protected void updateItem(MemberEntity item, boolean empty) {
    super.updateItem(item, empty);
    if (empty || item == null) {
        setText(null);
        setGraphic(null);
    } else {
        // existing code ...
    }
}
 类似资料:
  • 这与我之前的问题有关。 单元格格式正确,填充正确,因此该部件工作正常。要使细胞工厂正确还需要做什么?

  • 问题内容: 在对Angular工厂进行单元测试(使用Karma + Jasmine)时,如何将存根依赖项注入到要测试的工厂中? 这是我的工厂: 实例化我的工厂时需要。 这是我的测试: 注意:我知道这允许用于控制器,但是我没有看到与之等效的工厂。 问题答案: 我知道有两种方法可以完成这样的事情: 使用和匿名模块注入模拟。 注入您要模拟的服务,并使用茉莉的间谍功能提供模拟值。 第二个选项仅在您确切知道

  • 活字印刷 面向对象 话说三国时期,曹操带领百万大军攻打东吴,大军在长江赤壁驻扎,军船连成一片,眼看就要灭掉东吴,统一天下,曹操大悦,于是大宴众文武,在酒席间,曹操诗兴大发,不觉吟道:喝酒唱歌,人生真爽。众文武齐呼:“丞相好诗!于是一臣子速命印刷工匠刻板印刷,以便流传天下。” 样张出来给曹操一看,曹操感觉不妥,说到:“喝与唱,此话过俗,应该为‘对酒当歌’较好!”,于是此臣就命工匠重新来过。工匠眼看连

  • 本文向大家介绍Java设计模式之工厂模式分析【简单工厂、工厂方法、抽象工厂】,包括了Java设计模式之工厂模式分析【简单工厂、工厂方法、抽象工厂】的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java设计模式之工厂模式。分享给大家供大家参考,具体如下: 一、 简单工厂 先来思考一个问题。我们平时写程序时,会有这种情况,A对象里面需要调用B对象的方法,这时我们使用的一般是new关键字来创建

  • 3 完整解决方案        为了将Chart类的职责分离,同时将Chart对象的创建和使用分离,Sunny软件公司开发人员决定使用简单工厂模式对图表库进行重构,重构后的结构如图2所示: 图2 图表库结构图        在图2中,Chart接口充当抽象产品类,其子类HistogramChart、PieChart和LineChart充当具体产品类,ChartFactory充当工厂类。完整代码如下

  • 2 简单工厂模式概述        简单工厂模式并不属于GoF 23个经典设计模式,但通常将它作为学习其他工厂模式的基础,它的设计思想很简单,其基本流程如下:        首先将需要创建的各种不同对象(例如各种不同的Chart对象)的相关代码封装到不同的类中,这些类称为具体产品类,而将它们公共的代码进行抽象和提取后封装在一个抽象产品类中,每一个具体产品类都是抽象产品类的子类;然后提供一个工厂类用