JAVA GUI - problemy

JAVA GUI - problemy
Pafker
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 5 lat
  • Postów:17
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
KR
  • Rejestracja:ponad 8 lat
  • Ostatnio:13 dni
  • Postów:166
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:

Kopiuj
		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ę:

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

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

Kopiuj
zainicjalizuj(m1,1,1)
zainicjalizuj(m2,1,2)
zainicjalizuj(m3,1,3)
Pafker
Ad1. Próbowałem w tym stylu coś kombinować ale za nic nie chciało mi to działać. Dobrze rozumiem ze nowe klasy OknoDwa OknoTrzy powinny rozszerzać JPanel. Wszystkie elementy okien 1,2,3 powinny być umieszczone na konkretnych JPanelach. I teraz podczas inicjacji programu włączany JFrame a na nim JPanel1 ? W ogóle mi się to nie łączy i nie mam pojęcia jak to zrealizowac.
KR
  • Rejestracja:ponad 8 lat
  • Ostatnio:13 dni
  • Postów:166
0

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

Kopiuj
 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);
		}
	}
}

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.