Kihagyás

Controller

A controller osztály felelős a felhasználói felületi elemek kezeléséért. Az FXML-ben definiált elemeket a controller osztályban @FXML annotációval ellátott mezők segítségével lehet elérni. Az elemekhez eseménykezelőket is hozzá lehet rendelni, amelyek a felhasználói interakciókat kezelik.

Label szövegének módosítása

A Label szövegét a setText() metódus segítségével lehet módosítani.

Példa

hello-view.fxml
<Label fx:id="welcomeText" text="Welcome" />
HelloController.java
1
2
3
4
@FXML
private Label welcomeText;

welcomeText.setText("Hello World!");

TextField értékének lekérdezése

A TextField értékét a getText() metódus segítségével lehet lekérdezni.

Példa

hello-view.fxml
<TextField fx:id="nevMezo" placeholder="Adj meg egy nevet!" />
HelloController.java
1
2
3
4
@FXML
private TextField nevMezo;

String nev = nevMezo.getText();

Button eseménykezelő

Az eseménykezelő metódus neve a onAction attribútum értéke. Az eseménykezelő metódus paraméterei a következők:

Példa

hello-view.fxml
<Button onAction="#onHelloButtonClick" text="Button" />
HelloController.java
1
2
3
4
5
6
7
@FXML
private Label welcomeText;

@FXML
private void onHelloButtonClick(ActionEvent event) {
    welcomeText.setText("Hello World!");
}

TableView (Táblázat)

Megjegyzés

Az alábbi fejezet C# programozási nyelvben DataGridView néven ismert.

A TableView egy táblázatos felületi elem, amelyben adatokat lehet megjeleníteni. A táblázat oszlopait TableColumn elemek segítségével lehet definiálni. A TableColumn elemekhez meg kell adni a megjelenítendő adat típusát, valamint a megjelenítendő adatot tartalmazó oszlop nevét.

Vegyünk egy komplex példát, amelyben beolvasunk egy csv fájlt gombnyomásra, majd megjelenítjük a táblázatban.

1. FXML

Először definiáljuk a felületet FXML-ben.

hello-view.fxml
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<VBox alignment="CENTER" prefHeight="399.0" prefWidth="570.0" spacing="20.0" xmlns="http://javafx.com/javafx/17.0.2-ea" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.example.agazatifx.HelloController">
    <padding>
        <Insets bottom="20.0" left="20.0" right="20.0" top="20.0" />
    </padding>
   <children>
      <TableView fx:id="tablazat" prefHeight="200.0" prefWidth="200.0">
      </TableView>
      <Button onAction="#onFileButtonClick" text="Button" />
   </children>
</VBox>

2. Osztály létrehozása

Első lépésben létre kell hoznunk az osztályt.

JavaFX esetében, hogy meg tudjuk jeleníteni a tartalmat, eltérő adattípusokat kell használnunk, amelyek a következők:

  • SimpleStringProperty: Szöveges adatok tárolására használható.
  • SimpleIntegerProperty: Egész számok tárolására használható.
  • SimpleDoubleProperty: Lebegőpontos számok tárolására használható.
Focista.java
package com.example.agazatifx;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;

public class Focista {
    private SimpleIntegerProperty sorszam;
    private SimpleStringProperty nev;
    private SimpleStringProperty idoszak;
    private SimpleStringProperty klubok;
    private SimpleIntegerProperty gol;
    private SimpleIntegerProperty merkozes;

    public Focista(String sor) {
        String[] oszlopok = sor.split(";"); // sor = 2;Zsengellér Gyula;1935-1947;Salgótarjáni BTC,UTE;387;327;

        this.sorszam = new SimpleIntegerProperty( Integer.parseInt(oszlopok[0]) );
        this.nev = new SimpleStringProperty( oszlopok[1] );
        this.idoszak = new SimpleStringProperty( oszlopok[2] );
        this.klubok = new SimpleStringProperty( oszlopok[3] );
        this.gol = new SimpleIntegerProperty( Integer.parseInt(oszlopok[4]) );
        this.merkozes = new SimpleIntegerProperty( Integer.parseInt(oszlopok[5]) );
    }
}

Getterek

A gettereket a JavaFX megfelelő típusú gettereire kell átírni. Ez annyi kiegészítéssel jár, hogy a visszatérési típus után .get()-et kell írni.

Példa

1
2
3
4
5
private SimpleIntegerProperty sorszam;

public int getSorszam() {
    return sorszam.get();
}

3. Fájl beolvasása

Miután létrehoztuk az osztályt, be kell olvasnunk a fájlt. Ezt akkor kell megtennünk, amikor a felhasználó rákattint a gombra.

JavaFX esetében a fájl beolvasását a FileChooser segítségével tudjuk megtenni.

Példa

FileChooser fc = new FileChooser();
File f = fc.showOpenDialog(null);

Az adatok tárolására egy speciális lista típust használunk, az ObservableList-et.

Példa

private ObservableList<Focista> focistak = FXCollections.observableArrayList();

Teljes kódrészlet

HelloController.java
private ObservableList<Focista> focistak = FXCollections.observableArrayList();

@FXML
protected void onFileButtonClick() {
    FileChooser fc = new FileChooser();
    File f = fc.showOpenDialog(null);

    try {
        Scanner scanner = new Scanner(f);

        String elsosor = scanner.nextLine();

        while (scanner.hasNextLine()) {
            Focista foc = new Focista(scanner.nextLine());
            focistak.add(foc);
        }

        scanner.close();

    } catch (FileNotFoundException e) {
        System.out.println("Error" + e);
    }
}

4. Táblázat feltöltése

setItems

A táblázat feltöltéséhez a setItems() metódust kell használni. Paraméterként meg kell adni az adatokat tartalmazó listát.

tablazat.setItems(focistak);

TableColumn

A táblázat oszlopait a TableColumn osztály példányainak segítségével lehet definiálni. A konstruktor paraméterként meg kell adni az oszlop nevét, amely egy tetszőleges string.

TableColumn<Focista/*(1)!*/, Integer/*(2)!*/> sorszamOszlop/*(3)!*/ = new TableColumn<>("Sorszám"/*(4)!*/);
  1. Az osztály neve, amelynek az adatát meg szeretnénk jeleníteni.
  2. Az adat típusa, amelyet meg szeretnénk jeleníteni. A sorszám esetén ez egy egész szám.
  3. Tetsszőleges változó neve, amelyet az oszlophoz rendelünk.
  4. Az oszlop neve, amelyet a felhasználó fog látni.

setCellValueFactory

A setCellValueFactory() metódus segítségével lehet megadni, hogy az oszlop melyik adatot jelenítse meg. A PropertyValueFactory osztály konstruktorának paraméterként meg kell adni a Focista osztály megfelelő getterét.

sorszamOszlop/*(1)!*/.setCellValueFactory(new PropertyValueFactory<Focista/*(2)!*/, Integer/*(3)!*/>("sorszam"/*(4)!*/));
  1. Az változó neve amit az előző lépésben adtunk meg.
  2. Az osztály neve, amelynek az adatát meg szeretnénk jeleníteni.
  3. Az adat típusa, amelyet meg szeretnénk jeleníteni. A sorszám esetén ez egy egész szám.
  4. A getter neve, amelyet az előző lépésben adtunk meg, ez megegyezik a Focista osztály sorszam getterével.

getColumns

A getColumns() metódus segítségével lehet hozzáadni az oszlopokat a táblázathoz.

tablazat.getColumns().add(sorszamOszlop);

Összesítve

Összesítve tehát egy oszlop hozzáadása a táblázathoz, majd annak értékkel történő feltöltése a következőképpen néz ki:

private void setTablazat() {
    tablazat.setItems(focistak);

    // Sorszám oszlop hozzáadása és feltöltése értékkel
    TableColumn<Focista, Integer> sorszamOszlop = new TableColumn<>("Sorszám");
    sorszamOszlop.setCellValueFactory(new PropertyValueFactory<Focista, Integer>("sorszam"));
    tablazat.getColumns().add(sorszamOszlop);

    // Újabb oszlop...
    TableColumn<Focista, String> nevOszlop = new TableColumn<>("Név");
    nevOszlop.setCellValueFactory(new PropertyValueFactory<Focista, String>("nev"));
    tablazat.getColumns().add(nevOszlop);
}