Eine kleine Übung um diverse Programmiertechniken in Java einzuschleifen. Diesmal mit Bier.

Zuerst bauen wir uns mal eine GUI auf, und zwar für die verschiedenen Arten jeweils eine, die wir später in der Main dann testen können. Weiterhin schauen wir uns nochmal Enums, Serialisierung und Interfaces sowie Arraylists an.

Border-Layout

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class GUI_BorderLayout extends JFrame implements ActionListener {
    JPanel panel1;
    JMenuBar menubar;
    JMenu menu;
    JMenuItem btn_close;
    JButton btn1, btn2, btn3, btn4, btn5;

    public GUI_BorderLayout() {
        this.setSize(300, 400); //Größe setzten
        this.setTitle("Test BORDERLAYOUT"); //Titel setzten
        panel1 = new JPanel(new BorderLayout()); //Neues Panel mit Border-Layout
        menubar = new JMenuBar(); //Menübar
        menu = new JMenu("Datei"); //Oberpunkt der Menübar

        btn_close = new JMenuItem("Schließen"); //Unterpunkt der Menübar
        btn_close.addActionListener(this);

        //Buttons anlegen
        btn1 = new JButton("links");
        btn2 = new JButton("rechts");
        btn3 = new JButton("oben");
        btn4 = new JButton("unten");
        btn5 = new JButton("mitte");

        //Buttons zuweisen
        panel1.add(btn1, BorderLayout.WEST);
        panel1.add(btn2, BorderLayout.EAST);
        panel1.add(btn3, BorderLayout.NORTH);
        panel1.add(btn4, BorderLayout.SOUTH);
        panel1.add(btn5, BorderLayout.CENTER);


        menubar.add(menu); //Menü der Menübar hinzufügen
        menu.add(btn_close); //Schließen-Button dem Menü hinzufügen

        this.setJMenuBar(menubar); //Menübar setzen
        this.add(panel1); //Panel setzen
    }

    @Override
    public void actionPerformed(ActionEvent e) {

    }
}

Box-Layout

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class GUI_BoxLayout extends JFrame implements ActionListener {
    JPanel panel1;
    JMenuBar menubar;
    JMenu menu;
    JMenuItem btn_close;
    JButton btn1, btn2, btn3, btn4, btn5;

    public GUI_BoxLayout() {
        this.setSize(300, 400); //Größe setzen
        this.setTitle("Test BOXLAYOUT"); //Fenstertitel setzen
        panel1 = new JPanel(); //Neues Panel erzeugen
        panel1.setLayout(new BoxLayout(panel1, BoxLayout.X_AXIS)); // Ausrichtung X-Achse
        menubar = new JMenuBar(); //Menübar
        menu = new JMenu("Datei"); //Oberpunkt der Menübar

        btn_close = new JMenuItem("Schließen"); //Unterpunkt der Menübar
        btn_close.addActionListener(this);

        //Buttons anlegen
        btn1 = new JButton("links");
        btn2 = new JButton("rechts");
        btn3 = new JButton("oben");
        btn4 = new JButton("unten");
        btn5 = new JButton("mitte");

        //Buttons zuweisen
        panel1.add(btn1);
        panel1.add(btn2);
        panel1.add(btn3);
        panel1.add(btn4);
        panel1.add(btn5);


        menubar.add(menu); //Menü der Menübar hinzufügen
        menu.add(btn_close); //Schließen-Button dem Menü hinzufügen

        this.setJMenuBar(menubar); //Menübar setzen
        this.add(panel1); //Panel setzen
        pack(); //Fenster auf Minimal-Größe setzen
    }

    @Override
    public void actionPerformed(ActionEvent e) {

    }
}

Flow-Layout

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class GUI_FlowLayout extends JFrame implements ActionListener {
    JPanel panel1;
    JMenuBar menubar;
    JMenu menu;
    JMenuItem btn_close;
    JTextField tf_wert;

    public GUI_FlowLayout() {
        this.setSize(300, 400); //Größe setzen
        this.setTitle("Test FLOWLAYOUT"); //Fenstertitel setzen
        panel1 = new JPanel(new FlowLayout()); //Neues Panel mit Flow-Layout
        menubar = new JMenuBar(); //Menübar
        menu = new JMenu("Datei"); //Oberpunkt zur Menübar

        btn_close = new JMenuItem("Schließen"); //Unterpunkt
        btn_close.addActionListener(this);

        tf_wert = new JTextField(); //Textfeld
        tf_wert.setColumns(20);

        menubar.add(menu); //Menü zur Menübar hinzufügen

        menu.add(btn_close); //Schließen-Button dem Menü hinzufügen

        panel1.add(tf_wert); //Textfeld dem Panel hinzufügen

        this.setJMenuBar(menubar); //Menübar setzen
        this.add(panel1); //Panel setzen
    }

    public void closeHandler(){
        int x = JOptionPane.showConfirmDialog(null, "Wirklich schließen?", "Schließen", JOptionPane.YES_NO_OPTION);
        if(x == JOptionPane.YES_OPTION) System.exit(666);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == btn_close){
            closeHandler();
        }
    }
}

Enums

public enum E_Farben {
    ROT(123){
        public int getFarbcode(){
            return farbCode;
        }
        public String getBezeichnung(){
            return "Halo, I bims, rot...";
        }
    },
    GELB(456){
        public int getFarbcode(){
            return farbCode;
        }
        public String getBezeichnung(){
            return "Halo, I bims, gelb...";
        }
    },
    GRUEN(789){
        public int getFarbcode(){
            return farbCode;
        }
        public String getBezeichnung(){
            return "Halo, I bims, grün...";
        }
    };


    final int farbCode;
    E_Farben(int farbCode) {
        this.farbCode = farbCode;
    }

    public int getFarbCode(){
        return farbCode;
    }

    public String getBezeichnung(){
        return "Halo, I bims...";
    }
}

Filehandling - Serialisierung

import java.io.*;
import java.util.Scanner;

abstract public class FileHandling {
    //STATISCHE METHODE LIEST ZEILENWEISE INHALT AUS ÜBERGEBENEM DATEINAMEN (OHNE DATEIENDUNG!)
    //SIEHE MAIN
    public static void dateiLesen(String filename){
        try {
            Scanner scanner = new Scanner(new File(filename + ".txt"));
            while(scanner.hasNextLine()){
                System.out.println(scanner.nextLine());
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

    //STATISCHE METHODE SCHREIBT ÃœBERGEBENEN TEXT IN ÜBERGEBENEN DATEINAMEN (OHNE DATEIENDUNG!)
    //SIEHE MAIN
    public static void dateiSchreiben(String text, String filename){
        try {
            BufferedWriter writer = new BufferedWriter(new FileWriter(filename + ".txt"));
            writer.write(text);
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Interfaces mit Implementierungsbeispiel

public interface I_Bier {
    //STATISCHE METHODEN KöNNEN EINEN IMPLEMENTIERUNG IM INTERFACE HABEN!
    //AUFRUF - SIEHE MAIN
    public static String markeTrinken(String marke){
        return "Halo, I bims, 1 " + marke + "-Trinker!";
    };


    //KLASSISCHE METHODE IM INTERFACE OHNE IMPLEMENTIERUNG
    //WIRD IN InterfaceImplementieren-Klasse IMPLEMENTIERT!
    public String literTrinken(int liter);
    
public class InterfaceImplementieren implements I_Bier {

    //HIER WIRD DIE TRINKEN METHODE AUS DEM INTERFACE I_BIER IMPLEMENTIERT
    //DIE markeTrinken-METHODE MUSS NICHT IMPLEMENTIERT WERDEN, DA SIE STATISCH IST! 
    @Override
    public String literTrinken(int liter) {
        return liter + " Liter Bier getrunken...";
    }
}

In der hier folgenden Main kommt nun alles oben erwähnte zusammen

import java.util.ArrayList;

public class Main {

    public static void main(String[] args) {
        //NEUE GUI_FlowLayout ERZEUGEN
        GUI_FlowLayout g1 = new GUI_FlowLayout();
        g1.show(true);

        //NEUE GUI_BorderLayout ERZEUGEN
        GUI_BorderLayout g2 = new GUI_BorderLayout();
        g2.show(true);

        //NEUE GUI MIT BoxLayout ERZEUGEN
        GUI_BoxLayout g3 = new GUI_BoxLayout();
        g3.show(true);

        //STATISCHE METHODE AUS INTERFACE AUFRUFEN
        System.out.println(I_Bier.markeTrinken("Tegernseer"));

        //KLASSE MIT IMPLEMENTIERTEM INTERFACE ERZEUGEN + METHODE AUFRUFEN
        InterfaceImplementieren ii = new InterfaceImplementieren();
        System.out.println(ii.literTrinken(123));

        //DATEI SCHREIBEN (FILEHANDLING-KLASSE IST ABSTRACT!)
        FileHandling.dateiSchreiben("Augsburg", "abc");

        //DATEI LESEN (FILEHANDLING-KLASSE IST ABSTRACT!)
        FileHandling.dateiLesen("abc");

        //ARRAYLIST
        ArrayList<String> test = new ArrayList<String>();
        test.add("Augsburg");
        test.add("BERLIN");

        //ARRAYLIST SERIALISIEREN MIT ABSTRACT-CLASS (Serializer)
        try {
            //AUFRUF ABSTRAKTER SERIALIZER-KLASSE + STATISCHER SERIALIZE METHODE
            Serializer.serialize(test, "test");
        } catch (Exception e) {
            e.printStackTrace();
        }

        //ARRAYLIST DESERIALISIEREN + AUSGEBEN
        ArrayList<String> test2;
        try {
            //AUFRUF ABSTRAKTER SERIALIZER-KLASSE + STATISCHER DESERIALIZE METHODE
            test2 = Serializer.deserialize("test");
            //INHALT AUS DESERIALISIERTER ARRAYLIST AUSGEBEN
            for(String x : test2){
                System.out.println(x);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        //ZEUG AUS FARBEN-ENUM AUSGEBEN
        System.out.println(E_Farben.ROT.getBezeichnung());
        System.out.println(E_Farben.ROT);
        System.out.println(E_Farben.ROT.farbCode);
        System.out.println(E_Farben.ROT.getFarbCode());
    }
}