【问题标题】:JavaFX custom ListCell inheriting behavior with index?JavaFX自定义ListCell继承行为与索引?
【发布时间】:2017-04-18 00:23:39
【问题描述】:

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

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' 方法的 IntegerWrapper 返回 true 时,才会显示绿色勾号。这可能是我忽略的非常简单的事情,但我完全感到困惑,我在底部添加了一个 gif 来显示我所描述的行为:

Gif showing the undesired behavior

【问题讨论】:

    标签: java javafx javafx-2 javafx-8


    【解决方案1】:

    updateItem 你有:

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

    您只需要一个额外的:

    else { 
        setImage(IMAGE_OFF); 
    }
    

    【讨论】:

    • 谢谢它的工作!我就知道会是这样!我觉得好尴尬哈哈!
    猜你喜欢
    • 2020-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多