From 4ad9ceff0054b0cc6350d713bcc4316b0450c497 Mon Sep 17 00:00:00 2001 From: mvholmsy <mvholmsy@student.jyu.fi> Date: Fri, 21 Feb 2020 13:20:30 +0200 Subject: [PATCH] Vaihe 5.1 --- src/Tietorakenteet/Jasen.java | 79 ++++++++++++ src/Tietorakenteet/Jasenet.java | 122 ++++++++++++++++++ src/Tietorakenteet/Rekisteri.java | 93 +++++++++++++ src/Tietorakenteet/SailoException.java | 20 +++ .../HiihtorekisteriGUIController.java | 78 ++++++++++- .../HiihtorekisteriMain.java | 13 +- src/fxHiihtorekisteri/LisaaHiihtaja.fxml | 14 +- .../LisaaHiihtajaGUIController.java | 33 +++++ src/fxHiihtorekisteri/PaaikkunaGUIView.fxml | 4 +- 9 files changed, 444 insertions(+), 12 deletions(-) create mode 100644 src/Tietorakenteet/Jasen.java create mode 100644 src/Tietorakenteet/Jasenet.java create mode 100644 src/Tietorakenteet/Rekisteri.java create mode 100644 src/Tietorakenteet/SailoException.java diff --git a/src/Tietorakenteet/Jasen.java b/src/Tietorakenteet/Jasen.java new file mode 100644 index 0000000..6c818f4 --- /dev/null +++ b/src/Tietorakenteet/Jasen.java @@ -0,0 +1,79 @@ +package Tietorakenteet; + +import java.io.OutputStream; +import java.io.PrintStream; + +/** + * @author MHo + * @version 20.2.2020 + * Jasen -luokka, joka lisää jäsenen rekisteriin. + */ +public class Jasen { + private int id; + private String nimi = ""; + private String syntAika = ""; + private String pKunta = ""; + private int puh; + private String sPosti = ""; + private int liittymisV; + + private static int juoksevaNro = 1; + + + /** + * Muodostaja + */ + public Jasen(){ + id = juoksevaNro; + nimi = "Nokka Räkä"; + syntAika = "01.08.1960"; + pKunta = "Lahti"; + puh = 0401234567; + sPosti = "nr@niilot.fi"; + liittymisV = 1980; + juoksevaNro++; + } + + + /** + * @return jäsenen nimi + */ + public String getNimi(){ + return nimi; + } + + /** + * @return jäsenen ID-numero + */ + public int getID() { + return id; + } + + /** + * Tulostetaan henkilön tiedot + * @param out tietovirta johon tulostetaan + */ + public void tulosta(PrintStream out) { + out.println(String.format("%03d", id, 3) + " " + nimi); + out.println(" " + syntAika + " " + pKunta + " " + puh + " " + sPosti); + out.print(" Liittynyt " + liittymisV + "."); + } + + + /** + * Tulostetaan henkilön tiedot + * @param os tietovirta johon tulostetaan + */ + public void tulosta(OutputStream os) { + tulosta(new PrintStream(os)); + } + + + /** + * @param args ei käytössä + */ + public static void main(String args[]) { + Jasen nokka = new Jasen(); + nokka.tulosta(System.out); + } +} \ No newline at end of file diff --git a/src/Tietorakenteet/Jasenet.java b/src/Tietorakenteet/Jasenet.java new file mode 100644 index 0000000..5a363f7 --- /dev/null +++ b/src/Tietorakenteet/Jasenet.java @@ -0,0 +1,122 @@ +package Tietorakenteet; + +/** + * @author MHo + * @version 20.2.2020 + * Hiihtorekisterin jasenet, joka lisää ja poistaa jäseniä. + */ +public class Jasenet { + private static final int MAX_JASENIA = 10; + private int lkm = 0; + private String tiedostonNimi = ""; + private Jasen alkiot[] = new Jasen[MAX_JASENIA]; + //private ArrayList<Jasen> jasenisto = new ArrayList<Jasen>(); + + + /** + * Muodostaja + */ + public Jasenet(){ + // + } + + + /** + * Lisää uuden jäsenen tietorakenteeseen. Ottaa jäsenen omistukseensa. + * @param jasen lisätäävän jäsenen viite. Huom tietorakenne muuttuu omistajaksi + * @throws SailoException jos tietorakenne on jo täynnä + * @example + * <pre name="test"> + * #THROWS SailoException + * Jasenet jasenet = new Jasenet(); + * Jasen aku1 = new Jasen(), aku2 = new Jasen(); + * jasenet.getLkm() === 0; + * jasenet.lisaa(aku1); jasenet.getLkm() === 1; + * jasenet.lisaa(aku2); jasenet.getLkm() === 2; + * jasenet.lisaa(aku1); jasenet.getLkm() === 3; + * jasenet.anna(0) === aku1; + * jasenet.anna(1) === aku2; + * jasenet.anna(2) === aku1; + * jasenet.anna(1) == aku1 === false; + * jasenet.anna(1) == aku2 === true; + * jasenet.anna(3) === aku1; #THROWS IndexOutOfBoundsException + * jasenet.lisaa(aku1); jasenet.getLkm() === 4; + * jasenet.lisaa(aku1); jasenet.getLkm() === 5; + * jasenet.lisaa(aku1); #THROWS SailoException + * </pre> + */ + public void lisaa(Jasen jasen) throws SailoException { + if (lkm >= alkiot.length) throw new SailoException("Liikaa alkioita"); + alkiot[lkm] = jasen; + //jasenisto.add(jasen); + lkm++; + } + + + /** + * Palauttaa viitteen i:teen jäseneen. + * @param i monennenko jäsenen viite halutaan + * @return viite jäseneen, jonka indeksi on i + * @throws IndexOutOfBoundsException jos i ei ole sallitulla alueella + */ + public Jasen anna(int i) throws IndexOutOfBoundsException { + if (i < 0 || lkm <= i) + throw new IndexOutOfBoundsException("Laiton indeksi: " + i); + return alkiot[i]; + } + + + /** + * Lukee jäsenistön tiedostosta. Kesken. + * @param hakemisto tiedoston hakemisto + * @throws SailoException jos lukeminen epäonnistuu + */ + public void lueTiedostosta(String hakemisto) throws SailoException { + tiedostonNimi = hakemisto + "/nimet.dat"; + throw new SailoException("Ei osata vielä lukea tiedostoa " + tiedostonNimi); + } + + + /** + * Tallentaa jäsenistön tiedostoon. Kesken. + * @throws SailoException jos talletus epäonnistuu + */ + public void talleta() throws SailoException { + throw new SailoException("Ei osata vielä tallettaa tiedostoa " + tiedostonNimi); + } + + + /** + * Palauttaa kerhon jäsenten lukumäärän + * @return jäsenten lukumäärä + */ + public int getLkm() { + return lkm; + } + + + /** + * @param args ei käytössä + */ + public static void main(String args[]) { + Jasenet jasenet = new Jasenet(); + + Jasen nokka = new Jasen(), raka = new Jasen(); + + try { + jasenet.lisaa(nokka); + jasenet.lisaa(raka); + + System.out.println("========== Jäsenet testi =============="); + + for (int i=0; i<jasenet.getLkm(); i++) { + Jasen jasen = jasenet.anna(i); + System.out.println("Jäsen nro: " + i); + jasen.tulosta(System.out); + } + + } catch ( Exception ex ) { + System.out.println(ex.getMessage()); + } + } +} \ No newline at end of file diff --git a/src/Tietorakenteet/Rekisteri.java b/src/Tietorakenteet/Rekisteri.java new file mode 100644 index 0000000..c343e6d --- /dev/null +++ b/src/Tietorakenteet/Rekisteri.java @@ -0,0 +1,93 @@ +package Tietorakenteet; + +import java.util.*; + +/** + * @author MHo + * @version 20.2.2020 + * Hiihtorekisterin jasenet, joka lisää ja poistaa jäseniä. + */ +public class Rekisteri { + private final Jasenet jasenet = new Jasenet(); + + + /** + * Muodostaja + */ + public Rekisteri(){ + } + + + /** + * Lisää jäsenen listaan. + * @param jasen lisättävän jäsenen viite + * @throws SailoException jos lisäystä ei voida tehdä + */ + public void lisaa(Jasen jasen) throws SailoException { + jasenet.lisaa(jasen); + } + + + /** + * @param i monennenko jäsenen viite haetaan + * @return viite jäseneen, jonka indeksi on i + */ + public Jasen annaJasen(int i) { + return jasenet.anna(i); + } + + + /** + * Lukee jäsenistön tiedostosta. TODO lukeminen tiedostosta + * @param nimi jota käytetään lukemisessa + * @throws SailoException jos lukeminen epäonnistuu + */ + public void lueTiedostosta(String nimi) throws SailoException { + jasenet.lueTiedostosta(nimi); + } + + + /** + * Poistaa jäsenet ja hiihdot, joilla on annettu nro + * TODO jäsenien ja hiihtojen poisto ko. luokista. + * @throws SailoException jos tallettamisessa ongelmia + */ + public void talleta() throws SailoException{ + jasenet.talleta(); + } + + + /** + * @return jäsenistön lkm + */ + public int getLkm() { + return jasenet.getLkm(); + } + /** + * @param args ei käytössä + */ + public static void main(String args[]) { + Rekisteri rekisteri = new Rekisteri(); + + try { + // kerho.lueTiedostosta("kelmit"); + + Jasen nokkaraka = new Jasen(), mietaa = new Jasen(); + + + rekisteri.lisaa(nokkaraka); + rekisteri.lisaa(mietaa); + + System.out.println("============= Kerhon testi ================="); + + for (int i = 0; i < rekisteri.getLkm(); i++) { + Jasen jasen = rekisteri.annaJasen(i); + System.out.println("Jäsen paikassa: " + i); + jasen.tulosta(System.out); + } + + } catch (Exception ex) { + System.out.println(ex.getMessage()); + } + } +} \ No newline at end of file diff --git a/src/Tietorakenteet/SailoException.java b/src/Tietorakenteet/SailoException.java new file mode 100644 index 0000000..e77f57f --- /dev/null +++ b/src/Tietorakenteet/SailoException.java @@ -0,0 +1,20 @@ + package Tietorakenteet; + + /** + * Poikkeusluokka tietorakenteesta aiheutuville poikkeuksille. + * @author Vesa Lappalainen + * @version 1.0, 22.02.2003 + */ + public class SailoException extends Exception { + private static final long serialVersionUID = 1L; + + + /** + * Poikkeuksen muodostaja jolle tuodaan poikkeuksessa + * käytettävä viesti + * @param viesti Poikkeuksen viesti + */ + public SailoException(String viesti) { + super(viesti); + } + } \ No newline at end of file diff --git a/src/fxHiihtorekisteri/HiihtorekisteriGUIController.java b/src/fxHiihtorekisteri/HiihtorekisteriGUIController.java index e6ae8da..8ee006a 100644 --- a/src/fxHiihtorekisteri/HiihtorekisteriGUIController.java +++ b/src/fxHiihtorekisteri/HiihtorekisteriGUIController.java @@ -1,11 +1,19 @@ package fxHiihtorekisteri; +import java.io.PrintStream; + +import Tietorakenteet.Jasen; +import Tietorakenteet.Rekisteri; +import Tietorakenteet.SailoException; import fi.jyu.mit.fxgui.Dialogs; +import fi.jyu.mit.fxgui.ListChooser; import fi.jyu.mit.fxgui.ModalController; +import fi.jyu.mit.fxgui.TextAreaOutputStream; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.scene.control.Button; import javafx.scene.control.MenuItem; +import javafx.scene.control.TextArea; import javafx.scene.control.TextField; @@ -48,7 +56,42 @@ public class HiihtorekisteriGUIController { @FXML private MenuItem ylanappiTietoja; + + @FXML + private ListChooser<Jasen> chooserJasenet; + + @FXML + private TextArea textAreaJasen; + + private Rekisteri rekisteri; + private Jasen jasenKohdalla; + + + /** + * @param rekisteri jota käytetään + */ + public void setRekisteri(Rekisteri rekisteri) { + this.rekisteri = rekisteri; + alusta(); + naytaJasen(); + } + + + /** + * Näyttää listasta valitun jäsenen tiedot, tilapäisesti yhteen isoon edit-kenttään + */ + protected void naytaJasen() { + jasenKohdalla = chooserJasenet.getSelectedObject(); + if (jasenKohdalla == null) return; + jasenKohdalla.tulosta(System.out); + textAreaJasen.setText(""); + try (PrintStream os = TextAreaOutputStream.getTextPrintStream(textAreaJasen)) { + jasenKohdalla.tulosta(os); + } + } + + @FXML void handleHaku() { // @@ -71,7 +114,14 @@ public class HiihtorekisteriGUIController { @FXML void handleLisaaHiihtaja() { - ModalController.showModal(HiihtorekisteriGUIController.class.getResource("LisaaHiihtaja.fxml"), "Hiihtaja", null, ""); + try { + rekisteri.lisaa(new Jasen()); + } catch (SailoException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + //ModalController.showModal(HiihtorekisteriGUIController.class.getResource("LisaaHiihtaja.fxml"), "Hiihtaja", null, ""); + hae(0); } @FXML @@ -98,4 +148,30 @@ public class HiihtorekisteriGUIController { void handleTietoja() { ModalController.showModal(HiihtorekisteriGUIController.class.getResource("Tietoja.fxml"), "Tietoja", null, ""); } + + + /** + * Hakee jäsenten tiedot listaan + * @param jnro jäsenen numero, joka aktivoidaan haun jälkeen + */ + protected void hae(int jnro) { + chooserJasenet.clear(); + + int index = 0; + for (int i = 0; i < rekisteri.getLkm(); i++) { + Jasen jasen = rekisteri.annaJasen(i); + if (jasen.getID() == jnro) index = i; + chooserJasenet.add(jasen.getID() + jasen.getNimi(), jasen); + } + chooserJasenet.setSelectedIndex(index); // tästä tulee muutosviesti joka näyttää jäsenen + } + + + /** + * Alustaa listan jäsenistä + */ + protected void alusta() { + chooserJasenet.clear(); + chooserJasenet.addSelectionListener(e -> naytaJasen()); + } } \ No newline at end of file diff --git a/src/fxHiihtorekisteri/HiihtorekisteriMain.java b/src/fxHiihtorekisteri/HiihtorekisteriMain.java index c74245d..fdcab47 100644 --- a/src/fxHiihtorekisteri/HiihtorekisteriMain.java +++ b/src/fxHiihtorekisteri/HiihtorekisteriMain.java @@ -1,8 +1,10 @@ package fxHiihtorekisteri; +import Tietorakenteet.Rekisteri; import javafx.application.Application; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.layout.BorderPane; +import javafx.scene.layout.Pane; import javafx.fxml.FXMLLoader; /** @@ -14,11 +16,16 @@ public class HiihtorekisteriMain extends Application { @Override public void start(Stage primaryStage) { try { - BorderPane root = (BorderPane)FXMLLoader.load(getClass().getResource("PaaikkunaGUIView.fxml")); - Scene scene = new Scene(root); + final FXMLLoader ldr = new FXMLLoader(getClass().getResource("PaaikkunaGUIView.fxml")); + final Pane root = (Pane)ldr.load(); + final HiihtorekisteriGUIController rekisteriCtrl = (HiihtorekisteriGUIController)ldr.getController(); + final Scene scene = new Scene(root); scene.getStylesheets().add(getClass().getResource("hiihtorekisteri.css").toExternalForm()); primaryStage.setScene(scene); + Rekisteri rekisteri = new Rekisteri(); + rekisteriCtrl.setRekisteri(rekisteri); primaryStage.show(); + } catch(Exception e) { e.printStackTrace(); } @@ -29,6 +36,6 @@ public class HiihtorekisteriMain extends Application { * @param args ei k�yt�ss� */ public static void main(String[] args) { - launch(args); + launch(args); } } \ No newline at end of file diff --git a/src/fxHiihtorekisteri/LisaaHiihtaja.fxml b/src/fxHiihtorekisteri/LisaaHiihtaja.fxml index 3be2cb4..38693de 100644 --- a/src/fxHiihtorekisteri/LisaaHiihtaja.fxml +++ b/src/fxHiihtorekisteri/LisaaHiihtaja.fxml @@ -43,19 +43,19 @@ </padding> <children> <Label text="Sukunimi" /> - <TextField GridPane.columnIndex="1" /> + <TextField fx:id="kenttaSukunimi" GridPane.columnIndex="1" /> <Label text="Etunimi" GridPane.rowIndex="1" /> - <TextField GridPane.columnIndex="1" GridPane.hgrow="ALWAYS" GridPane.rowIndex="1" /> + <TextField fx:id="kenttaEtunimi" GridPane.columnIndex="1" GridPane.hgrow="ALWAYS" GridPane.rowIndex="1" /> <Label text="Syntymäaika" GridPane.rowIndex="2" /> <Label text="Paikkakunta" GridPane.rowIndex="3" /> - <TextField GridPane.columnIndex="1" GridPane.hgrow="ALWAYS" GridPane.rowIndex="3" /> + <TextField fx:id="kenttaPaikkakunta" GridPane.columnIndex="1" GridPane.hgrow="ALWAYS" GridPane.rowIndex="3" /> <Label text="Puhelinnumero" GridPane.rowIndex="4" /> - <TextField GridPane.columnIndex="1" GridPane.rowIndex="4" /> + <TextField fx:id="kenttaPuh" GridPane.columnIndex="1" GridPane.rowIndex="4" /> <Label text="Sähköposti" GridPane.rowIndex="5" /> - <TextField GridPane.columnIndex="1" GridPane.rowIndex="5" /> + <TextField fx:id="kenttaEmail" GridPane.columnIndex="1" GridPane.rowIndex="5" /> <Label text="Liittymisvuosi" GridPane.rowIndex="6" /> - <TextField GridPane.columnIndex="1" GridPane.rowIndex="6" /> - <DatePicker GridPane.columnIndex="1" GridPane.rowIndex="2" /> + <TextField fx:id="kenttaLVuosi" GridPane.columnIndex="1" GridPane.rowIndex="6" /> + <DatePicker fx:id="kenttaSyntymaAika" GridPane.columnIndex="1" GridPane.rowIndex="2" /> </children> </GridPane> </center> diff --git a/src/fxHiihtorekisteri/LisaaHiihtajaGUIController.java b/src/fxHiihtorekisteri/LisaaHiihtajaGUIController.java index fef6312..680672d 100644 --- a/src/fxHiihtorekisteri/LisaaHiihtajaGUIController.java +++ b/src/fxHiihtorekisteri/LisaaHiihtajaGUIController.java @@ -3,10 +3,13 @@ package fxHiihtorekisteri; import fi.jyu.mit.fxgui.Dialogs; import fi.jyu.mit.fxgui.ModalController; import fi.jyu.mit.fxgui.ModalControllerInterface; +import fi.jyu.mit.ohj2.Mjonot; import javafx.application.Platform; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.scene.control.Button; +import javafx.scene.control.DatePicker; +import javafx.scene.control.TextField; /** @@ -22,9 +25,39 @@ public class LisaaHiihtajaGUIController implements ModalControllerInterface<Stri @FXML private Button nappiPeruuta; + @FXML + private TextField kenttaSukunimi; + + @FXML + private TextField kenttaEtunimi; + + @FXML + private TextField kenttaPaikkakunta; + + @FXML + private TextField kenttaPuh; + + @FXML + private TextField kenttaEmail; + + @FXML + private TextField kenttaLVuosi; + + @FXML + private DatePicker kenttaSyntymaAika; + @FXML void handleTallenna() { + /** Dialogs.showMessageDialog("Tallennus ei toimi vielä"); + String snimi = kenttaSukunimi.getText(); + String enimi = kenttaEtunimi.getText(); + String kunta = kenttaPaikkakunta.getText(); + int puh = Integer.parseInt(kenttaPuh.getText()); + String email = kenttaEmail.getText(); + int vuosi = Integer.parseInt(kenttaLVuosi.getText()); + String sAika = kenttaSyntymaAika.getPromptText(); + */ } @FXML diff --git a/src/fxHiihtorekisteri/PaaikkunaGUIView.fxml b/src/fxHiihtorekisteri/PaaikkunaGUIView.fxml index 8336e1e..f240d20 100644 --- a/src/fxHiihtorekisteri/PaaikkunaGUIView.fxml +++ b/src/fxHiihtorekisteri/PaaikkunaGUIView.fxml @@ -11,6 +11,7 @@ <?import javafx.scene.control.MenuItem?> <?import javafx.scene.control.ScrollPane?> <?import javafx.scene.control.TableColumn?> +<?import javafx.scene.control.TextArea?> <?import javafx.scene.control.TextField?> <?import javafx.scene.input.KeyCodeCombination?> <?import javafx.scene.layout.BorderPane?> @@ -67,11 +68,12 @@ <VBox alignment="TOP_CENTER" prefHeight="200.0" prefWidth="100.0"> <children> <Label contentDisplay="CENTER" text="Hiihtäjät" textAlignment="CENTER" wrapText="true" /> - <ListChooser rivit="nimi" /> + <ListChooser fx:id="chooserJasenet" rivit="nimi" /> </children> </VBox> <VBox alignment="TOP_CENTER"> <children> + <TextArea fx:id="textAreaJasen" prefHeight="200.0" prefWidth="200.0" /> <Label contentDisplay="CENTER" text="Hiihtäjän tiedot" textAlignment="CENTER" /> </children> </VBox> -- GitLab