package swing.zdarzenia;

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

public class Rozmowa1 {
	private static final Font FONT = new Font("Arial", Font.BOLD, 32);
	private static final Dimension odstep = new Dimension(0, 10);

	public static void main(String[] args) {
		JFrame okno = new JFrame("Rozmowa");
		okno.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		JPanel panel = new JPanel();
		okno.setContentPane(panel); // panel jest wnętrzem okna

		// panel.setBorder(BorderFactory.createLineBorder(Color.BLUE, 5));
		panel.setBorder(BorderFactory.createEmptyBorder(5, 10, 5, 10));

		LayoutManager layout = new BoxLayout(panel, BoxLayout.Y_AXIS);
		panel.setLayout(layout);

		JLabel pytanie = new JLabel("Jak masz na imię?");
		pytanie.setFont(FONT);
		panel.add(pytanie);

		panel.add(Box.createRigidArea(odstep));

		JTextField pole = new JTextField();
		pole.setFont(FONT);
		pole.setForeground(Color.RED);
		panel.add(pole);

		panel.add(Box.createRigidArea(odstep));

		JButton guzik = new JButton("OK");
		guzik.setFont(FONT);
		guzik.setMaximumSize(new Dimension(Integer.MAX_VALUE, 30));
		panel.add(guzik);

		panel.add(Box.createRigidArea(odstep));

		JLabel powitanie = new JLabel("Witaj");
		powitanie.setFont(FONT);
		powitanie.setForeground(Color.BLUE);
		panel.add(powitanie);

		panel.add(Box.createRigidArea(odstep));

        JButton guzik2 = new JButton("Niespodzianka");
        guzik2.setFont(FONT);
        guzik2.setForeground(Color.RED);
        guzik2.setMaximumSize(new Dimension(Integer.MAX_VALUE, 30));
        panel.add(guzik2);

        panel.add(Box.createRigidArea(odstep));
		okno.pack();

		// Aby naciśnięcie guzika spowodowało rekację, do guzika trzeba przekazać "listenera",
		// czyli obiekt zgodny z określonym interfejsem.
		MojListener listener = new MojListener();
		guzik.addActionListener(listener);

		// W praktyce obsługę zdarzeń zapisuje się w obiektach tworzonych na zasadzie "kalasy anonimowej".
		// Dzięki temu mamy ułatwiony dostęp do komponentów okna, poprzez zmienne z tej klasy, w ktrej jesteśmy.
		guzik.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {
				String imie = pole.getText();
				powitanie.setText("Witaj " + imie);
				powitanie.setForeground(Color.BLUE);
			}
		});

		// Od Javy 8 w niektórych przypadkach (gdy interfejs zawiera tylko jedną metodę) można też użyć wyrażeń lambda.
		// Tutaj dodam obsługę zdarzenia do pola tekstowego - zostanie to wykonane, gdy uzytkownik w polu tekstowym naciśnie enter.
		pole.addActionListener((evt) -> {
			String imie = pole.getText();
			powitanie.setText("Cześć " + imie);
			powitanie.setForeground(Color.MAGENTA);
		});

		Random random = new Random();
		guzik2.addActionListener(evt -> {
			okno.getContentPane().setBackground(new Color(random.nextInt(0x1000000)));
			int x = okno.getX() + random.nextInt(400) - 200;
			int y = okno.getY() + random.nextInt(400) - 200;
			okno.setLocation(x, y);
		});

		okno.setVisible(true);
		System.out.println("okno wyświetlone, koniec main");
	}

}
