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 {
}