JavaFX setCellValueFactory - PullRequest
       12

JavaFX setCellValueFactory

0 голосов
/ 30 мая 2018

Я знаю, этот вопрос задавался сотни раз, и я провел последние 3 часа, читая их все.Я пишу небольшое приложение с JavaFX (и я делал это раньше ...).Все работает, кроме помещения содержимого в мою колонку:

@FXML public void initialize() {
    exerciseColumn.setCellValueFactory(new PropertyValueFactory<Exercise, String>("name"));
}

Это мой метод инициализации, а вот:

public StringProperty nameProperty() {
    return name;
}

- это средство получения свойства для "StringProperty name".Действительно забавно то, что код является точной копией другого проекта, который я сделал некоторое время назад (я, конечно, дважды и трижды проверил все), который я сегодня снова скомпилировал, и он работает отлично.Я читаю документ, который, как кажется, наполовину JavaFX, чтобы найти решение, но это просто не имеет никакого смысла.Если вы считаете, что вам нужно больше кода, чтобы помочь мне, тогда я, конечно, могу предоставить его.

edit: еще один пример с той же проблемой (по крайней мере, я на это надеюсь)

Main:

package test;

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;
import test.model.Exercise;
import test.view.Controller;

public class Main extends Application {

private Stage primaryStage;
private AnchorPane pane;

private ObservableList<Exercise> activeSession = FXCollections.observableArrayList();

public Main() {
    activeSession.add(new Exercise("ednhzrd"));
}

public static void main(String[] args) {
    launch(args);
}

@Override
public void start(Stage primaryStage) {
    this.primaryStage = primaryStage;
    this.primaryStage.setTitle("Test");

    try {
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(Main.class.getResource("view/view.fxml"));
        pane = (AnchorPane) loader.load();
        Scene scene = new Scene(pane);
        primaryStage.setScene(scene);
        primaryStage.show();

        Controller controller = new Controller();
        controller.setMainApp(this);
    } catch(Exception e) {
        e.printStackTrace();
    }
}
}

Контроллер:

package test.view;

import javafx.fxml.FXML;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import test.Main;
import test.model.Exercise;

public class Controller {
@FXML private TableView<Exercise> exerciseTable;
@FXML private TableColumn<Exercise, String> exerciseColumn;

private Main main;

public Controller() {}

@FXML
public void initialize() {
    exerciseColumn.setCellValueFactory(cellData -> cellData.getValue().nameProperty());
}

public void setMainApp(Main main) {
    this.main = main;
}
}

Упражнение:

enter codepackage test.model;

import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;

public class Exercise {

private StringProperty name;

public Exercise(String name) {
    this.name = new SimpleStringProperty(name);
}

public StringProperty nameProperty() {
    return name;
}
}

fxml:

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<AnchorPane prefHeight="400.0" prefWidth="209.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="test.view.Controller">
   <children>
      <TableView fx:id="exerciseTable" layoutX="200.0" layoutY="100.0" prefHeight="400.0" prefWidth="600.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
        <columns>
          <TableColumn fx:id="exerciseColumn" prefWidth="75.0" text="C1" />
        </columns>
         <columnResizePolicy>
            <TableView fx:constant="CONSTRAINED_RESIZE_POLICY" />
         </columnResizePolicy>
      </TableView>
   </children>
</AnchorPane>

1 Ответ

0 голосов
/ 30 мая 2018

С вашим cellValueFactory проблем нет.Единственная проблема здесь в том, что вы никогда не кладете никаких предметов в таблицу.Если вы измените контроллер для добавления тестового элемента в таблицу:

package test.view;

import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import test.Main;
import test.model.Exercise;

public class Controller {
    @FXML
    private TableView<Exercise> exerciseTable;
    @FXML
    private TableColumn<Exercise, String> exerciseColumn;

    private ObservableList<Exercise> activeSession = FXCollections.observableArrayList();

    private Main main;

    public Controller() {
    }

    @FXML
    public void initialize() {
        exerciseColumn.setCellValueFactory(cellData -> cellData.getValue().nameProperty());
        activeSession.add(new Exercise("hrrykane"));
        exerciseTable.setItems(activeSession);
    }

    public void setMainApp(Main main) {
        this.main = main;
    }
}

, тогда вы увидите желаемый эффект:

enter image description here

...