Skip to content
Commits on Source (1)
#BEFORETESTCLASS= @SuppressWarnings("all")
#DIRECTORY=test
#PACKAGE=.test
1|1|Pitsin nypläys|1917|13
2|1|Pitsin nypläys|1979|23
2|1|Pitsin nypläys|1979|21
3|2|Pitsin nypläys|1955|1
4|3|Pitsin nypläys|1919|30
5|3|Pitsin nypläys|1921|42
......
......@@ -3,4 +3,4 @@
1|Ankka Aku|270203-9448|Paratiisitie 13|12346|ANKKALINNA|12-1234|||1996|50.0|30.0|Velkaa Roopelle
2|Ankka Lupu|100612-061B|Paratiisitie 13|12345|ANKKALINNA|12-1234|||1996|50.0|30.0|Velkaa Roopelle
3|Ankka Tupu|190113-7310|Paratiisitie 13|12345|ANKKALINNA|12-1234|||1996|50.0|30.0|Velkaa Roopelle
4|Susi Sepe||||Takametsä||||0|0.0|0.0|
4|Susi Sepe||||Takametsä||||0|10.0|0.0|
No preview for this file type
package fxKerho;
import static fxKerho.JasenDialogController.getFieldId;
import static fxKerho.TietueDialogController.getFieldId;
import java.awt.Desktop;
import java.io.IOException;
import java.io.PrintStream;
......@@ -25,6 +25,7 @@ import javafx.scene.control.ScrollPane;
import javafx.scene.control.TableView;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyCode;
import javafx.scene.layout.GridPane;
import kerho.Harrastus;
import kerho.Jasen;
......@@ -91,7 +92,7 @@ public class KerhoGUIController implements Initializable {
@FXML private void handleMuokkaaJasen() {
muokkaa(1);
muokkaa(kentta);
}
......@@ -145,12 +146,13 @@ public class KerhoGUIController implements Initializable {
protected void alusta() {
chooserJasenet.clear();
chooserJasenet.addSelectionListener(e -> naytaJasen());
edits = JasenDialogController.luoKentat(gridJasen);
edits = TietueDialogController.luoKentat(gridJasen, new Jasen());
for (TextField edit: edits)
if ( edit != null ) {
edit.setEditable(false);
edit.setOnMouseClicked(e -> { if ( e.getClickCount() > 1 ) muokkaa(getFieldId(e.getSource(),0)); });
edit.focusedProperty().addListener((a,o,n) -> kentta = getFieldId(edit,kentta));
edit.focusedProperty().addListener((a,o,n) -> kentta = getFieldId(edit,kentta));
edit.setOnKeyPressed( e -> {if ( e.getCode() == KeyCode.F2 ) muokkaa(kentta);});
}
// alustetaan harrastustaulukon otsikot
int eka = apuharrastus.ekaKentta();
......@@ -166,6 +168,10 @@ public class KerhoGUIController implements Initializable {
tableHarrastukset.setColumnSortOrderNumber(1);
tableHarrastukset.setColumnSortOrderNumber(2);
tableHarrastukset.setColumnWidth(1, 60);
tableHarrastukset.setColumnWidth(2, 60);
tableHarrastukset.setOnMouseClicked( e -> { if ( e.getClickCount() > 1 ) muokkaaHarrastusta(); } );
tableHarrastukset.setOnKeyPressed( e -> {if ( e.getCode() == KeyCode.F2 ) muokkaaHarrastusta();});
}
......@@ -250,7 +256,7 @@ public class KerhoGUIController implements Initializable {
jasenKohdalla = chooserJasenet.getSelectedObject();
if (jasenKohdalla == null) return;
JasenDialogController.naytaJasen(edits, jasenKohdalla);
TietueDialogController.naytaTietue(edits, jasenKohdalla);
naytaHarrastukset(jasenKohdalla);
}
......@@ -292,7 +298,7 @@ public class KerhoGUIController implements Initializable {
protected void uusiJasen() {
try {
Jasen uusi = new Jasen();
uusi = JasenDialogController.kysyJasen(null, uusi, 1);
uusi = TietueDialogController.kysyTietue(null, uusi, 1);
if ( uusi == null ) return;
uusi.rekisteroi();
kerho.lisaa(uusi);
......@@ -331,25 +337,46 @@ public class KerhoGUIController implements Initializable {
/**
* Tekee uuden tyhjän harrastuksen editointia varten
*/
public void uusiHarrastus() {
if ( jasenKohdalla == null ) return;
Harrastus har = new Harrastus();
har.rekisteroi();
har.vastaaPitsinNyplays(jasenKohdalla.getTunnusNro());
private void uusiHarrastus() {
if ( jasenKohdalla == null ) return;
try {
kerho.lisaa(har);
Harrastus uusi = new Harrastus(jasenKohdalla.getTunnusNro());
uusi = TietueDialogController.kysyTietue(null, uusi, 0);
if ( uusi == null ) return;
uusi.rekisteroi();
kerho.lisaa(uusi);
naytaHarrastukset(jasenKohdalla);
tableHarrastukset.selectRow(1000); // järjestetään viimeinen rivi valituksi
} catch (SailoException e) {
Dialogs.showMessageDialog("Ongelmia lisäämisessä! " + e.getMessage());
}
hae(jasenKohdalla.getTunnusNro());
Dialogs.showMessageDialog("Lisääminen epäonnistui: " + e.getMessage());
}
}
private void muokkaaHarrastusta() {
int r = tableHarrastukset.getRowNr();
if ( r < 0 ) return; // klikattu ehkä otsikkoriviä
Harrastus har = tableHarrastukset.getObject();
if ( har == null ) return;
int k = tableHarrastukset.getColumnNr()+har.ekaKentta();
try {
har = TietueDialogController.kysyTietue(null, har.clone(), k);
if ( har == null ) return;
kerho.korvaaTaiLisaa(har);
naytaHarrastukset(jasenKohdalla);
tableHarrastukset.selectRow(r); // järjestetään sama rivi takaisin valituksi
} catch (CloneNotSupportedException e) { /* clone on tehty */
} catch (SailoException e) {
Dialogs.showMessageDialog("Ongelmia lisäämisessä: " + e.getMessage());
}
}
private void muokkaa(int k) {
if ( jasenKohdalla == null ) return;
try {
Jasen jasen;
jasen = JasenDialogController.kysyJasen(null, jasenKohdalla.clone(), k);
jasen = TietueDialogController.kysyTietue(null, jasenKohdalla.clone(), k);
if ( jasen == null ) return;
kerho.korvaaTaiLisaa(jasen);
hae(jasen.getTunnusNro());
......
package fxKerho;
import java.net.URL;
import java.util.ResourceBundle;
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.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.Node;
import javafx.scene.control.Label;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;
import kanta.Tietue;
/**
* Kysytään tietueen tiedot luomalla sille uusi dialogi
*
* @author vesal
* @version 11.1.2016
* @param <TYPE> Minkä tyyppisiä olioita käsitellään
*
*/
public class TietueDialogController<TYPE extends Tietue> implements ModalControllerInterface<TYPE>,Initializable {
@FXML private ScrollPane panelTietue;
@FXML private GridPane gridTietue;
@FXML private Label labelVirhe;
@Override
public void initialize(URL url, ResourceBundle bundle) {
// alusta();
}
@FXML private void handleOK() {
if ( tietueKohdalla != null && tietueKohdalla.anna(tietueKohdalla.ekaKentta()).trim().equals("") ) {
naytaVirhe("Ei saa olla tyhjä");
return;
}
ModalController.closeStage(labelVirhe);
}
@FXML private void handleCancel() {
tietueKohdalla = null;
ModalController.closeStage(labelVirhe);
}
// ========================================================
private TYPE tietueKohdalla;
private TextField[] edits;
private int kentta = 0;
/**
* Luodaan GridPaneen tietueen tiedot
* @param gridTietue mihin tiedot luodaan
* @param aputietue malli josta tiedot otetaan
* @return luodut tekstikentät
*/
public static<TYPE extends Tietue> TextField[] luoKentat(GridPane gridTietue, TYPE aputietue) {
gridTietue.getChildren().clear();
TextField[] edits = new TextField[aputietue.getKenttia()];
for (int i=0, k = aputietue.ekaKentta(); k < aputietue.getKenttia(); k++, i++) {
Label label = new Label(aputietue.getKysymys(k));
gridTietue.add(label, 0, i);
TextField edit = new TextField();
edits[k] = edit;
edit.setId("e"+k);
gridTietue.add(edit, 1, i);
}
return edits;
}
/**
* Palautetaan komponentin id:stä saatava luku
* @param obj tutkittava komponentti
* @param oletus mikä arvo jos id ei ole kunnollinen
* @return komponentin id lukuna
*/
public static int getFieldId(Object obj, int oletus) {
if ( !( obj instanceof Node)) return oletus;
Node node = (Node)obj;
return Mjonot.erotaInt(node.getId().substring(1),oletus);
}
/**
* Tekee tarvittavat muut alustukset, nyt vaihdetaan GridPanen tilalle
* yksi iso tekstikenttä, johon voidaan tulostaa tietueen tiedot.
*/
protected void alusta() {
edits = luoKentat(gridTietue, tietueKohdalla);
for (TextField edit : edits)
if ( edit != null )
edit.setOnKeyReleased( e -> kasitteleMuutosTietueeseen((TextField)(e.getSource())));
// panelTietue.setFitToHeight(true);
}
@Override
public void setDefault(TYPE oletus) {
tietueKohdalla = oletus;
alusta();
naytaTietue(edits, tietueKohdalla);
}
@Override
public TYPE getResult() {
return tietueKohdalla;
}
private void setKentta(int kentta) {
this.kentta = kentta;
}
/**
* Mitä tehdään kun dialogi on näytetty
*/
@Override
public void handleShown() {
kentta = Math.max(tietueKohdalla.ekaKentta(), Math.min(kentta, tietueKohdalla.getKenttia()-1));
edits[kentta].requestFocus();
}
private void naytaVirhe(String virhe) {
if ( virhe == null || virhe.isEmpty() ) {
labelVirhe.setText("");
labelVirhe.getStyleClass().removeAll("virhe");
return;
}
labelVirhe.setText(virhe);
labelVirhe.getStyleClass().add("virhe");
}
/**
* Käsitellään teitueeseen tullut muutos
* @param edit muuttunut kenttä
*/
protected void kasitteleMuutosTietueeseen(TextField edit) {
if (tietueKohdalla == null) return;
int k = getFieldId(edit,tietueKohdalla.ekaKentta());
String s = edit.getText();
String virhe = null;
virhe = tietueKohdalla.aseta(k,s);
if (virhe == null) {
Dialogs.setToolTipText(edit,"");
edit.getStyleClass().removeAll("virhe");
naytaVirhe(virhe);
} else {
Dialogs.setToolTipText(edit,virhe);
edit.getStyleClass().add("virhe");
naytaVirhe(virhe);
}
}
/**
* Näytetään tietueen tiedot TextField komponentteihin
* @param edits taulukko TextFieldeistä johon näytetään
* @param tietue näytettävä tietue
*/
public static void naytaTietue(TextField[] edits, Tietue tietue) {
if (tietue == null) return;
for (int k = tietue.ekaKentta(); k < tietue.getKenttia(); k++) {
edits[k].setText(tietue.anna(k));
}
}
/**
* Luodaan tietueen kysymisdialogi ja palautetaan sama tietue muutettuna tai null
* @param modalityStage mille ollaan modaalisia, null = sovellukselle
* @param oletus mitä dataan näytetään oletuksena
* @param kentta mikä kenttä saa fokuksen kun näytetään
* @return null jos painetaan Cancel, muuten täytetty tietue
*/
public static<TYPE extends Tietue> TYPE kysyTietue(Stage modalityStage, TYPE oletus, int kentta) {
return ModalController.<TYPE, TietueDialogController<TYPE>>showModal(
TietueDialogController.class.getResource("TietueDialogView.fxml"),
"Kerho",
modalityStage, oletus,
ctrl -> ctrl.setKentta(kentta)
);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.*?>
<?import java.lang.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.*?>
<?import javafx.scene.layout.BorderPane?>
<BorderPane stylesheets="@kerho.css" xmlns="http://javafx.com/javafx/8.0.40" xmlns:fx="http://javafx.com/fxml/1" fx:controller="fxKerho.TietueDialogController">
<bottom>
<VBox BorderPane.alignment="CENTER">
<children>
<Label fx:id="labelVirhe" maxWidth="1000.0" />
<HBox />
<ButtonBar prefHeight="40.0" prefWidth="200.0">
<buttons>
<Button defaultButton="true" mnemonicParsing="false" onAction="#handleOK" text="OK" />
<Button cancelButton="true" mnemonicParsing="false" onAction="#handleCancel" text="Cancel" />
</buttons>
<padding>
<Insets right="10.0" />
</padding>
</ButtonBar>
</children>
</VBox>
</bottom>
<center>
<ScrollPane fx:id="panelTietue" fitToWidth="true" pannable="true" BorderPane.alignment="CENTER">
<content>
<GridPane fx:id="gridTietue" hgap="10.0">
<columnConstraints>
<ColumnConstraints fillWidth="false" halignment="RIGHT" hgrow="NEVER" minWidth="10.0" />
<ColumnConstraints hgrow="ALWAYS" minWidth="10.0" />
</columnConstraints>
<rowConstraints>
<RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
</rowConstraints>
<children>
<Label text="nimi" />
<Label text="hetu" GridPane.rowIndex="1" />
<Label text="katuosoite" GridPane.rowIndex="2" />
<Label text="postinumero" GridPane.rowIndex="3" />
<Label text="postiosoite" GridPane.rowIndex="4" />
<Label text="kotipuhelin" GridPane.rowIndex="5" />
<Label text="työpuhelin" GridPane.rowIndex="6" />
<Label text="autopuhelin" GridPane.rowIndex="7" />
<Label text="liittymisvuosi" GridPane.rowIndex="8" />
<Label text="jäsenmaksu" GridPane.rowIndex="9" />
<Label text="maksettu maksu" GridPane.rowIndex="10" />
<Label text="lisätietoja" GridPane.rowIndex="11" />
<TextField text="Ankka Aku" GridPane.columnIndex="1" GridPane.hgrow="ALWAYS" />
<TextField text="010245-123U" GridPane.columnIndex="1" GridPane.hgrow="ALWAYS" GridPane.rowIndex="1" />
<TextField text="Paratiisitie 13" GridPane.columnIndex="1" GridPane.hgrow="ALWAYS" GridPane.rowIndex="2" />
<TextField text="12345" GridPane.columnIndex="1" GridPane.hgrow="ALWAYS" GridPane.rowIndex="3" />
<TextField text="ANKKALINNA" GridPane.columnIndex="1" GridPane.hgrow="ALWAYS" GridPane.rowIndex="4" />
<TextField text="12-12345" GridPane.columnIndex="1" GridPane.hgrow="ALWAYS" GridPane.rowIndex="5" />
<TextField text="2" GridPane.columnIndex="1" GridPane.hgrow="ALWAYS" GridPane.rowIndex="6" />
<TextField GridPane.columnIndex="1" GridPane.hgrow="ALWAYS" GridPane.rowIndex="7" />
<TextField text="1996" GridPane.columnIndex="1" GridPane.hgrow="ALWAYS" GridPane.rowIndex="8" />
<TextField text="50.00" GridPane.columnIndex="1" GridPane.hgrow="ALWAYS" GridPane.rowIndex="9" />
<TextField text="0.00" GridPane.columnIndex="1" GridPane.hgrow="ALWAYS" GridPane.rowIndex="10" />
<TextField text="Velkaa Roopelle" GridPane.columnIndex="1" GridPane.hgrow="ALWAYS" GridPane.rowIndex="11" />
</children>
<opaqueInsets>
<Insets left="10.0" top="10.0" />
</opaqueInsets>
<padding>
<Insets left="10.0" right="10.0" top="10.0" />
</padding>
</GridPane>
</content>
</ScrollPane>
</center>
</BorderPane>
package kanta;
/**
* Rajapinta tietueelle johon voidaan taulukon avulla rakentaa
* "attribuutit".
* @author vesal
* @version Mar 23, 2012
* @example
*/
public interface Tietue {
/**
* @return tietueen kenttien lukumäärä
* @example
* <pre name="test">
* #import kerho.Harrastus;
* Harrastus har = new Harrastus();
* har.getKenttia() === 5;
* </pre>
*/
public abstract int getKenttia();
/**
* @return ensimmäinen käyttäjän syötettävän kentän indeksi
* @example
* <pre name="test">
* Harrastus har = new Harrastus();
* har.ekaKentta() === 2;
* </pre>
*/
public abstract int ekaKentta();
/**
* @param k minkä kentän kysymys halutaan
* @return valitun kentän kysymysteksti
* @example
* <pre name="test">
* Harrastus har = new Harrastus();
* har.getKysymys(2) === "ala";
* </pre>
*/
public abstract String getKysymys(int k);
/**
* @param k Minkä kentän sisältö halutaan
* @return valitun kentän sisältö
* @example
* <pre name="test">
* Harrastus har = new Harrastus();
* har.parse(" 2 | 10 | Kalastus | 1949 | 22 t ");
* har.anna(0) === "2";
* har.anna(1) === "10";
* har.anna(2) === "Kalastus";
* har.anna(3) === "1949";
* har.anna(4) === "22";
* </pre>
*/
public abstract String anna(int k);
/**
* Asetetaan valitun kentän sisältö. Mikäli asettaminen onnistuu,
* palautetaan null, muutoin virheteksti.
* @param k minkä kentän sisältö asetetaan
* @param s asetettava sisältö merkkijonona
* @return null jos ok, muuten virheteksti
* @example
* <pre name="test">
* Harrastus har = new Harrastus();
* har.aseta(3,"kissa") === "aloitusvuosi: Ei kokonaisluku (kissa)";
* har.aseta(3,"1940") === null;
* har.aseta(4,"kissa") === "h/vko: Ei kokonaisluku (kissa)";
* har.aseta(4,"20") === null;
* </pre>
*/
public abstract String aseta(int k, String s);
/**
* Tehdään identtinen klooni tietueesta
* @return kloonattu tietue
* @throws CloneNotSupportedException jos kloonausta ei tueta
* @example
* <pre name="test">
* #THROWS CloneNotSupportedException
* Harrastus har = new Harrastus();
* har.parse(" 2 | 10 | Kalastus | 1949 | 22 t ");
* Object kopio = har.clone();
* kopio.toString() === har.toString();
* har.parse(" 1 | 11 | Uinti | 1949 | 22 t ");
* kopio.toString().equals(har.toString()) === false;
* kopio instanceof Harrastus === true;
* </pre>
*/
public abstract Tietue clone() throws CloneNotSupportedException;
/**
* Palauttaa tietueen tiedot merkkijonona jonka voi tallentaa tiedostoon.
* @return tietue tolppaeroteltuna merkkijonona
* @example
* <pre name="test">
* Harrastus harrastus = new Harrastus();
* harrastus.parse(" 2 | 10 | Kalastus | 1949 | 22 t ");
* harrastus.toString() =R= "2\\|10\\|Kalastus\\|1949\\|22.*";
* </pre>
*/
@Override
public abstract String toString();
}
\ No newline at end of file
......@@ -21,7 +21,7 @@ public class Harrastukset implements Iterable<Harrastus> {
private String tiedostonPerusNimi = "";
/** Taulukko harrastuksista */
private final Collection<Harrastus> alkiot = new ArrayList<Harrastus>();
private final List<Harrastus> alkiot = new ArrayList<Harrastus>();
/**
......@@ -42,6 +42,47 @@ public class Harrastukset implements Iterable<Harrastus> {
}
/**
* Korvaa harrastuksen tietorakenteessa. Ottaa harrastuksen omistukseensa.
* Etsitään samalla tunnusnumerolla oleva harrastus. Jos ei löydy,
* niin lisätään uutena harrastuksena.
* @param harrastus lisättävän harrastuksen viite. Huom tietorakenne muuttuu omistajaksi
* @throws SailoException jos tietorakenne on jo täynnä
* @example
* <pre name="test">
* #THROWS SailoException,CloneNotSupportedException
* #PACKAGEIMPORT
* Harrastukset harrastukset = new Harrastukset();
* Harrastus har1 = new Harrastus(), har2 = new Harrastus();
* har1.rekisteroi(); har2.rekisteroi();
* harrastukset.getLkm() === 0;
* harrastukset.korvaaTaiLisaa(har1); harrastukset.getLkm() === 1;
* harrastukset.korvaaTaiLisaa(har2); harrastukset.getLkm() === 2;
* Harrastus har3 = har1.clone();
* har3.aseta(2,"kkk");
* Iterator<Harrastus> i2=harrastukset.iterator();
* i2.next() === har1;
* harrastukset.korvaaTaiLisaa(har3); harrastukset.getLkm() === 2;
* i2=harrastukset.iterator();
* Harrastus h = i2.next();
* h === har3;
* h == har3 === true;
* h == har1 === false;
* </pre>
*/
public void korvaaTaiLisaa(Harrastus harrastus) throws SailoException {
int id = harrastus.getTunnusNro();
for (int i = 0; i < getLkm(); i++) {
if (alkiot.get(i).getTunnusNro() == id) {
alkiot.set(i, harrastus);
muutettu = true;
return;
}
}
lisaa(harrastus);
}
/**
* Lukee harrastukset tiedostosta.
* @param tied tiedoston nimen alkuosa
......
......@@ -3,6 +3,8 @@ package kerho;
import java.io.*;
import fi.jyu.mit.ohj2.Mjonot;
import kanta.Tietue;
import static kanta.HetuTarkistus.rand;
/**
......@@ -11,7 +13,7 @@ import static kanta.HetuTarkistus.rand;
* @author Vesa Lappalainen
* @version 1.0, 22.02.2003
*/
public class Harrastus implements Cloneable {
public class Harrastus implements Cloneable, Tietue {
private int tunnusNro;
private int jasenNro;
private String ala="";
......@@ -41,6 +43,7 @@ public class Harrastus implements Cloneable {
/**
* @return harrastukse kenttien lukumäärä
*/
@Override
public int getKenttia() {
return 5;
}
......@@ -49,6 +52,7 @@ public class Harrastus implements Cloneable {
/**
* @return ensimmäinen käyttäjän syötettävän kentän indeksi
*/
@Override
public int ekaKentta() {
return 2;
}
......@@ -58,6 +62,7 @@ public class Harrastus implements Cloneable {
* @param k minkä kentän kysymys halutaan
* @return valitun kentän kysymysteksti
*/
@Override
public String getKysymys(int k) {
switch (k) {
case 0:
......@@ -91,6 +96,7 @@ public class Harrastus implements Cloneable {
*
* </pre>
*/
@Override
public String anna(int k) {
switch (k) {
case 0:
......@@ -118,13 +124,13 @@ public class Harrastus implements Cloneable {
* @example
* <pre name="test">
* Harrastus har = new Harrastus();
* har.aseta(3,"kissa") === "Aloitusvuosi väärin jono = \"kissa\"";
* har.aseta(3,"kissa") === "aloitusvuosi: Ei kokonaisluku (kissa)";
* har.aseta(3,"1940") === null;
* har.aseta(4,"kissa") === "Viikkotunnit väärin jono = \"kissa\"";
* har.aseta(4,"kissa") === "h/vko: Ei kokonaisluku (kissa)";
* har.aseta(4,"20") === null;
*
* </pre>
*/
@Override
public String aseta(int k, String s) {
String st = s.trim();
StringBuffer sb = new StringBuffer(st);
......@@ -142,7 +148,7 @@ public class Harrastus implements Cloneable {
try {
aloitusvuosi = Mjonot.erotaEx(sb, '§', aloitusvuosi);
} catch (NumberFormatException ex) {
return "Aloitusvuosi väärin " + ex.getMessage();
return "aloitusvuosi: Ei kokonaisluku ("+st+")";
}
return null;
......@@ -150,7 +156,7 @@ public class Harrastus implements Cloneable {
try {
tuntiaViikossa = Mjonot.erotaEx(sb, '§', tuntiaViikossa);
} catch (NumberFormatException ex) {
return "Viikkotunnit väärin " + ex.getMessage();
return "h/vko: Ei kokonaisluku ("+st+")";
}
return null;
......
......@@ -5,6 +5,8 @@ import java.io.*;
import fi.jyu.mit.ohj2.Mjonot;
import kanta.HetuTarkistus;
import kanta.Tietue;
import static kanta.HetuTarkistus.*;
/**
......@@ -13,7 +15,7 @@ import static kanta.HetuTarkistus.*;
* @author Vesa Lappalainen
* @version 1.0, 22.02.2003
*/
public class Jasen implements Cloneable {
public class Jasen implements Cloneable, Tietue {
private int tunnusNro;
private String nimi = "";
private String hetu = "";
......@@ -35,6 +37,7 @@ public class Jasen implements Cloneable {
* Palauttaa jäsenen kenttien lukumäärän
* @return kenttien lukumäärä
*/
@Override
public int getKenttia() {
return 13;
}
......@@ -44,6 +47,7 @@ public class Jasen implements Cloneable {
* Eka kenttä joka on mielekäs kysyttäväksi
* @return eknn kentän indeksi
*/
@Override
public int ekaKentta() {
return 1;
}
......@@ -77,6 +81,7 @@ public class Jasen implements Cloneable {
* @param k monenenko kentän sisältö palautetaan
* @return kentän sisältö merkkijonona
*/
@Override
public String anna(int k) {
switch ( k ) {
case 0: return "" + tunnusNro;
......@@ -113,6 +118,7 @@ public class Jasen implements Cloneable {
* jasen.aseta(9,"1940") === null;
* </pre>
*/
@Override
public String aseta(int k, String jono) {
String tjono = jono.trim();
StringBuffer sb = new StringBuffer(tjono);
......@@ -174,6 +180,7 @@ public class Jasen implements Cloneable {
* @param k kuinka monennen kentän kysymys palautetaan (0-alkuinen)
* @return k:netta kenttää vastaava kysymys
*/
@Override
public String getKysymys(int k) {
switch ( k ) {
case 0: return "Tunnus nro";
......
......@@ -107,6 +107,18 @@ public class Kerho {
}
/**
* Korvaa harrastuksen tietorakenteessa. Ottaa harrastuksen omistukseensa.
* Etsitään samalla tunnusnumerolla oleva harrastus. Jos ei löydy,
* niin lisätään uutena harrastuksena.
* @param harrastus lisärtävän harrastuksen viite. Huom tietorakenne muuttuu omistajaksi
* @throws SailoException jos tietorakenne on jo täynnä
*/
public void korvaaTaiLisaa(Harrastus harrastus) throws SailoException {
harrastukset.korvaaTaiLisaa(harrastus);
}
/**
* Listään uusi harrastus kerhoon
* @param har lisättävä harrastus
......
......@@ -13,6 +13,7 @@ import org.junit.runners.Suite.SuiteClasses;
@SuiteClasses({
kanta.test.HetuTarkistusTest.class,
kanta.test.SisaltaaTarkistajaTest.class,
kanta.test.TietueTest.class,
kerho.test.JasenTest.class,
kerho.test.JasenetTest.class,
kerho.test.HarrastusTest.class,
......