Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • tie/ohj2/ve/2025/kevat/ohj2
  • hasemajo/ohj2
  • nikaleko/ohj2
  • tntvanha/ohj2
  • lemaline/ohj2
  • rintahe/ohj2
  • tersaton/ohj2
  • tornhale/ohj2
  • pjyypiix/ohj-2
  • aneejoko/ohj2
  • reponaw/ohj2
  • saarian/ohj2
  • niemimm/ohj2
  • jppaasww/ohj2-2025k
  • ssniinim/ohj2
  • niememan/ohj2
  • milimaas/ohj2
  • kallmovu/ohj2
  • adaoliro/ohj2
  • tojuhann/ohj2
  • vevejuha/ohj2
  • mieikrla/ohj2
  • miankort/ohj2
  • saeteppo/ohj2
  • saelripa/ohj2
  • saniitty/ohj2
  • nsmietyt/ohj2
  • mikkolto/ohj2
  • mmuhonen/ohj2k25
  • saukkota/ohj-2-ht
  • eenorta/ohj2
  • oapaaso/ht-2
  • eeeeoino/ohj2
  • hietmaem/ohj2
  • vvlaspa/ohj2ht
  • lalaajal/ohj2
  • pepartyy/ohj2
  • loukovjv/ohj2
  • vihtkaan/ohj2
  • annelinu/ohjelmointi2
  • lehtikmi/ohj2
  • ihakalel/ohj2
  • aichinos/ohj2
  • lahteela/ohj-2-ht
  • pellrata/ohj2
  • iljinisa/ohj2
  • nkeuren/ohj2
  • hiltunma/ohj2
  • esshelkr/ohj2
  • vianelo/ohj2
  • kousaepw/ohj-2-ht
  • amheikkz/ohj2
  • jatirkko/ohj2
  • akharine/ohj2
  • rlokilja/ohj2
  • eskrliim/ohj2
  • masakoiv/ohj2
  • toivjope/ohj2
  • sasalons/ohj2
  • hirvepjw/ohj2
  • lajoveps/vuororekisteri
  • lelitirr/ohj-225
  • juhsansa/ohj2
  • essmarpe/ohj2
  • lehtlrvt/ohj2
  • setilus/ohj2
  • julipits/ohj2
  • kivistve/ohj2
  • erpajala/ohj2
  • pslohi/ohj2
  • sediiv/ohj2
  • jovesaar/ohj2
  • jutaalko/ohj2
  • valltoha/ohj2
  • ruotvive/ohj2ht
  • kkvalke/ohj2
  • aetuukka/espanjakohderekisteri
  • pdanilei/ohj2ht
  • lahtlule/ohj2
  • jaemvahu/ohj2
  • kantsiii/ohj2
  • tototuru/ohj2
  • elmotabe/ohj2
  • sutinele/ohj2
  • vepajuna/ohj2
  • tornittu/reseptilista
  • sasoleht/ohj2
  • eemjorto/ohj2
  • gagolzar/ohj2
  • sievanee/ohj2
  • nobekail/ohj2
  • mamiparv/ohj2
  • halolpvz/ohj2
  • tukilo/ohj2
  • mmleppis/ohj2
  • tmruisma/ohj2
  • aajataip/ohj-2
  • salonevs/ohj-2
  • ygulusen/ohj2
  • saarakka/ohj2
  • eakoskix/ohj2
  • lamminm/ohj2ht
  • sellmmv/salibandynpelaajarekisteri
  • tuoskopp/ohj2
  • haarates/ohj-2
  • jormlsuu/ohj2
  • lihiauka/ohj2
  • eeemkarv/ohj2
  • uekolehm/ohj2
  • smkolari/ohj-2-a
  • spicjrxz/ohj2
  • maalvirt/ohj-2-ht
  • hietaolo/ohj2ht
  • rtmatilt/ohj2
  • veevjoen/ohj2
  • lainejee/ohj2
  • pohtojoj/tuotelistaaja
  • jokayli/ohj2
  • sulasaal/ohj2
  • kalloupe/ohj2
  • apeshhhh/ohj2
  • kopperp/ohj2
  • garammtu/ohj2
  • ettalaes/ohj2
  • rajanije/ohj2
  • timovaan/ohj2
  • mkvuonos/ohj2
  • tuomiluu/ohj2
  • konttijm/ohj2
  • palolala/ohj2
  • vejokauk/ohj2
  • peihanus/ohj2
  • itsario/ohj2
  • hejumivu/ohj2
  • isojarto/ohj2
  • pirinpot/ohj2ht
  • oihietan/ohj2
  • niemhizz/ohj2
  • oparve/ohj2
  • truhtejo/ohj-2-ht
  • malineps/ohj-2-pelivalikoima
  • kylkii/ohj2
  • emigrank/ohj2
  • samavakk/ohj2
  • lausofla/ohj2
  • arossors/ohj-2-2
  • nurmsajo/ohj2
  • mattarma/ohj2
  • akjuhesa/ohj-2-ht
  • ovevalka/ohj2
  • lequyanh/ohj-2-ht
  • jasyvays/ohj2
  • lindtope/ohj2
  • kaipainm/ohj2
  • peillips/ohj2
  • miwamich/ohj2
  • anpahypp/ohj2harkka
  • kreenk/ohj2
  • iiaumaoi/ohj2
  • jmsutizy/ohj-2-25
  • conrcsir/ohj2
  • palaakho/ht-metsastyspaivakirja
  • makelkjt/ohj2
  • jooantni/ohj2
  • ttkelaw/ohj-2-2025-k
  • koivishe/kuntohalli-oy
  • laleiho/harjoitustyo-ohj-2
  • joolmatt/ohj2-ht
  • akrasa/ohj2
  • rikretel/ohj-2-ht
  • vuorelma/ohj2
171 results
Show changes
Showing
with 1461 additions and 0 deletions
package Kirjalista.test;
// Generated by ComTest BEGIN
import static org.junit.Assert.*;
import org.junit.*;
import Kirjalista.*;
// Generated by ComTest END
/**
* Test class made by ComTest
* @version 2025.04.01 17:06:32 // Generated by ComTest
*
*/
@SuppressWarnings({ "all" })
public class GenreTest {
// Generated by ComTest BEGIN
/** testParse25 */
@Test
public void testParse25() { // Genre: 25
Genre g = new Genre();
g.parse("fantasia");
assertEquals("From: Genre line: 28", "0|fantasia", g.toString());
g.parse("FANTASIA");
assertEquals("From: Genre line: 30", "0|fantasia", g.toString());
g.parse(" Fantasia ");
assertEquals("From: Genre line: 32", "0|fantasia", g.toString());
assertEquals("From: Genre line: 33", "fantasia", g.getNimi());
} // Generated by ComTest END
// Generated by ComTest BEGIN
/** testParseTiedostosta48 */
@Test
public void testParseTiedostosta48() { // Genre: 48
Genre g = new Genre();
g.parseTiedostosta("1|fantasia");
assertEquals("From: Genre line: 51", "1|fantasia", g.toString());
g.parseTiedostosta(" 01| FANTASIA ");
assertEquals("From: Genre line: 53", "1|fantasia", g.toString());
g.parseTiedostosta("1| Fantasia ");
assertEquals("From: Genre line: 55", "1|fantasia", g.toString());
} // Generated by ComTest END
// Generated by ComTest BEGIN
/** testRekisteroi77 */
@Test
public void testRekisteroi77() { // Genre: 77
Genre g1 = new Genre();
Genre g2 = new Genre();
g1.rekisteroi();
g2.rekisteroi();
assertEquals("From: Genre line: 82", g2.getId() - 1, g1.getId());
} // Generated by ComTest END
}
\ No newline at end of file
package Kirjalista.test;
// Generated by ComTest BEGIN
import java.util.NoSuchElementException;
import static org.junit.Assert.*;
import org.junit.*;
import Kirjalista.*;
// Generated by ComTest END
/**
* Test class made by ComTest
* @version 2025.04.01 17:09:12 // Generated by ComTest
*
*/
@SuppressWarnings({ "all" })
public class GenretTest {
// Generated by ComTest BEGIN
/** testGenret16 */
@Test
public void testGenret16() { // Genret: 16
Genret g = new Genret();
Genre g1 = Genre.testiGenre();
Genre g2 = Genre.testiGenre();
Genre g3 = Genre.testiGenre();
g.lisaa(g1);
g.lisaa(g2);
g.lisaa(g3);
Genre g4 = new Genre();
g4.parseTiedostosta(g1.toString());
assertEquals("From: Genret line: 30", true, g.onOlemassa(g4.getNimi()));
assertEquals("From: Genret line: 32", g1.getId(), g.haeIdNimella(g1.getNimi()));
assertEquals("From: Genret line: 33", g2.getId(), g.haeIdNimella(g2.getNimi()));
assertEquals("From: Genret line: 34", g3.getId(), g.haeIdNimella(g3.getNimi()));
assertEquals("From: Genret line: 36", g1.getId() + "|" + g1.getNimi(), g.hae(g1.getId()).toString());
assertEquals("From: Genret line: 37", g2.getId() + "|" + g2.getNimi(), g.hae(g2.getId()).toString());
assertEquals("From: Genret line: 38", g3.getId() + "|" + g3.getNimi(), g.hae(g3.getId()).toString());
int g1Id = g1.getId();
g.poista(g1Id);
try {
g.hae(g1Id);
fail("Genret: 42 Did not throw NoSuchElementException");
} catch(NoSuchElementException _e_){ _e_.getMessage(); }
} // Generated by ComTest END
}
\ No newline at end of file
package Kirjalista.test;
// Generated by ComTest BEGIN
import static org.junit.Assert.*;
import org.junit.*;
import Kirjalista.*;
// Generated by ComTest END
/**
* Test class made by ComTest
* @version 2025.04.01 17:09:37 // Generated by ComTest
*
*/
@SuppressWarnings({ "all" })
public class KirjaTest {
// Generated by ComTest BEGIN
/** testParse32 */
@Test
public void testParse32() { // Kirja: 32
Kirja k = new Kirja();
k.parse("Hobitti|J.R.R. Tolkien||1937|336");
assertEquals("From: Kirja line: 35", "0|Hobitti|J.R.R. Tolkien||1937|336", k.toString());
Kirja k2 = new Kirja();
k2.parse(" Hobitti | J.R.R. Tolkien | | 1937 | 336");
assertEquals("From: Kirja line: 39", "0|Hobitti|J.R.R. Tolkien||1937|336", k2.toString());
} // Generated by ComTest END
// Generated by ComTest BEGIN
/** testParseTiedostosta70 */
@Test
public void testParseTiedostosta70() { // Kirja: 70
Kirja k = new Kirja();
k.parseTiedostosta("01|Hobitti|J.R.R. Tolkien||1937|336");
assertEquals("From: Kirja line: 73", "1|Hobitti|J.R.R. Tolkien||1937|336", k.toString());
Kirja k2 = new Kirja();
k2.parseTiedostosta(" 2 | Hobitti | J.R.R. Tolkien | | 1937| 336");
assertEquals("From: Kirja line: 77", "2|Hobitti|J.R.R. Tolkien||1937|336", k2.toString());
} // Generated by ComTest END
// Generated by ComTest BEGIN
/** testRekisteroi112 */
@Test
public void testRekisteroi112() { // Kirja: 112
Kirja k = new Kirja();
Kirja k2 = new Kirja();
k.rekisteroi();
k2.rekisteroi();
assertEquals("From: Kirja line: 117", k2.getId() - 1, k.getId());
} // Generated by ComTest END
}
\ No newline at end of file
package Kirjalista.test;
// Generated by ComTest BEGIN
import static org.junit.Assert.*;
import org.junit.*;
import Kirjalista.*;
// Generated by ComTest END
/**
* Test class made by ComTest
* @version 2025.04.01 17:09:43 // Generated by ComTest
*
*/
@SuppressWarnings({ "all" })
public class KirjanGenreTest {
// Generated by ComTest BEGIN
/** testParse51 */
@Test
public void testParse51() { // KirjanGenre: 51
KirjanGenre kg = new KirjanGenre();
kg.parse("1|2");
assertEquals("From: KirjanGenre line: 55", "1|2", kg.toString());
kg.parse("0|0");
assertEquals("From: KirjanGenre line: 57", "0|0", kg.toString());
kg.parse("100|100");
assertEquals("From: KirjanGenre line: 59", "100|100", kg.toString());
kg.parse("2|2");
assertEquals("From: KirjanGenre line: 61", "2|2", kg.toString());
} // Generated by ComTest END
}
\ No newline at end of file
package Kirjalista.test;
// Generated by ComTest BEGIN
import java.util.NoSuchElementException;
import static org.junit.Assert.*;
import org.junit.*;
import Kirjalista.*;
// Generated by ComTest END
/**
* Test class made by ComTest
* @version 2025.04.02 13:36:15 // Generated by ComTest
*
*/
@SuppressWarnings({ "all" })
public class KirjatTest {
// Generated by ComTest BEGIN
/** testKirjat15 */
@Test
public void testKirjat15() { // Kirjat: 15
Kirjat kirjat = new Kirjat();
Kirja k1 = new Kirja();
Kirja k2 = new Kirja();
Kirja k3 = new Kirja();
k1.parse("Hobitti1 |J.R.R. Tolkien||336");
k2.parseTiedostosta("2|Hobitti2 |J.R.R. Tolkien||336");
k3.parseTiedostosta("3|Hobitti3 |J.R.R. Tolkien||336");
kirjat.lisaa(k1);
kirjat.lisaa(k2);
kirjat.lisaa(k3);
assertEquals("From: Kirjat line: 34", "Hobitti1", kirjat.hae(k1.getId()).getNimi());
assertEquals("From: Kirjat line: 35", "Hobitti3", kirjat.hae(k3.getId()).getNimi());
try {
kirjat.hae(1);
fail("Kirjat: 36 Did not throw NoSuchElementException");
} catch(NoSuchElementException _e_){ _e_.getMessage(); }
try {
kirjat.hae(5);
fail("Kirjat: 37 Did not throw NoSuchElementException");
} catch(NoSuchElementException _e_){ _e_.getMessage(); }
int k2Id = k2.getId();
kirjat.poista(k2Id);
try {
kirjat.poista(1);
fail("Kirjat: 41 Did not throw NoSuchElementException");
} catch(NoSuchElementException _e_){ _e_.getMessage(); }
try {
kirjat.hae(k2Id);
fail("Kirjat: 42 Did not throw NoSuchElementException");
} catch(NoSuchElementException _e_){ _e_.getMessage(); }
} // Generated by ComTest END
// Generated by ComTest BEGIN
/** testLisaa55 */
@Test
public void testLisaa55() { // Kirjat: 55
Kirja kirja = new Kirja();
Kirjat kirjat = new Kirjat();
for (int i = 0; i < 8; i++) {
kirjat.lisaa(kirja);
assertEquals("From: Kirjat line: 60", i + 1, kirjat.getLkm());
}
assertEquals("From: Kirjat line: 62", 8, kirjat.getLkm());
} // Generated by ComTest END
}
\ No newline at end of file
package fxKirjalista;
import java.awt.Desktop;
import java.io.IOException;
import java.io.PrintStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.ResourceBundle;
import Kirjalista.Genre;
import Kirjalista.Kirja;
import Kirjalista.Kirjasto;
import fi.jyu.mit.fxgui.ListChooser;
import fi.jyu.mit.fxgui.TextAreaOutputStream;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.ButtonBar.ButtonData;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Pane;
import javafx.scene.control.ButtonType;
import javafx.scene.control.MenuItem;
import javafx.scene.control.SplitMenuButton;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.stage.Modality;
import javafx.stage.Stage;
/**
* Ohjelman pääikkunan käsittelijä
*/
public class KirjalistaGUIController implements Initializable {
@FXML private ListChooser<Kirja> chooserKirjat;
@FXML private GridPane gridTiedot;
@FXML private TextField textNimi;
@FXML private TextField textKirjailija;
@FXML private TextField textSarja;
@FXML private TextField textGenre;
@FXML private TextField textVuosi;
@FXML private TextField textSivu;
@FXML private TextField hakuKentta;
@FXML private SplitMenuButton hakuehtoMenu;
@FXML private MenuItem menuGenre;
@FXML private MenuItem menuNimi;
@FXML private MenuItem menuKirjailija;
@FXML private MenuItem menuKirjasarja;
/**
* Kirjan lisäys
*/
@FXML void handleLisaaKirja() {
try {
Stage lisaaStage = new Stage();
lisaaStage.initModality(Modality.APPLICATION_MODAL);
final FXMLLoader ldr = new FXMLLoader(getClass().getResource("LisaaView.fxml"));
final Pane root = (Pane)ldr.load();
final LisaaController lisaaCtrl = (LisaaController) ldr.getController();
final Scene scene = new Scene(root);
scene.getStylesheets().add(getClass().getResource("kirjalista.css").toExternalForm());
lisaaStage.setScene(scene);
lisaaStage.setTitle("Lisää kirja");
lisaaCtrl.setIsanta(this);
lisaaCtrl.setKirjasto(this.kirjasto);
lisaaStage.show();
} catch(Exception e) {
e.printStackTrace();
}
}
/**
* Kirjan muokkaus
*/
@FXML void handleMuokkaaKirja() {
if (valittuKirja == null) {
return;
}
try {
Stage muokkaaStage = new Stage();
muokkaaStage.initModality(Modality.APPLICATION_MODAL);
final FXMLLoader ldr = new FXMLLoader(getClass().getResource("MuokkaaView.fxml"));
final Pane root = (Pane)ldr.load();
final LisaaController muokkaaCtrl = (LisaaController) ldr.getController();
final Scene scene = new Scene(root);
scene.getStylesheets().add(getClass().getResource("kirjalista.css").toExternalForm());
muokkaaStage.setScene(scene);
muokkaaStage.setTitle("Muokkaa kirjaa");
muokkaaCtrl.setIsanta(this);
muokkaaCtrl.setKirjasto(this.kirjasto);
muokkaaCtrl.setMuokattava(valittuKirja);
muokkaaStage.show();
} catch(Exception e) {
e.printStackTrace();
}
}
/**
* Tietojen tallentaminen
*/
@FXML void handleTallenna() {
tallenna();
}
/**
* Apua-valikon tietoja-valinta
*/
@FXML void handleTietoja() {
tietoja();
}
/**
* Tiedosto-valikon tulosta-valinta
*/
@FXML void handleTulosta() {
TulostusController ctrl = TulostusController.tulosta(null);
tulosta(ctrl.getTextArea());
}
/**
* Muokkaa-valikon poista-valinta
*/
@FXML void poistaKirja() {
poistoVahvistus();
}
@FXML void handleHaku() {
hae(0);
}
/*============================================================================*/
private Kirjasto kirjasto;
private Kirja valittuKirja;
private String hakuEhto = "nimi";
/**
* Vaihtaa hakuehdon valittuun
* @param valittu Valittu hakuehto
*/
public void hakuEhto(MenuItem valittu) {
String ehto = valittu.getText();
if (hakuehtoMenu.getText().toLowerCase().contentEquals(ehto.toLowerCase())) {
hakuehtoMenu.setText("Hakuehto");
this.hakuEhto = "nimi";
hae(0);
return;
}
hakuehtoMenu.setText(ehto);
this.hakuEhto = ehto.toLowerCase();
hae(0);
}
/**
* Luo näytölle dialogin, joka kysyy vahvistusta kirjan poistamiseksi, jos
* vastaus on kyllä, kirja poistetaan
*/
public void poistoVahvistus() {
Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
alert.setTitle("Poista");
alert.setHeaderText(null);
alert.setContentText("Haluatko varmasti poistaa kirjan?");
ButtonType buttonTypeYes = new ButtonType("Kyllä", ButtonData.OK_DONE);
ButtonType buttonTypeCancel = new ButtonType("Ei", ButtonData.CANCEL_CLOSE);
alert.getButtonTypes().setAll(buttonTypeYes, buttonTypeCancel);
Optional<ButtonType> result = alert.showAndWait();
if ( result.get() == buttonTypeYes ) {
kirjasto.poistaKirja(valittuKirja);
hae(0);
}
}
/**
* Asettaa controllerille viitteen kirjasto-olioon
* @param kirjasto Kirjasto-luokan olio, johon viite asetetaan
*/
public void setKirjasto(Kirjasto kirjasto) {
this.kirjasto = kirjasto;
}
/**
* Hakee kirjat listchooseriin hakuehdon perusteella.
* Näyttää (yleensä) ylimmän kirjan tiedot.
* @param indeksi yleensä 0, paitsi jos halutaan näyttää tietyn kirjan tiedot
*/
public void hae(int indeksi) {
chooserKirjat.clear();
String haettuTeksti = hakuKentta.getText().toLowerCase();
int hakuIndeksi = 0;
// TODO voisi tehdä paremmin
switch (hakuEhto) {
case "genre":
hakuIndeksi = -1;
break;
case "nimi":
hakuIndeksi = 0;
break;
case "kirjailija":
hakuIndeksi = 1;
break;
case "kirjasarja":
hakuIndeksi = 2;
break;
default:
return;
}
// Haku muille ehdoille kuin genreille
if (hakuIndeksi >= 0) {
for (int i = 0; i < kirjasto.getKirjaLkm(); i++) {
Kirja kirja = kirjasto.haeKirjaIndeksilla(i);
ArrayList<String> kentat = kirja.getTiedot();
if (kentat.get(hakuIndeksi).toLowerCase().contains(haettuTeksti)) {
chooserKirjat.add(kirja.getNimi(), kirja);
}
}
} else { // Haku, jos hakuehto on genret
for (int i = 0; i < kirjasto.getKirjaLkm(); i++) {
Kirja kirja = kirjasto.haeKirjaIndeksilla(i);
Genre[] genret = kirjasto.haeGenret(kirja.getId());
for (Genre g : genret) {
if (g.getNimi().contains(haettuTeksti)) {
chooserKirjat.add(kirja.getNimi(), kirja);
break;
}
}
}
}
chooserKirjat.setSelectedIndex(indeksi);
naytaJasen();
}
/**
* Näyttää listasta valitun kirjan tiedot
*/
protected void naytaJasen() {
valittuKirja = chooserKirjat.getSelectedObject();
if (valittuKirja == null) return;
TextField[] tekstit = { textNimi, textKirjailija, textSarja, textVuosi, textSivu };
ArrayList<String> tiedot = valittuKirja.getTiedot();
for (int i = 0; i < tekstit.length; i++) {
tekstit[i].setText(tiedot.get(i));
}
StringBuilder genreText = new StringBuilder("");
for (Genre g : kirjasto.haeGenret(valittuKirja.getId())) {
genreText.append(g.getNimi());
genreText.append(", ");
}
genreText.delete(genreText.length() - 2, genreText.length());
textGenre.setText(genreText.toString());
}
/**
* Tulostaa hakuehdon täyttävien kirjojen tiedot textareaan
* @param teksti textarea
*/
public void tulosta(TextArea teksti) {
List<Kirja> kirjat = chooserKirjat.getObjects();
try (PrintStream os = TextAreaOutputStream.getTextPrintStream(teksti)) {
for (Kirja k: kirjat) {
k.tulosta(os);
Genre[] genret = kirjasto.haeGenret(k.getId());
if (genret.length == 1) {
os.println(" Genre:");
} else os.println(" Genret:");
for (Genre g : genret) {
os.print(" -");
os.println(g.getNimi());
}
os.println();
}
}
}
/**
* Tekee tarvittavat muut alustukset
*/
protected void alusta() {
chooserKirjat.clear();
chooserKirjat.addSelectionListener(_ -> naytaJasen());
// TODO voisi tehdä paremmin
menuGenre.setOnAction( _ -> hakuEhto(menuGenre) );
menuNimi.setOnAction( _ -> hakuEhto(menuNimi) );
menuKirjailija.setOnAction( _ -> hakuEhto(menuKirjailija) );
menuKirjasarja.setOnAction( _ -> hakuEhto(menuKirjasarja) );
}
@Override
public void initialize(URL arg0, ResourceBundle arg1) {
alusta();
}
/**
* Ohjelman käynnistyessä lukee tiedostosta tiedot ja asettaa ne näytölle
*/
public void lueTiedosto() {
kirjasto.lueTiedosto();
hae(0);
}
/**
* Kirjoittaa tiedot tiedostoihin
*/
public void tallenna() {
kirjasto.tallenna();
}
/**
* Tarkistetaan onko tallennus tehty
* @return true, jos sovelluksen saa sulkea
*/
public boolean voikoSulkea() {
tallenna();
return true;
}
/**
* @return Valittu kirja
*/
public Kirja getValittuKirja() {
return this.valittuKirja;
}
/**
* Näytetään ohjelman suunnitelma erillisessä selaimessa.
*/
public void tietoja() {
Desktop desktop = Desktop.getDesktop();
try {
URI uri = new URI("https://tim.jyu.fi/view/kurssit/tie/ohj2/v/2025/kevat/ht/tornhale");
desktop.browse(uri);
} catch (URISyntaxException e) {
return;
} catch (IOException e) {
return;
}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<?import fi.jyu.mit.fxgui.ListChooser?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.Menu?>
<?import javafx.scene.control.MenuBar?>
<?import javafx.scene.control.MenuItem?>
<?import javafx.scene.control.ScrollPane?>
<?import javafx.scene.control.SplitMenuButton?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.input.KeyCodeCombination?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.layout.VBox?>
<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" prefHeight="400.0" prefWidth="499.0" xmlns="http://javafx.com/javafx/23.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="fxKirjalista.KirjalistaGUIController">
<right>
<VBox maxHeight="400.0" maxWidth="258.0" prefHeight="400.0" prefWidth="258.0" BorderPane.alignment="CENTER">
<children>
<Label text="Kirjan tiedot:">
<VBox.margin>
<Insets bottom="7.0" left="7.0" right="7.0" top="7.0" />
</VBox.margin>
</Label>
<ScrollPane prefHeight="383.0" prefWidth="274.0">
<content>
<AnchorPane prefHeight="295.0" prefWidth="237.0">
<children>
<GridPane fx:id="gridTiedot" layoutX="-1.0" layoutY="1.0" prefHeight="235.0" prefWidth="238.0">
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="50.0" />
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
</columnConstraints>
<rowConstraints>
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
</rowConstraints>
<children>
<Label text="Nimi:">
<GridPane.margin>
<Insets bottom="5.0" left="7.0" right="5.0" top="5.0" />
</GridPane.margin>
</Label>
<Label text="Kirjailija:" GridPane.rowIndex="1">
<GridPane.margin>
<Insets bottom="5.0" left="7.0" right="5.0" top="5.0" />
</GridPane.margin>
</Label>
<Label text="Kirjasarja:" GridPane.rowIndex="2">
<GridPane.margin>
<Insets bottom="5.0" left="7.0" right="5.0" top="5.0" />
</GridPane.margin>
</Label>
<Label text="Genre:" GridPane.rowIndex="3">
<GridPane.margin>
<Insets bottom="5.0" left="7.0" right="5.0" top="5.0" />
</GridPane.margin>
</Label>
<Label text="Julkaisuvuosi:" GridPane.rowIndex="4">
<GridPane.margin>
<Insets bottom="5.0" left="7.0" right="5.0" top="5.0" />
</GridPane.margin>
</Label>
<TextField fx:id="textNimi" editable="false" GridPane.columnIndex="1">
<GridPane.margin>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</GridPane.margin>
</TextField>
<TextField fx:id="textKirjailija" editable="false" GridPane.columnIndex="1" GridPane.rowIndex="1">
<GridPane.margin>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</GridPane.margin>
</TextField>
<TextField fx:id="textSarja" editable="false" GridPane.columnIndex="1" GridPane.rowIndex="2">
<GridPane.margin>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</GridPane.margin>
</TextField>
<TextField fx:id="textGenre" editable="false" GridPane.columnIndex="1" GridPane.rowIndex="3">
<GridPane.margin>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</GridPane.margin>
</TextField>
<TextField fx:id="textVuosi" editable="false" GridPane.columnIndex="1" GridPane.rowIndex="4">
<GridPane.margin>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</GridPane.margin>
</TextField>
<Label text="Sivumäärä" GridPane.rowIndex="5">
<GridPane.margin>
<Insets bottom="5.0" left="7.0" right="5.0" top="5.0" />
</GridPane.margin>
</Label>
<TextField fx:id="textSivu" editable="false" GridPane.columnIndex="1" GridPane.rowIndex="5">
<GridPane.margin>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</GridPane.margin>
</TextField>
</children>
</GridPane>
</children>
</AnchorPane>
</content>
</ScrollPane>
</children></VBox>
</right>
<left>
<VBox prefHeight="330.0" prefWidth="300.0" BorderPane.alignment="CENTER">
<children>
<HBox prefHeight="38.0" prefWidth="250.0">
<children>
<TextField fx:id="hakuKentta" onKeyReleased="#handleHaku" opacity="0.58" promptText="Haku🔍" />
<SplitMenuButton fx:id="hakuehtoMenu" mnemonicParsing="false" text="Hakuehto">
<items>
<MenuItem fx:id="menuNimi" mnemonicParsing="false" text="Nimi" />
<MenuItem fx:id="menuKirjailija" mnemonicParsing="false" text="Kirjailija" />
<MenuItem fx:id="menuKirjasarja" mnemonicParsing="false" text="Kirjasarja" />
<MenuItem fx:id="menuGenre" mnemonicParsing="false" text="Genre" />
</items>
<HBox.margin>
<Insets left="7.0" />
</HBox.margin>
</SplitMenuButton>
</children>
<VBox.margin>
<Insets bottom="7.0" left="7.0" right="7.0" top="7.0" />
</VBox.margin>
</HBox>
<Label text="Kirjat:" textAlignment="CENTER">
<VBox.margin>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</VBox.margin>
</Label>
<ScrollPane prefHeight="311.0" prefWidth="256.0">
<content>
<AnchorPane prefHeight="336.0" prefWidth="267.0">
<children>
<ListChooser fx:id="chooserKirjat" prefHeight="336.0" prefWidth="284.0" rivit="" />
</children>
</AnchorPane>
</content>
</ScrollPane>
</children>
</VBox>
</left>
<top>
<MenuBar BorderPane.alignment="CENTER">
<menus>
<Menu mnemonicParsing="true" text="_Tiedosto">
<items>
<MenuItem mnemonicParsing="false" onAction="#handleTallenna" text="Tallenna">
<accelerator>
<KeyCodeCombination alt="UP" code="S" control="DOWN" meta="UP" shift="UP" shortcut="UP" />
</accelerator>
</MenuItem>
<MenuItem mnemonicParsing="false" onAction="#handleTulosta" text="Tulosta">
<accelerator>
<KeyCodeCombination alt="UP" code="P" control="DOWN" meta="UP" shift="UP" shortcut="UP" />
</accelerator>
</MenuItem>
</items>
</Menu>
<Menu mnemonicParsing="true" text="_Muokkaa">
<items>
<MenuItem mnemonicParsing="false" onAction="#handleMuokkaaKirja" text="Muokkaa">
<accelerator>
<KeyCodeCombination alt="UP" code="E" control="DOWN" meta="UP" shift="UP" shortcut="UP" />
</accelerator>
</MenuItem>
<MenuItem mnemonicParsing="false" onAction="#poistaKirja" text="Poista">
<accelerator>
<KeyCodeCombination alt="UP" code="DELETE" control="UP" meta="UP" shift="UP" shortcut="UP" />
</accelerator>
</MenuItem>
</items>
</Menu>
<Menu mnemonicParsing="true" text="_Apua">
<items>
<MenuItem mnemonicParsing="false" onAction="#handleTietoja" text="Tietoja">
<accelerator>
<KeyCodeCombination alt="UP" code="H" control="DOWN" meta="UP" shift="UP" shortcut="UP" />
</accelerator></MenuItem>
</items>
</Menu>
</menus>
<padding>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</padding>
</MenuBar>
</top>
<bottom>
<HBox BorderPane.alignment="CENTER">
<children>
<Button mnemonicParsing="false" onAction="#handleLisaaKirja" text="Lisää kirja">
<HBox.margin>
<Insets bottom="5.0" left="7.0" right="5.0" top="5.0" />
</HBox.margin>
</Button>
<Button mnemonicParsing="false" onAction="#handleMuokkaaKirja" text="Muokkaa">
<HBox.margin>
<Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
</HBox.margin>
</Button>
</children>
</HBox>
</bottom>
</BorderPane>
package fxKirjalista;
import Kirjalista.Kirjasto;
import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.fxml.FXMLLoader;
/**
* @author omistaja
* @version 23.1.2025
*
*/
public class KirjalistaMain extends Application {
@Override
public void start(Stage primaryStage) {
try {
final FXMLLoader ldr = new FXMLLoader(getClass().getResource("KirjalistaGUIView.fxml"));
final Pane root = (Pane)ldr.load();
final KirjalistaGUIController kirjalistaCtrl = (KirjalistaGUIController) ldr.getController();
final Scene scene = new Scene(root);
scene.getStylesheets().add(getClass().getResource("kirjalista.css").toExternalForm());
primaryStage.setScene(scene);
primaryStage.setTitle("Kirjalista");
primaryStage.setOnCloseRequest((event) -> {
if ( !kirjalistaCtrl.voikoSulkea() ) event.consume();
});
Kirjasto kirjasto = new Kirjasto();
kirjalistaCtrl.setKirjasto(kirjasto);
kirjalistaCtrl.lueTiedosto();
primaryStage.show();
} catch(Exception e) {
e.printStackTrace();
}
}
/**
* @param args Ei kaytossa
*/
public static void main(String[] args) {
launch(args);
}
}
\ No newline at end of file
package fxKirjalista;
import java.util.ArrayList;
import Kirjalista.Genre;
import Kirjalista.Kirja;
import Kirjalista.Kirjasto;
import javafx.fxml.FXML;
import javafx.scene.control.TextField;
import fi.jyu.mit.fxgui.Dialogs;
import fi.jyu.mit.fxgui.ModalController;
/**
* Kirjan liäämisikkunan käsittelijä
*/
public class LisaaController {
@FXML private TextField textGenre;
@FXML private TextField textKirjailija;
@FXML private TextField textNimi;
@FXML private TextField textSarja;
@FXML private TextField textSivu;
@FXML private TextField textVuosi;
private Kirjasto kirjasto;
private KirjalistaGUIController isanta;
@FXML void handleLisaaOK() {
uusiKirja();
}
@FXML void handleMuokkaaOK() {
TextField[] tekstit = { textNimi, textKirjailija, textSarja, textVuosi, textSivu };
if (tekstit[0].getText().isEmpty()) {
Dialogs.showMessageDialog("Et antanut kirjan nimeä");
return;
}
if (tekstit[1].getText().isEmpty()) {
Dialogs.showMessageDialog("Et antanut kirjailijan nimeä");
return;
}
muokkaaKirja();
ModalController.closeStage(textNimi);
}
@FXML void handlePoista() {
isanta.poistoVahvistus();
ModalController.closeStage(textNimi);
}
/**
* Asettaa controllerille viitteen kirjasto-olioon
* @param kirjasto Kirjasto-luokan olio, johon viite asetetaan
*/
public void setKirjasto(Kirjasto kirjasto) {
this.kirjasto = kirjasto;
}
/**
* Asettaa olion "isännäksi" kirjalistan pääikkunan kontrollerin, jotta
* keskustelu kontrollerien välillä toimii
* @param isanta Pääikkunan kontrolleri
*/
public void setIsanta(KirjalistaGUIController isanta) {
this.isanta = isanta;
}
/**
* Luo uuden kirjan, genret ja relaatiot.
*/
protected void uusiKirja() {
TextField[] tekstit = { textNimi, textKirjailija, textSarja, textVuosi, textSivu };
if (tekstit[0].getText().isEmpty()) {
Dialogs.showMessageDialog("Et antanut kirjan nimeä");
return;
}
if (tekstit[1].getText().isEmpty()) {
Dialogs.showMessageDialog("Et antanut kirjailijan nimeä");
return;
}
Kirja uusi = new Kirja();
StringBuilder sb = new StringBuilder();
for (TextField tf : tekstit) {
sb.append(tf.getText());
sb.append("|");
}
sb.deleteCharAt(sb.length() - 1);
uusi.parse(sb.toString());
String[] genreStr = textGenre.getText().split(",");
Genre[] genret = new Genre[genreStr.length];
for (int i = 0; i < genreStr.length; i++) {
Genre g = new Genre();
g.parse(genreStr[i]);
genret[i] = g;
}
kirjasto.lisaaGenre(genret);
kirjasto.lisaaGenreRelaatio(uusi, genret);
kirjasto.lisaaGenre(genret);
kirjasto.lisaaKirja(uusi);
kirjasto.lisaaGenreRelaatio(uusi, genret);
isanta.hae(kirjasto.getKirjaLkm() - 1);
ModalController.closeStage(textNimi);
}
/**
* Asettaa muokattavan kirjan tiedot muokkausikkunaan
* @param muokattava Muokattava kirja
*/
public void setMuokattava(Kirja muokattava) {
TextField[] tekstit = { textNimi, textKirjailija, textSarja, textVuosi, textSivu };
ArrayList<String> tiedot = muokattava.getTiedot();
for (int i = 0; i < tekstit.length; i++) {
tekstit[i].setText(tiedot.get(i));
}
StringBuilder genreText = new StringBuilder("");
for (Genre g : kirjasto.haeGenret(muokattava.getId())) {
genreText.append(g.getNimi());
genreText.append(", ");
}
genreText.delete(genreText.length() - 2, genreText.length());
textGenre.setText(genreText.toString());
}
/**
* Muokkaa kirjan
*/
public void muokkaaKirja() {
TextField[] tekstit = { textNimi, textKirjailija, textSarja, textVuosi, textSivu };
Kirja muokattava = this.isanta.getValittuKirja();
StringBuilder sb = new StringBuilder();
for (TextField tf : tekstit) {
sb.append(tf.getText());
sb.append("|");
}
sb.deleteCharAt(sb.length() - 1);
muokattava.parse(sb.toString());
String[] genreStr = textGenre.getText().split(",");
Genre[] genret = new Genre[genreStr.length];
for (int i = 0; i < genreStr.length; i++) {
Genre g = new Genre();
g.parse(genreStr[i]);
genret[i] = g;
}
kirjasto.lisaaGenre(genret);
kirjasto.poistaGenreRelaatio(muokattava);
kirjasto.lisaaGenreRelaatio(muokattava, genret);
this.isanta.naytaJasen();
}
}
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.layout.VBox?>
<VBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="343.0" prefWidth="255.0" xmlns="http://javafx.com/javafx/23.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="fxKirjalista.LisaaController">
<children>
<Label text="Lisää" />
<GridPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="272.0" prefWidth="241.0">
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
</columnConstraints>
<rowConstraints>
<RowConstraints vgrow="SOMETIMES" />
<RowConstraints vgrow="SOMETIMES" />
<RowConstraints vgrow="SOMETIMES" />
<RowConstraints vgrow="SOMETIMES" />
<RowConstraints vgrow="SOMETIMES" />
<RowConstraints vgrow="SOMETIMES" />
</rowConstraints>
<children>
<Label text="Nimi:">
<GridPane.margin>
<Insets left="7.0" right="7.0" />
</GridPane.margin>
</Label>
<Label text="Kirjailija:" GridPane.rowIndex="1">
<GridPane.margin>
<Insets left="7.0" right="7.0" />
</GridPane.margin>
</Label>
<Label text="Kirjasarja:" GridPane.rowIndex="2">
<GridPane.margin>
<Insets left="7.0" right="7.0" />
</GridPane.margin>
</Label>
<Label text="Genre:" GridPane.rowIndex="3">
<GridPane.margin>
<Insets left="7.0" right="7.0" />
</GridPane.margin>
</Label>
<Label text="Julkaisuvuosi:" GridPane.rowIndex="4">
<GridPane.margin>
<Insets left="7.0" right="7.0" />
</GridPane.margin>
</Label>
<TextField fx:id="textNimi" GridPane.columnIndex="1">
<GridPane.margin>
<Insets left="7.0" right="7.0" />
</GridPane.margin>
</TextField>
<TextField fx:id="textKirjailija" GridPane.columnIndex="1" GridPane.rowIndex="1">
<GridPane.margin>
<Insets left="7.0" right="7.0" />
</GridPane.margin>
</TextField>
<TextField fx:id="textSarja" GridPane.columnIndex="1" GridPane.rowIndex="2">
<GridPane.margin>
<Insets left="7.0" right="7.0" />
</GridPane.margin>
</TextField>
<TextField fx:id="textGenre" GridPane.columnIndex="1" GridPane.rowIndex="3">
<GridPane.margin>
<Insets left="7.0" right="7.0" />
</GridPane.margin>
</TextField>
<TextField fx:id="textVuosi" GridPane.columnIndex="1" GridPane.rowIndex="4">
<GridPane.margin>
<Insets left="7.0" right="7.0" />
</GridPane.margin>
</TextField>
<Label text="Sivumäärä:" GridPane.rowIndex="5">
<GridPane.margin>
<Insets left="7.0" right="7.0" />
</GridPane.margin>
</Label>
<TextField fx:id="textSivu" GridPane.columnIndex="1" GridPane.rowIndex="5">
<GridPane.margin>
<Insets left="7.0" right="7.0" />
</GridPane.margin>
</TextField>
</children>
</GridPane>
<HBox alignment="CENTER_RIGHT" prefHeight="100.0" prefWidth="200.0">
<children>
<Button contentDisplay="CENTER" mnemonicParsing="false" onAction="#handleLisaaOK" text="OK">
<padding>
<Insets bottom="5.0" left="20.0" right="20.0" top="5.0" />
</padding>
<HBox.margin>
<Insets bottom="7.0" left="7.0" right="7.0" top="7.0" />
</HBox.margin>
</Button>
</children>
</HBox>
</children>
<padding>
<Insets bottom="7.0" left="7.0" right="7.0" top="7.0" />
</padding>
</VBox>
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.layout.VBox?>
<VBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="343.0" prefWidth="255.0" xmlns="http://javafx.com/javafx/23.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="fxKirjalista.LisaaController">
<children>
<Label text="Muokkaa" />
<GridPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="272.0" prefWidth="241.0">
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
</columnConstraints>
<rowConstraints>
<RowConstraints vgrow="SOMETIMES" />
<RowConstraints vgrow="SOMETIMES" />
<RowConstraints vgrow="SOMETIMES" />
<RowConstraints vgrow="SOMETIMES" />
<RowConstraints vgrow="SOMETIMES" />
<RowConstraints vgrow="SOMETIMES" />
</rowConstraints>
<children>
<Label text="Nimi:">
<GridPane.margin>
<Insets left="7.0" right="7.0" />
</GridPane.margin>
</Label>
<Label text="Kirjailija:" GridPane.rowIndex="1">
<GridPane.margin>
<Insets left="7.0" right="7.0" />
</GridPane.margin>
</Label>
<Label text="Kirjasarja:" GridPane.rowIndex="2">
<GridPane.margin>
<Insets left="7.0" right="7.0" />
</GridPane.margin>
</Label>
<Label text="Genre:" GridPane.rowIndex="3">
<GridPane.margin>
<Insets left="7.0" right="7.0" />
</GridPane.margin>
</Label>
<Label text="Julkaisuvuosi:" GridPane.rowIndex="4">
<GridPane.margin>
<Insets left="7.0" right="7.0" />
</GridPane.margin>
</Label>
<TextField fx:id="textNimi" GridPane.columnIndex="1">
<GridPane.margin>
<Insets left="7.0" right="7.0" />
</GridPane.margin>
</TextField>
<TextField fx:id="textKirjailija" GridPane.columnIndex="1" GridPane.rowIndex="1">
<GridPane.margin>
<Insets left="7.0" right="7.0" />
</GridPane.margin>
</TextField>
<TextField fx:id="textSarja" GridPane.columnIndex="1" GridPane.rowIndex="2">
<GridPane.margin>
<Insets left="7.0" right="7.0" />
</GridPane.margin>
</TextField>
<TextField fx:id="textGenre" GridPane.columnIndex="1" GridPane.rowIndex="3">
<GridPane.margin>
<Insets left="7.0" right="7.0" />
</GridPane.margin>
</TextField>
<TextField fx:id="textVuosi" GridPane.columnIndex="1" GridPane.rowIndex="4">
<GridPane.margin>
<Insets left="7.0" right="7.0" />
</GridPane.margin>
</TextField>
<Label text="Sivumäärä:" GridPane.rowIndex="5">
<GridPane.margin>
<Insets left="7.0" right="7.0" />
</GridPane.margin>
</Label>
<TextField fx:id="textSivu" GridPane.columnIndex="1" GridPane.rowIndex="5">
<GridPane.margin>
<Insets left="7.0" right="7.0" />
</GridPane.margin>
</TextField>
</children>
</GridPane>
<HBox alignment="CENTER_RIGHT" prefHeight="100.0" prefWidth="200.0">
<children>
<Button contentDisplay="CENTER" mnemonicParsing="false" onAction="#handlePoista" text="Poista">
<padding>
<Insets bottom="5.0" left="20.0" right="20.0" top="5.0" />
</padding>
<HBox.margin>
<Insets bottom="7.0" left="7.0" right="7.0" top="7.0" />
</HBox.margin>
</Button>
<Button contentDisplay="CENTER" mnemonicParsing="false" onAction="#handleMuokkaaOK" text="OK">
<padding>
<Insets bottom="5.0" left="20.0" right="20.0" top="5.0" />
</padding>
<HBox.margin>
<Insets bottom="7.0" left="7.0" right="7.0" top="7.0" />
</HBox.margin>
</Button>
</children>
</HBox>
</children>
<padding>
<Insets bottom="7.0" left="7.0" right="7.0" top="7.0" />
</padding>
</VBox>
package fxKirjalista;
import fi.jyu.mit.fxgui.ModalController;
import fi.jyu.mit.fxgui.ModalControllerInterface;
import javafx.fxml.FXML;
import javafx.scene.control.TextArea;
import java.awt.datatransfer.StringSelection;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
/**
* Tulostusikkunan kontrolleri
*/
public class TulostusController implements ModalControllerInterface<String> {
@FXML private TextArea teksti;
@FXML private void handleOK() {
ModalController.closeStage(teksti);
}
@FXML private void handleKopioi() {
StringSelection stringSelection = new StringSelection(teksti.getText());
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
clipboard.setContents(stringSelection, null);
}
@Override
public String getResult() {
return null;
}
@Override
public void handleShown() {
//
}
@Override
public void setDefault(String oletus) {
teksti.setText(oletus);
}
/**
* @return Tekstialue
*/
public TextArea getTextArea() {
return teksti;
}
/**
* Näyttää tulostusalueessa tekstin
* @param tulostus tulostettava teskti
* @return kontrolleri
*/
public static TulostusController tulosta(String tulostus) {
TulostusController tulostusCtrl =
ModalController.showModeless(TulostusController.class.getResource("TulostusView.fxml"),
"Tulostus", tulostus);
return tulostusCtrl;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.TextArea?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>
<VBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="399.0" prefWidth="294.0" xmlns="http://javafx.com/javafx/23.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="fxKirjalista.TulostusController">
<children>
<TextArea fx:id="teksti" prefHeight="356.0" prefWidth="294.0" />
<HBox alignment="CENTER_RIGHT" prefHeight="34.0" prefWidth="294.0">
<children>
<Button mnemonicParsing="false" onAction="#handleKopioi" text="Kopioi" textAlignment="RIGHT">
<HBox.margin>
<Insets bottom="7.0" left="7.0" right="7.0" top="7.0" />
</HBox.margin>
</Button>
<Button mnemonicParsing="false" onAction="#handleOK" text="OK">
<HBox.margin>
<Insets bottom="7.0" left="7.0" right="7.0" top="7.0" />
</HBox.margin>
</Button>
</children>
</HBox>
</children>
</VBox>
/* JavaFX CSS - Leave this comment until you have at least create one rule which uses -fx-Property */
3|1
2|1
4|2
4|4
0|5
1|1
1|fantasia
2|sci-fi
3|kauhu
4|komedia
5|
1|Hobitti 1|J.R.R. Tolkien||1937|336
2|Hobitti 2|J.R.R. Tolkien||1937|934
3|Hobitti 3|J.R.R. Tolkien||1937|187
4|Linnunradan käsikirja liftareille|Douglas Adams|Linnunrata|1979|156