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

JavaFX自定义ListCell使用索引继承行为?

鲜于喜
2023-03-14

我创建了一个自定义IntegerRapper类来实现一个属性提取器方法,如下所示:

import javafx.beans.Observable;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.util.Callback;

public class IntegerWrapper {

private IntegerProperty value = new SimpleIntegerProperty();
private BooleanProperty isListening = new SimpleBooleanProperty();

public static Callback<IntegerWrapper, Observable[]> extractor() {
    return new Callback<IntegerWrapper, Observable[]>() {
        @Override
        public Observable[] call(IntegerWrapper param) {
            return new Observable[] {param.value, param.isListening};
        }
    };
}

public void setValue(Integer number) {
    this.value.set(number);
}

public void setIsListening(Boolean bool) {
    this.isListening.set(bool);
}

public Integer getValue() {
    return value.get();
}

public boolean getIsListening() {
    return isListening.get();
}

@Override
public String toString() {
    return new Integer(value.get()).toString();
}

}

我还创建了一个名为“PortCell”的类,它扩展了ListCell以设计我喜欢的单元格,如下所示:

import javafx.geometry.Insets;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.Label;
import javafx.scene.control.ListCell;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.GridPane;

public class PortCell extends ListCell<IntegerWrapper> {

private final Image IMAGE_OFF = new Image("/com/mswordhf/jnet/resources/error.png");
private final Image IMAGE_ON = new Image("/com/mswordhf/jnet/resources/success.png");

private GridPane grid = new GridPane();
private ImageView imageView = new ImageView();
private Label portNumber = new Label();
private ContextMenu contextMenu;

public PortCell(ContextMenu contextMenu) {
    this.contextMenu = contextMenu;
    configureGrid();
    configurePort();
    configureImage();
    addContentsToGrid();
}

private void configureGrid() {
    grid.setHgap(10);
    grid.setVgap(0);
    grid.setPadding(new Insets(0, 10, 0, 10));
}

private void configureImage() {
    imageView.setImage(IMAGE_OFF);
}

private void setImage(Image image) {
    imageView.setImage(image);
}

private void configurePort() {
    portNumber.getStyleClass().add("port-list-port");
}

private void addContentsToGrid() {
    grid.add(imageView, 0, 0, 1, 2);
    grid.add(portNumber, 1, 0);
}

@Override
public void updateItem(IntegerWrapper portInt, boolean empty) {
    super.updateItem(portInt, empty);

    if(empty) {
        clearContent();
    }else {
        if(portInt.getIsListening()) {
            setImage(IMAGE_ON);
        }
        addContent(portInt.getValue());
        setContextMenu(contextMenu);
    }
}

private void clearContent() {
    setContextMenu(null);
    setText(null);
    setGraphic(null);
}

private void addContent(Integer portInt) {
    setText(null);
    portNumber.setText(portInt.toString());
    setGraphic(grid);
}
}

当用户右键单击ListView中的端口号并单击“开始监听”时,我希望红十字会变成一个绿色的勾号,这一切正常,但当我移除带有绿色勾号的端口上方的端口时,绿色勾号下方显示的端口似乎继承了勾号?绿色勾号仅在传递给updateItem方法“getIsListening”的IntegerRapper返回true时显示。这可能是我忽略的非常简单的事情,但我完全困惑,我在底部添加了一个gif来显示我描述的行为:

Gif表现出不希望的行为

共有1个答案

白通
2023-03-14

updateItem中,您有:

if(portInt.getIsListening()) { 
    setImage(IMAGE_ON); 
}

您所需要的只是一个额外的:

else { 
    setImage(IMAGE_OFF); 
}
 类似资料:
  • 我试图找出如何使用一个与一个在,但没有运气,我已经查了,我能找到的都是不完整的教程和问题。下面是我的FXML 还有我的模特 和我不完整的 还有我的控制器 请不要告诉我找不到。我现在迷路了,我不知道在我的FXML中更新图像视图和标签的正确方法。任何人来帮助或与一个教程的链接,我可以遵循,我将不胜感激。

  • 我正在尝试为JavaFX创建一个非常简单的自定义。运行应用程序时,

  • 我正在进行的项目使用的是JavaFx框架,因此我们使用的是fxml文件和场景构建器。我已经为我们的应用程序制作了一个自定义控件,根据我在web上找到的示例,它工作得非常好。但是,我们将有多个带有公共基本功能的自定义控件。因此,我想将基本功能继承到一个自定义控件中。 我正在尝试做的是创建一个扩展自定义根控件类的自定义控件。CustomControl.fxml文件如下所示: 它是皮包骨头,当我打开Cu

  • 问题内容: 我尝试使用自定义ListCell在ListView中查看自定义对象。为了说明这个问题,我选择了一个例子。同样出于演示目的,我在渲染时直接禁用了ListCell。这些项目是由线程模拟的外部过程添加的。一切看起来都很不错,直到我为禁用的ListCell应用CSS着色为止。现在看来,有些虚幻项与创建它们的ListCell一起被禁用。 我该如何解决? App.java app.css 问题答案

  • 问题的核心是,我不能刷新或更改一个场景的节点的内容(这里是TablesMain)从另一个类(这里是NamePriceCell)。 我正在使用主StackPane(TableMainController扩展StackPane)构建和应用程序,其中包含其他节点,其中一些节点是ListView。在一个特定的ListView(比如“readitemslistview”)中,我创建了一个自定义ListCel

  • 本文向大家介绍ABAP 继承-定义,包括了ABAP 继承-定义的使用技巧和注意事项,需要的朋友参考一下 示例 信息 继承使您可以从现有类派生新类。您可以使用的INHERITING FROM加法 从超类继承的CLASS子类DEFINITION 继承 。 声明。新的类子类继承了现有类超类的所有组件。新类称为派生类的子类。原始类称为新类的超类。一个类可以有多个直接子类,但可能只有一个直接超类。 类的实现