Unable to update row of tableView after connecting to a url

29 views Asked by At

I am building a download manager

Here I have shown a test code which tries to update fileNameColumn of a row of tableView but it is not being updated after I connect to url

To be specific, here fileName remains hello1 and it doesnt get updated to hello2. Yhy's that so?

Main.java :

public static TableView<DownloadEntry> downloadsTable;
public TableColumn<DownloadEntry, String> fileNameColumn;

public void initialize(URL location, ResourceBundle resources) {
    downloadsTable = new TableView<DownloadEntry>();
    fileNameColumn = new TableColumn<>("File Name");
    fileNameColumn.setCellValueFactory(new PropertyValueFactory<>("fileName"));
    executor = Executors.newFixedThreadPool(4);
}

public void addDownloadButtonClicked() {
    try{
        String urlText = urlTextBox.getText();
        DownloadEntry task = new DownloadEntry(new URL(urlText));
        downloadsTable.getItems().add(task);
        executor.execute(task);
    }
    catch(Exception e) {
        System.out.println("addDownloadButtonClicked: " + e);
    }
}

DownloadEntry.java:

public class DownloadEntry extends Task<Void> {
    public SimpleStringProperty fileName;
    public URL url;

    //Constructor
    public DownloadEntry(URL ur) throws Exception{
        fileName = new SimpleStringProperty("hello");
        url = ur;
    }

    @Override
    protected Void call() {
        try {
            HttpURLConnection connect=(HttpURLConnection)url.openConnection();
            fileName.set("hello1");
            connect.connect();
            fileName.set("hello2");
        }
        catch(Exception E) {
            this.updateMessage("Error");
            E.printStackTrace();
        }
        return null;
    }

    public String getFileName() {
        return fileName.get();
    }

    public void setFileName(String fileName) {
        this.fileName = new SimpleStringProperty(fileName);
    }

}

Please tell if you need more details..

1

There are 1 answers

0
James_D On

Your model is incorrectly implemented. The setFileName method should be

public void setFileName(String fileName) {
    this.fileName.set(fileName);
}

(The problem with your implementation is that the table is still observing the old property, not the new one you create.)

You will also need to provide a "property accessor" method:

public StringProperty fileNameProperty() {
    return fileName ;
}

which will allow the table to properly bind to the property (so that it "knows" when its value changes).