JavaFX 自定义 ListCell 继承行为与索引?
JavaFX custom ListCell inheriting behavior with index?
我创建了一个自定义 IntegerWrapper class 来实现 属性 提取器方法,如下所示:
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' 的 class,它扩展了 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 中的端口号并单击 'Start Listening' 我希望红色十字变成绿色勾号,一切正常,但是当我删除上面的端口时使用绿色勾号,绿色勾号下方显示的端口似乎继承了勾号?绿色勾号仅在将 IntegerWrapper 传递给 updateItem 方法的 'getIsListening' 方法 returns true 时才会显示。这可能是我忽略的非常简单的事情,但我完全不知所措,我在底部包含了一个 gif 来显示我所描述的行为:
Gif showing the undesired behavior
在 updateItem
你有:
if(portInt.getIsListening()) {
setImage(IMAGE_ON);
}
您只需要一个额外的:
else {
setImage(IMAGE_OFF);
}
我创建了一个自定义 IntegerWrapper class 来实现 属性 提取器方法,如下所示:
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' 的 class,它扩展了 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 中的端口号并单击 'Start Listening' 我希望红色十字变成绿色勾号,一切正常,但是当我删除上面的端口时使用绿色勾号,绿色勾号下方显示的端口似乎继承了勾号?绿色勾号仅在将 IntegerWrapper 传递给 updateItem 方法的 'getIsListening' 方法 returns true 时才会显示。这可能是我忽略的非常简单的事情,但我完全不知所措,我在底部包含了一个 gif 来显示我所描述的行为:
Gif showing the undesired behavior
在 updateItem
你有:
if(portInt.getIsListening()) {
setImage(IMAGE_ON);
}
您只需要一个额外的:
else {
setImage(IMAGE_OFF);
}