JAVA GUI - problemy

0

Moim celem jest stworzenie apletu, który umożliwiałby rezerwację miejsc w kinie. Problemy, które napotkałem:

  1. Chciałem stworzyć aplikację, która miałaby 3 widoki okna dzieki CardLayout. Niestety nie potrafiłem jej zaimplementować w mojej aplikacji więc rozwiązałem ten problem przez zamykanie i otwieranie nowego okna przy kliknięciu przycisku Dalej/Wstecz. Da się przejść z 1 widoku na 2, z 2 na 3, z 3 na 2, ale z 2 na 1 przejść się nie da. Lepiej zmienić to na CardLayout czy zostawić tak jak jest?
  2. W widoku okna 2 kiedy wybiera się miejsca powinny rezerwować sie odpowiednie miejsca. Niestety tak się nie dzieje i nie wiem dlaczego.
  3. Przeczytałem w pewnej książce, że najpierw tworzymy aplikację okienkową a potem bez większych problemów jesteśmy w stanie zamienić to na aplet. Jeszcze nie doszedłem do tego kroku, ale chce się upewnić czy to w ogóle możliwe.
  4. Ogólne porady co powinienem zmienić w moim kodzie aby aplikacja lepiej funkcjonowała.
    https://github.com/Pafker/Cinema
1
  1. Myślę, że warto pozmieniać. Powinien być jeden JFrame. Natomiast to co widać można wrzucić do trzech klas JPanel (JPanel niejako pozwala grupować kontrolki i dodawać do JFrame całymi panelami) a w JFrame tylko je podmieniać (usuwać dodawać). Można też, żrobić tak, żeby w głównym oknie był JPanel z tym co jest tylko z przyciskiem zarezerwuj po wciśnięciu którego by się wyświetlił JDialog (z przejściami dalej/wstecz/zakończ/anuluj).

  2. Nie "zapisuje" ci danych bo wraz z zamknięciem okna tracisz jego zmienne i ich wartości. Mając jedno JFrame mógłbyś w nim trzymać dane które są współdzielone przez panele (tak, żeby zmiany dalej były widoczne... tylko, że będzie nieco bardziej to bardziej złożone bo będziesz pewnie utrzymywał informaje o wszystkich seansach i miejscach). I przekazywane by były JPanelom, które pokazują i zmieniają dane.

  3. Na pewno powinny być wyłączone (disabled) przyciski wstecz na pierwszym oknie i dalej na trzecim.
    Nie wiem w jakim edytorze piszesz, ale ładne wcięcia w kodzie sprawiają, że kod jest czytelniejszy. Zazwyczaj można je zrobić automatycznie - u mnie w Eclipse kombinacją klawiszy ctrl+shit+F.
    Powtarzające się fragmenty kodu można próbować wrzucić w petlę.
    Przykładowo:

		m4 = new JCheckBox("1 4");
		m4.setBounds(220, 40, 60, 60);
		m4.setBackground(Color.GREEN);
		add(m4);
		m4.addActionListener(this);

Jeżeli jesteś w stanie to zaimplementować jako metodę:

private void zainicjalzuj ( JCheckBox mx, int rzad, int miejsce) { ... }

to powinno później lepiej wyglądać tworzenie tego co ma się wyświetlić

zainicjalizuj(m1,1,1)
zainicjalizuj(m2,1,2)
zainicjalizuj(m3,1,3)
0

Re. Komentarz. Nie do końca rozumiem co znaczy, że się nie łączy. Ale może zabrakło revalidate i repaint .

 package cinema;

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class AppExample extends JFrame implements ActionListener {

	private PanelA panelA;

	public AppExample() {

		setSize(300, 300);
		setLayout(new FlowLayout());
		panelA = new PanelA();
		add(panelA);

		JButton dalej = new JButton("dalej");
		dalej.addActionListener(this);
		add(dalej);
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		remove(panelA);
		//add(new PanelB());
		add(new PanelB(), 0);
		revalidate();
		repaint();
	}

	public static void main(String[] args) {
		AppExample app = new AppExample();
		app.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		app.setVisible(true);
	}

	private class PanelA extends JPanel {
		public PanelA() {
			add(new JLabel("panel a"));
			add(new JLabel("hello"));
		}
	}

	private class PanelB extends JPanel {
		public PanelB() {
			add(new JLabel("panel b"));
			JButton button = new JButton("buttton");
			add(button);
		}
	}
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1