Witam
Chcę stworzyć "prosty" program do przechowywania danych na temat zrealizowanych transportów dla naszych klientów. Tabela z kolumnami typu "kierowca", "stawka" itd. Na dole pola tekstowe do wpisywania danych, po prawej stronie na dole guzik "dodaj", po jego naciśnięciu ma się stworzyć nowy obiekt typu Track i dodać do listy. Później chcę dodać coś w stylu jakiejś małej bazy danych, żeby po zamknięciu programu dane nie znikały, ale póki co nie miałem wcale z tym do czynienia więc skupiam się na tym, żeby działały podstawy.
Zrobiłem klasę Track:
package pl.sursped.schedule.model;
public class Track {
private Integer number;
private String data;
private String driver;
private String registerNumber;
private String track;
private String client;
private Double bid;
private Double profit;
public Track(Integer number, String data, String driver, String registerNumber, String track, String client, double bid, double profit) {
this.number = number;
this.data = data;
this.driver = driver;
this.registerNumber = registerNumber;
this.track = track;
this.client = client;
this.bid = bid;
this.profit = profit;
}
public Integer getNumber() {
return number;
}
public void setNumber(Integer number) {
this.number = number;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
public String getDriver() {
return driver;
}
public void setDriver(String driver) {
this.driver = driver;
}
public String getRegisterNumber() {
return registerNumber;
}
public void setRegisterNumber(String registerNumber) {
this.registerNumber = registerNumber;
}
public String getTrack() {
return track;
}
public void setTrack(String track) {
this.track = track;
}
public String getClient() {
return client;
}
public void setClient(String client) {
this.client = client;
}
public Double getBid() {
return bid;
}
public void setBid(Double bid) {
this.bid = bid;
}
public Double getProfit() {
return profit;
}
public void setProfit(Double profit) {
this.profit = profit;
}
@Override
public String toString() {
return "Trasa{" +
"number=" + number +
", data='" + data + '\'' +
", driver='" + driver + '\'' +
", registerNumber='" + registerNumber + '\'' +
", track='" + track + '\'' +
", client='" + client + '\'' +
", bid=" + bid +
", profit=" + profit +
'}';
}
}
Oraz klasę ScheduleController, w której chciałem obsługiwać zdarzenia (na razie tylko obsługę zdarzenia kliknięcia na addButton:
package pl.sursped.schedule.controller;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.MenuItem;
import javafx.scene.control.TextField;
import pl.sursped.schedule.model.Track;
public class ScheduleController {
@FXML
private MenuItem openFileMenuItem;
@FXML
private MenuItem saveMenuItem;
@FXML
private MenuItem deleteMenuItem;
@FXML
private MenuItem deleteAllMenuItem;
@FXML
private MenuItem aboutMenuItem;
@FXML
private TableViewController tableViewController;
@FXML
private TextField numberTextField;
@FXML
private TextField dataTextField;
@FXML
private TextField driverTextField;
@FXML
private TextField registerNumberTextField;
@FXML
private TextField trackTextField;
@FXML
private TextField clientTextField;
@FXML
private TextField bidTextField;
@FXML
private TextField profitTextField;
@FXML
private Button addButton;
public void initialize() {
clickOnAddButton();
}
private ObservableList<Track> tracksList;
private void clickOnAddButton(){
addButton.setOnAction(actionEvent -> addTrackToList());
}
public void addTrackToList() {
ObservableList<Track> items = tableViewController.getTracksTableView().getItems();
Track track = createNewTrack();
items.add(track);
}
public Track createNewTrack(){
Integer number = Integer.valueOf(numberTextField.getText());
String data = dataTextField.getText();
String driver = driverTextField.getText();
String registerNumber = registerNumberTextField.getText();
String track = trackTextField.getText();
String client = clientTextField.getText();
Double bid = Double.valueOf(bidTextField.getText());
Double profit = Double.valueOf(profitTextField.getText());
return new Track(number, data, driver, registerNumber, track, client, bid, profit);
}
}
Mam też klasę TableViewController, w której skonfigurowałem tabelę i podpiąłem wartości:
package pl.sursped.schedule.controller;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import pl.sursped.schedule.model.Track;
public class TableViewController {
private static final String NUMBER_COLUMN = "Nr";
private static final String DATA_COLUMN = "Data";
private static final String DRIVER_COLUMN = "Kierowca";
private static final String REGISTER_NUMBER_COLUMN = "Numer rejestracyjny";
private static final String TRACK_COLUMN = "Trasa";
private static final String CLIENT_COLUMN = "Klient";
private static final String BID_COLUMN = "Stawka";
private static final String PROFIT_COLUMN = "Dochód";
@FXML
private TableView<Track> tracksTableView;
public TableView<Track> getTracksTableView() {
return tracksTableView;
}
public void initialize(){
configureTableColumns();
}
private void configureTableColumns() {
TableColumn<Track, Integer> numberColumn = new TableColumn<>(NUMBER_COLUMN);
numberColumn.setCellValueFactory(new PropertyValueFactory<>("number"));
TableColumn<Track, String> dataColumn = new TableColumn<>(DATA_COLUMN);
dataColumn.setCellValueFactory(new PropertyValueFactory<>("data"));
TableColumn<Track, String> driverColumn = new TableColumn<>(DRIVER_COLUMN);
driverColumn.setCellValueFactory(new PropertyValueFactory<>("driver"));
TableColumn<Track, String> registerNumberColumn = new TableColumn<>(REGISTER_NUMBER_COLUMN);
registerNumberColumn.setCellValueFactory(new PropertyValueFactory<>("registerNumber"));
TableColumn<Track, String> trackColumn = new TableColumn<>(TRACK_COLUMN);
trackColumn.setCellValueFactory(new PropertyValueFactory<>("track"));
TableColumn<Track, String> clientColumn = new TableColumn<>(CLIENT_COLUMN);
clientColumn.setCellValueFactory(new PropertyValueFactory<>("client"));
TableColumn<Track, String> bidColumn = new TableColumn<>(BID_COLUMN);
bidColumn.setCellValueFactory(new PropertyValueFactory<>("bid"));
TableColumn<Track, String> profitColumn = new TableColumn<>(PROFIT_COLUMN);
profitColumn.setCellValueFactory(new PropertyValueFactory<>("profit"));
tracksTableView.getColumns().add(numberColumn);
tracksTableView.getColumns().add(dataColumn);
tracksTableView.getColumns().add(driverColumn);
tracksTableView.getColumns().add(registerNumberColumn);
tracksTableView.getColumns().add(trackColumn);
tracksTableView.getColumns().add(clientColumn);
tracksTableView.getColumns().add(bidColumn);
tracksTableView.getColumns().add(profitColumn);
}
}
Tak wygląda moja klasa Main:
package pl.sursped.schedule.main;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
public class Main extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) throws Exception {
Pane mainPane = FXMLLoader.load(getClass().getResource("/scheduleView.fxml"));
Scene scene = new Scene(mainPane);
stage.setScene(scene);
stage.setTitle("Tabela kursów");
stage.show();
}
}
Po wpisaniu w pola tekstowe danych i naciśnięciu przycisku "dodaj" wyrzuca mi NullPointerException (obojętnie czy w polach tekstowych coś jest wpisane czy nie). Siedzę od wczoraj nad problemem i nie mam pojęcia jak to rozwiązać i w ogóle w czym leży problem, jestem początkujący i staram się dużo rozwiązań szukać w internecie, ale tutaj poległem.