Listview问题

时间:2014-11-30 12:57:07

标签: javafx-2 javafx-8

这是我的问题看

public class TempStore { // this is a singleton class

public static ObservableList<Filez> files= FXCollections.observableArrayList();
}

现在在我班上

ListView<Filez> listfiles = new ListView<>();
listfiles.setItems(TempStore.files);
listfiles.setOrientation(Orientation.VERTICAL);
listfiles.setOnMouseClicked(new EventHandler<Event>() {

            @Override
            public void handle(Event arg0) {
                // TODO Auto-generated method stub
                System.out.println(listfiles.getSelectionModel().getSelectedIndex());

            }
        });
listfiles.setCellFactory((ListView<Filez> l) -> listup);

编辑 - 我的liscell课程

public class Listupdater extends ListCell<Filez> {


@Override
protected void updateItem(Filez arg0, boolean arg1) {
    // TODO Auto-generated method stub
    super.updateItem(arg0, arg1);
    if(arg0 != null)
    setGraphic(view(arg0));
}

@Override
public void updateIndex(int arg0) {
    // TODO Auto-generated method stub
    super.updateIndex(arg0);        
    setGraphic(view(TempStore.files.get(arg0)));
}

@Override
public void updateSelected(boolean arg0) {
    // TODO Auto-generated method stub
    super.updateSelected(arg0);
    System.out.println("update selected");
}

@Override
public void startEdit() {
    // TODO Auto-generated method stub
    super.startEdit();
}

Node view(Filez arg0){
    GridPane grid = new GridPane();
    grid.setHgap(10);
    grid.setVgap(10);
    grid.setPadding(new Insets(2, 2, 2, 2));

    try {
        System.out.print(arg0.toString());
    } catch (Exception e) {
        e.printStackTrace();
        System.out.print("error caught");
    }

    Label lab = new Label(arg0.getName());      
    grid.add(lab, 1, 1);

    return grid;
 }

}

现在我的问题是我的列表视图中没有显示任何内容,当我点击列表视图区域时,system.out.printIn打印-1 ..并且我的列表不为空,总是有项目。我做错了什么可以帮助我...

还要添加更多信息,我的listview被放入tabpane的其中一个标签中。 如果有人也可以向我解释如何查看列表视图我也会得到满足,我想要的是能够以编程方式将/ del项目放在listiview中,并使用nodes..thanks <在listview中设置单元格样式/ p>

1 个答案:

答案 0 :(得分:0)

首先,对于未显示单元格的问题,看起来您为每次调用工厂返回了ListCell实现的相同实例。您应该每次都返回一个新实例:

listfiles.setCellFactory(l -> new Listupdater());

要对鼠标单击列表单元格做出反应,我会将鼠标监听器注册到单个单元格,而不是ListView。这样你就可以访问该项,而不必检查选择(这有点像黑客:你没有真正保证在调用监听器之前设置选择)。

所以:

public class Listupdater extends ListCell<Filez> {

    public Listupdater() {
        setOnMouseClicked(event -> 
            if (! isEmpty() ) {
                Filez f = getItem();
                System.out.println("Click on " + f);
            }
        );
    }

    // ... your methods here
}

顺便说一句,您不需要实现updateIndex()updateItem(),只需updateItem()即可。其余的方法(updateSelected()startEdit())似乎是多余的,因为它们只是调用超类实现。它们不应该破坏任何东西,但它们只是冗余的代码。