Head First JAVA: 12. Chapter - Kamil-Jankowski/Learning-JAVA GitHub Wiki

Head First JAVA: 12. Chapter

Game

Hero:

import java.io.*;

public class Bohater implements Serializable {
    private int moc;
    private String typ;
    private String[] bronie;

    public Bohater(int m, String t, String[] b){
        moc = m;
        typ = t;
        bronie = b;
    }

    public int getMoc(){
        return moc;
    }

    public void setMoc(int m){
        moc = m;
    }

    public String getTyp(){
        return typ;
    }

    public String getBronie(){
        String listaBroni = "";
        for(int i=0; i < bronie.length; i++){
            listaBroni += bronie[i] + " ";
        }
        return listaBroni;
    }
}

Archive:

import java.io.*;

public class ArchiwizatorStanuGry {
    public static void main(String[] args) {
        Bohater postac1 = new Bohater(50, "Elf", new String[]{"łuk", "miecz", "pył"});
        Bohater postac2 = new Bohater(200, "Trol", new String[]{"pięści", "wielki topór"});
        Bohater postac3 = new Bohater(150, "Magik", new String[]{"czary", "niewidzialność"});

        System.out.println("Moc postaci 3.: " + postac3.getMoc());
        // tu wykonujemy jakieś operacje, które mogą zmieniać stan postaci,
        postac3.setMoc(250);
        // a następnie zapisujemy te obiekty

        try{
            ObjectOutputStream strumienWyjsciowy = new ObjectOutputStream(new FileOutputStream("Gra.ser"));
            strumienWyjsciowy.writeObject(postac1);
            strumienWyjsciowy.writeObject(postac2);
            strumienWyjsciowy.writeObject(postac3);
            strumienWyjsciowy.close();
        }catch (IOException e) {e.printStackTrace();}

        // Przypisujemy tym zmiennym wartośći null, żeby uniemożliwić odwołanie się do obiektu na stercie,
        postac1 = null;
        postac2 = null;
        postac3 = null;
        // bo chcemy je za chwilę odczytać z pliku :)
        try{
            ObjectInputStream strumienWejsciowy = new ObjectInputStream(new FileInputStream("Gra.ser"));
            Bohater postac1Nowa = (Bohater) strumienWejsciowy.readObject();
            Bohater postac2Nowa = (Bohater) strumienWejsciowy.readObject();
            Bohater postac3Nowa = (Bohater) strumienWejsciowy.readObject();
            strumienWejsciowy.close();

            System.out.println("Typ postaci 1.:" + postac1Nowa.getTyp());
            System.out.println("Typ postaci 2.:" + postac2Nowa.getTyp());
            System.out.println("Typ postaci 3.:" + postac3Nowa.getTyp());
            System.out.println("Moc postaci 3.: " + postac3Nowa.getMoc());
        }catch (Exception ex) {ex.printStackTrace();}
    }
}

Quiz Cards

Card:

package eKarteczki;

class KartaKwizowa {
    private String pytanie;
    private String odpowiedz;

    KartaKwizowa(String p, String o){
        pytanie = p;
        odpowiedz = o;
    }

    String getPytanie() {
        return pytanie;
    }

    String getOdpowiedz() {
        return odpowiedz;
    }
}

Editor:

package eKarteczki;

import java.util.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.*;
import java.io.*;

public class KartaKwizowaEdytor {

    private JTextArea pytanie;
    private JTextArea odpowiedz;
    private ArrayList<KartaKwizowa> listaKart;
    private JFrame ramka;

    public static void main(String[] args) {
        KartaKwizowaEdytor edytor = new KartaKwizowaEdytor();
        edytor.doDziela();
    }

    private void doDziela(){
        //stworzenie i wyświetlenie graficznego interfejsu użytkownika
        ramka = new JFrame("Edytor kart quizowych");
        ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel panelGlowny = new JPanel();
        Font czcionkaDuza = new Font("sanserif", Font.BOLD, 24);

        pytanie = new JTextArea(6, 20);
        pytanie.setLineWrap(true);
        pytanie.setWrapStyleWord(true);
        pytanie.setFont(czcionkaDuza);

        JScrollPane przewijaniePytan = new JScrollPane(pytanie);
        przewijaniePytan.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        przewijaniePytan.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

        odpowiedz = new JTextArea(6, 20);
        odpowiedz.setLineWrap(true);
        odpowiedz.setWrapStyleWord(true);
        odpowiedz.setFont(czcionkaDuza);

        JScrollPane przewijanieOdpowiedzi = new JScrollPane(odpowiedz);
        przewijanieOdpowiedzi.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        przewijanieOdpowiedzi.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

        JButton przyciskNastepna = new JButton("Następna karta");
        przyciskNastepna.addActionListener(new NastepnaKartaListener());

        listaKart = new ArrayList<>();

        JLabel etykietaPytania = new JLabel("Pytanie");
        JLabel etykietaOdpowiedzi = new JLabel("Odpowiedź");

        panelGlowny.add(etykietaPytania);
        panelGlowny.add(przewijaniePytan);
        panelGlowny.add(etykietaOdpowiedzi);
        panelGlowny.add(przewijanieOdpowiedzi);
        panelGlowny.add(przyciskNastepna);

        JMenuBar menu = new JMenuBar();
        JMenu menuPlik = new JMenu("Plik");
        JMenuItem opcjaNowa = new JMenuItem("Nowy");
        JMenuItem opcjaZapisz = new JMenuItem("Zapisz");

        opcjaNowa.addActionListener(new NowyMenuListener());
        opcjaZapisz.addActionListener(new ZapiszMenuListener());

        menuPlik.add(opcjaNowa);
        menuPlik.add(opcjaZapisz);
        menu.add(menuPlik);
        ramka.setJMenuBar(menu);
        ramka.getContentPane().add(BorderLayout.CENTER, panelGlowny);
        ramka.setSize(500, 600);
        ramka.setVisible(true);
    }

    public class NastepnaKartaListener implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent zd) {
            // dodanie bieżącej karteczki do listy i wyczyszczenie wielowierszowych pół tekstowych
            KartaKwizowa karta = new KartaKwizowa(pytanie.getText(), odpowiedz.getText());
            listaKart.add(karta);
            czyscKarte();
        }
    }

    public class ZapiszMenuListener implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent zd) {
            // wyświetlenie okna dialogowego obsługi plików
            // użytkownik może dodać nazwę pliku i zapisać w nim zbiór karteczek
            KartaKwizowa karta = new KartaKwizowa(pytanie.getText(), odpowiedz.getText());
            listaKart.add(karta);

            JFileChooser plikDanych = new JFileChooser();
            plikDanych.showSaveDialog(ramka);
            zapiszPlik(plikDanych.getSelectedFile());
        }
    }

    public class NowyMenuListener implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent zd){
            // wyczyszczenie listy karteczek oraz wielowierszowych pól tekstowych
            listaKart.clear();
            czyscKarte();
        }
    }

    private void czyscKarte() {
        pytanie.setText("");
        odpowiedz.setText("");
        pytanie.requestFocus();
    }

    private void zapiszPlik(File plik){
        // odczytanie każdego elementu listy karteczek i zapisanie w pliku tekstowym
        // w sposób pozwalający na jego późniejsze odczytanie (czyli z jednoznacznymi separatorami
        // pomiędzy poszczególnymi elementami pliku).
        try{
            BufferedWriter pisarz = new BufferedWriter(new FileWriter(plik));

            for(KartaKwizowa karta : listaKart){
                pisarz.write(karta.getPytanie() + "/");
                pisarz.write(karta.getOdpowiedz() + "\n");
            }
            pisarz.close();
        }catch (IOException ex){
            System.out.println("Nie można zapisać pliku kart!");
            ex.printStackTrace();
        }
    }
}

Quiz:

package eKarteczki;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.ArrayList;

public class KwizGra {

    private JTextArea pytanie;
    private ArrayList<KartaKwizowa> listaKart;
    private KartaKwizowa biezacaKarta;
    private int indeksBiezacejKarty;
    private JFrame ramka;
    private JButton przyciskNastepnaKarta;
    private boolean czyPrezentowanaOdpowiedz;

    public static void main(String[] args) {
        KwizGra gra = new KwizGra();
        gra.doDziela();
    }

    private void doDziela(){
        // utworzenie i wyświetlenie graficznego interfejsu użytkownika
        ramka = new JFrame("Quiz");
        ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel panelGlowny = new JPanel();
        Font czcionkaDuza = new Font("sanserif", Font.BOLD, 24);

        pytanie = new JTextArea(10, 20);
        pytanie.setFont(czcionkaDuza);
        pytanie.setLineWrap(true);
        pytanie.setWrapStyleWord(true);
        pytanie.setEditable(false);

        JScrollPane przewijaniePytan = new JScrollPane(pytanie);
        przewijaniePytan.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        przewijaniePytan.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

        przyciskNastepnaKarta = new JButton("Pokaż pytanie");
        przyciskNastepnaKarta.addActionListener(new NastepnaKartaListener());

        panelGlowny.add(przewijaniePytan);
        panelGlowny.add(przyciskNastepnaKarta);

        JMenuBar pasekMenu = new JMenuBar();
        JMenu plik = new JMenu("Plik");
        JMenuItem opcjaOtworz = new JMenuItem("Otwórz");
        opcjaOtworz.addActionListener(new OtworzMenuListener());
        plik.add(opcjaOtworz);
        pasekMenu.add(plik);

        ramka.setJMenuBar(pasekMenu);
        ramka.getContentPane().add(BorderLayout.CENTER, panelGlowny);
        ramka.setSize(640, 500);
        ramka.setVisible(true);
    }

    public class NastepnaKartaListener implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent zd) {
            // jeśli aktualnie prezentowane jest pytanie, pokazujemy odpowiedź
            // w przeciwnym razie pokazujemy następne pytanie
            // ustawienie flagi określającej, co jest prezentowane
            if (czyPrezentowanaOdpowiedz){
                // pokaż odpowiedź, bo użytkowik już widział pytanie
                pytanie.setText(biezacaKarta.getOdpowiedz());
                przyciskNastepnaKarta.setText("Następna karta");
                czyPrezentowanaOdpowiedz = false;
            }else{
                // pokaż nam odpowiedź
                if(indeksBiezacejKarty < listaKart.size()){
                    pokazNastepnaKarte();
                }else{
                    pytanie.setText("To była ostatnia karta z pytaniem");
                    przyciskNastepnaKarta.setEnabled(false);
                }
            }
        }
    }

    public class OtworzMenuListener implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent zd){
            // wyświetlenie okna dialogowego obsłuki plików
            // umożliwienie użytkownikowi wybrania pliku, który chce otworzyć
            JFileChooser oknoDialogowe = new JFileChooser();
            oknoDialogowe.showOpenDialog(ramka);
            wczytajPlik(oknoDialogowe.getSelectedFile());
        }
    }

    private void wczytajPlik(File plik){
        // należy stworzyć tablicę ArrayList, zawierającą karty odczytując dane z pliku
        // metoda jest wywoływana przez klasę OtworzMenuListener, odczytuje zawartość
        // pliku wiersz po wierszu i dla każdego z nich wywołuje metodę tworzKarte(), aby utworzyć kartę
        // (każdy wiersz w pliku zawiera zarówno pytanie, jak i odpowiedź,
        // oddzielone od siebie znakiem "/"
        listaKart = new ArrayList<>();
        try{
            BufferedReader czytelnik = new BufferedReader(new FileReader(plik));
            String wiersz;                                                                      // wiersz = null
            while((wiersz = czytelnik.readLine()) != null){
                tworzKarte(wiersz);
            }
            czytelnik.close();
        }catch(Exception ex){
            System.out.println("Nie można odczytać pliku z kartami");
            ex.printStackTrace();
        }
        // czas zaczynać
        pokazNastepnaKarte();
    }

    private void tworzKarte(String wierszDanych){
        // wywoływana przez metodę wczytajPlik(), pobiera wiersze danych z pliku tekstowego
        // i dzieli na dwie części - pytanie i odpowiedź - na podstawie których, tworzy obiekt kartaKwizowa
        // i dodaje go do tablicy kart (tablicaKart) typu ArrayList
        String[] wyniki = wierszDanych.split("/");
        KartaKwizowa karta = new KartaKwizowa(wyniki[0], wyniki[1]);
        listaKart.add(karta);
        System.out.println("Utworzono kartę");
    }

    private void pokazNastepnaKarte() {
        biezacaKarta = listaKart.get(indeksBiezacejKarty);
        indeksBiezacejKarty++;
        pytanie.setText(biezacaKarta.getPytanie());
        przyciskNastepnaKarta.setText("Pokaż Odpowiedź");
        czyPrezentowanaOdpowiedz = true;
    }
}

Operations on files (save & read)

File read:

package plikiTestowe;

import java.io.*;

public class OdczytPliku {
    public static void main(String[] args) {
        try{
            File mojPlik = new File("tekst.txt");
            FileReader czytelnikF = new FileReader(mojPlik);
            BufferedReader czytelnik = new BufferedReader(czytelnikF);

            String wiersz = null;

            while((wiersz = czytelnik.readLine()) != null){
                System.out.println(wiersz);
            }
            czytelnik.close();
        }catch(Exception ex){ex.printStackTrace();}
    }
}

File save:

package plikiTestowe;

import java.io.*;

public class ZapisPliku {
    public static void main(String[] args) {
        try{
            FileWriter pisarz = new FileWriter("test.txt");
            pisarz.write("Mój pierwszy zapisany plik tekstowy :)");
            pisarz.close();
        }catch(IOException ex){ex.printStackTrace();}
    }
}

Box:

package plikiTestowe;

import java.io.*;

public class Pudelko implements Serializable {

    private int szerokosc;
    private int wysokosc;

    private void setSzerokosc(int s){
        szerokosc = s;
    }

    private void setWysokosc(int w){
        wysokosc = w;
    }

    public static void main(String[] args) {

        Pudelko mojePudelko = new Pudelko();
        mojePudelko.setSzerokosc(50);
        mojePudelko.setWysokosc(20);

        try{
            FileOutputStream fs = new FileOutputStream("pudelko.ser");
            ObjectOutputStream os = new ObjectOutputStream(fs);
            os.writeObject(mojePudelko);
            os.close();
        }catch(Exception ex){ex.printStackTrace();}
    }
}

Lake:

package plikiTestowe;

import java.io.*;

public class Staw implements Serializable {

    transient private Kaczka kaczka = new Kaczka();

    public static void main(String[] args) {
        Staw mojStaw = new Staw();
        try{
            FileOutputStream strumienPliku = new FileOutputStream("staw.ser");
            ObjectOutputStream strumienObiektu = new ObjectOutputStream(strumienPliku);
            strumienObiektu.writeObject(mojStaw);
            strumienObiektu.close();
        }catch(Exception ex){ex.printStackTrace();}
    }
}

Duck:

package plikiTestowe;

public class Kaczka {
}