Przejście do kolejnego okna

Przejście do kolejnego okna
Z1
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 11 lat
  • Postów:16
0

Zastanawiam się w jaki sposób można stworzyć interfejs graficzny taki, w którym jest np. przycisk "dalej" i przechodzi do kolejnego okna aplikacji, różnej od tej początkowej. Będę wdzięczny za wskazówkę :)

VI
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 11 lat
  • Postów:212
1

Przygotowujesz zestaw paneli, na każdym umieszczasz elementy (np. przy instalacji: jeden panel z akceptacją regulaminu, drugi z wyborem pliku, trzeci z postępem instalacji itd), zapisujesz je w tablicy JPanel[].
Pod spodem umieszczasz przyciski Wstecz/Dalej które usuwają stary panel i zastępują go następnym/poprzednim wczytanym z tablicy z pamięci

edytowany 3x, ostatnio: Visher
tomasz79
  • Rejestracja:około 15 lat
  • Ostatnio:ponad rok
  • Postów:52
1

Ja w swoim programie użyłem "jtabbedpane", każdy panel wstawiłem w oddzielnej zakładce.
Jak mój przedmówca zrobiłem butony do przełączania się między panelami,
dodatkowo żeby przyspieszyć przełączanie się między różnymi panelami stworzyłem menu działające reagujące na prawy przycisk myszy.
Pozdrawiam

antoniaklja
  • Rejestracja:około 14 lat
  • Ostatnio:około 9 lat
  • Postów:88
1

Dobrym pomysłem jest też ustawienie CardLayout. Tutaj masz tutorial http://docs.oracle.com/javase/tutorial/uiswing/layout/card.html.

Z1
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 11 lat
  • Postów:16
0

Myślę, że już sobie poradzę. Opcja Visher'a jest dla mnie najbardziej odpowiednia. Jeszcze chciałbym prosić o przykład kodu do przycisku Dalej, żebym już nie miał niepotrzebnych zastojów jak zacznę tworzyć interfejs. (na razie kończę projektować grafikę).

Olamagato
Robisz remove na bieżącej komórce JPanel[] i add na następnej. Sprawdzasz tylko czy masz następną no i czy dane na poprzedniej były akceptowane.
bogdans
Zapewne potrzebne będzie jeszcze validate() i repaint(). Sprawa jest bardziej skomplikowana jeżeli w głównym oknie jest kilka komponentów (nie tylko ten wymieniany panel) oraz korzystasz z layoutu innego niż BorderLayout.
Olamagato
Zapewne tak, metody add i remove dają stan invalidate, więc jeżeli nie będzie jakiegoś czynnika który to zwaliduje, to trzeba będzie wymusić. Przy innym layoucie i kiedy będą inne panele nie powinno być dużo większego problemu - po prostu validate i repaint w ich częściach obiektów/ekranu zostaną zignorowane. Nawet jeżeli odpali się validateTree oraz repaint z podanym obszarem.
bogdans
Przy innym layoucie będzie mały problem związany z indeksem usuwanego i dodawanego komponentu.
0

Zawsze można użyć gotowej biblioteki do tego.
Jeśli użycie JavaFX Ci nie przeszkadza, to można spróbować tego: http://www.zenjava.com/jfx-flow/

Z1
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 11 lat
  • Postów:16
0

Na razie robię pierwszy ekran, jak coś nie będzie szło to dam znać.

Jeszcze mam takie pytanie: Czy w javie jest możliwość aby nazwa np. JButton składała się tez ze zmiennej, bo tworząc powiedzmy 50 przycisków o nazwie różniącej się tylko liczbą na końcu, to strasznie dużo linijek zajmie. A tak w pętli by się potworzyły. Szukałem trochę w internecie, i nie znalazłem żeby gdzieś było takie rozwiązanie. Jak ktoś jest pewny, że nie ma to niech napisze :)

Dzięki.

1

Zakładając, że JButton'y będą się różniły tylko nazwą?

Kopiuj
 


private void createButtons(){
     int n = 500;
     JButton[] buttonArray = new JButton[n];
     for(int i=0; i<n; i++){
          buttonArray[i] = createButton("Button"+i);
     }
}

private JButton createButton(String name){
     JButton button = new JButton(name);
     // Tutaj cos jeszcze...
     return button;
}

Ewentualnie możesz to w drugiej metodzie do pętli.

Z1
A jeśli różnią się jeszcze miejscem (Layout: null), ale odstępy są równomierne.
Olamagato
  • Rejestracja:ponad 16 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Polska, Warszawa
  • Postów:1058
1
zagi195 napisał(a):

Jeszcze mam takie pytanie: Czy w javie jest możliwość aby nazwa np. JButton składała się tez ze zmiennej, bo tworząc powiedzmy 50 przycisków o nazwie różniącej się tylko liczbą na końcu, to strasznie dużo linijek zajmie.

Obiekty takie jak JButton, które tworzysz nie mają w ogóle żadnej nazwy. Nazywasz jedynie zmienne, które trzymają referencje do takich obiektów. Możesz wszystko załatwić jedną zmienną tego typu lub lepiej jednym kontenerem JButtonów, którego komórkom możesz przypisywać kolejne wywołania new w jakiejś pętli. Wszystko zależy do czego Ci takie masowe ilości komponentów są potrzebne. Aby się do takiego odwołać potrzebna Ci tylko referencja, a czy będzie ona jakoś nazwana, to jest już kwestia nie/wygody.
Gdybyś się bardzo uparł, to mógłbyś w ogóle nie używać zmiennych, ani pól dla komponentów GUI ponieważ każdy panel czy komponent potrafi iterować po wszystkich elementach umieszczonych wewnątrz niego (a to oznacza dostęp do referencji).


Jeżeli ktoś komuś coś, ewentualnie nikt nikomu nic, to właściwie po co...?
Z1
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 11 lat
  • Postów:16
0

Za mało umiem jeszcze, bo nie rozumiem...

Aktualnie mam kilkadziesiąt tak ustawianych przycisków:

Kopiuj
JButton = koperta_1, koperta_2, koperta_3, koperta_4............;

koperta_1 = new JButton(new ImageIcon("img/koperty/koperta_1.jpg"));	
koperta_1.setBorderPainted(false);
koperta_1.setBounds(48, 48, 99, 37);
add(koperta_1);	
koperta_1.addActionListener(this);
koperta_1.addMouseListener(this);

bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
2

Może tak:

Kopiuj
JButton[] buttons = new JButton[ile_chcesz_przyciskow];
for(int i=0;i<ile_chcesz_przyciskow;i++)
{
    JButtonn b = new JButton(new ImageIcon("img/koperty/koperta_"+(i+1)+".jpg"));
    b.setBorderPainted(false);
    koperta_1.setBounds(...); //tu musisz znaleźć wzór na rozmiar i położenie
    b.addActionListenr(this);
    b.addMouseListener(this);
}

To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
Z1
Dziękuję ślicznie, po kilku edycja działa :)
Olamagato
I żeby nie musieć kombinować wzorów na rozmiar/położenie wymyślono layouty. Na razie dopóki potrzebujesz tylko buttonów mogą Ci się wydawać mało potrzebne, ale zmienisz zdanie gdy będziesz musiał zrobić coś bardziej skomplikowanego.
Z1
Nie wątpię. Chciałem użyć innego layoutu, ale aplikacja będzie tak działała, że po naciśnięciu przycisku będzie on między innymi znikać. I nie chciałbym, żeby jak on zniknie layout zmieniał pozycje pozostałych. (Chyba, że się mylę, bo nie próbowałem tego robić)
Olamagato
Właśnie po to masz stan in/validate, żeby móc kontrolować moment aktualizacji layoutów. Jeżeli usuniesz stary panel, to layout (jeszcze) nie powinien nic zmienić, a kiedy zaraz potem dodasz nowy panel i zrobisz validate, to zmiana spowoduje nic widocznego, o ile nowy panel nie wymusza innych maksymalnych/minimalnych/preferowanych wymiarów swojego okna. Oczywiście poza swoją zawartością.
Z1
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 11 lat
  • Postów:16
0

Doszedłem do tego momentu co potrzebuję zrobić to co jest treścią tego tematu. Mimo waszych odpowiedzi nie umiem. W swojej aplikacji mam metodę, którą jest aktywowana przy starcie programu (metoda ta, to pierwszy ekran aplikacji), i w drugiej metodzie tworzę drugi ekran, i chcę żeby po naciśnięciu Dalej, ekran zmieniał się na ten z drugiej metody. :) Rozjaśnicie mi jak to zrobić?

bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
1

Może wystarczy

Kopiuj
pierwszyEkran.setVisible(false);
drugiEkran.setVisible(true);

To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
Z1
Tak próbowałem, ale nie działa. Mam początkowo pierwszy ekran wczytany tutaj, tak: public static void main(String[] args) { game okno = new game(); okno.WybierzKoperty(); okno.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); okno.setVisible(true); } A drugi próbuje wczytać public void actionPerformed(ActionEvent e) { } kiedy naciśnięty jest odpowiedni przycisk. Ale taki kod jak podałeś nie działa.
bogdans
Zakładałem, że oba okna konstruujesz na początku programu. Jeśli jest inaczej, to wstaw miedzy te dwa wiersze wywołanie konstruktora drugiego okna.
Z1
Tak, na początku mam dwie metody tworzące te okna.
Z1
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 11 lat
  • Postów:16
0

Ok, po ok. 6 godzinach udało mi się - przechodzi do drugiego ekranu. HURA!
Dziękuję za pomoc.

edytowany 2x, ostatnio: zagi195
Olamagato
Napisz chociaż co zepsułeś, żeby inni też wiedzieli. 6 godzin zawsze warto ominąć. :)
Z1
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 11 lat
  • Postów:16
0

Niestety mam nowy problem.
Tworzę wszystkie panele za pomocą metody która jest na górze dokumentu. Mam utworzone zmienne globalne, i one są edytowane w

Kopiuj
public void actionPerformed(ActionEvent e) { }

I mam problem, bo tworząc 3 panel muszę wykorzystać te zmienione wartości zmiennych - a one nie wiem czemu przybierają wartość = 0. A jeżeli wyświetlę te zmienne w actionPerformed to mają poprawną wartość. Co jest tego przyczyną? Próbowałem tworzyć ten trzeci panel w kolejnej metodzie i wywołać ją dopiero wtedy kiedy się naciśnie na przycisk dalej, ale wtedy nie widać zawartości panelu.
Może zobrazuję to Wam trochę:

Kopiuj
public class game extends JFrame implements ActionListener, MouseListener, KeyListener {

	int[] WybraneKoperty = new int[5];

public void metoda() {
     //Tutaj wykorzystuję tablicę WybraneKoperty[]
    // oraz tutaj znajduję się przycisk, który wywołuje zmiany w tablicy
   // metoda ta tworzy wszystkie panele - wszystkie ekrany.
}

public static void main(String[] args) {
		game okno = new game();
		okno.metoda();
		okno.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		okno.setVisible(true);
}

public void actionPerformed(ActionEvent e) {
      WybraneKoperty[3] = 7;
}

}
edytowany 1x, ostatnio: zagi195
bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
0

Zapewne tworzysz w metodzie actionPerformed zmienne lokalne, które się nazywają tak samo jak globalne i edytujesz te lokalne.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
Z1
Niestety nie zauważyłem aby tak było, tylko się odwołuję do globalnej np. "WybraneKoperty[IleWybranychKopert] = a+1;" gdzie "a" to rzeczywiście jest zmienna lokalna ale to chyba nie przeszkadza.
Z1
Właśnie zauważyłem, że wszystkie zmienne edytowane w actionperformed nie są widziane poza tą metodą, niestety.
bogdans
Jeśli te zmienne są polami w klasie, to są widziane wszędzie, nie tylko w tej metodzie.
bogdans
Wyślij może kod.
Z1
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 11 lat
  • Postów:16
0

Jaka może być przyczyna tego, że nic się nie dzieje po przyciśnięciu buttona? jestem pewien że dobrze został dodany. Dodaję takie same przyciski do kilku paneli aż w szóstym przestały reagować na kliknięcie.

antoniaklja
  • Rejestracja:około 14 lat
  • Ostatnio:około 9 lat
  • Postów:88
0
Kopiuj
this.setFocusable(true);

spróbuj tego, mi kiedyś wykładowca podpowiedział i zadziałało.
ew. może i to głupie ale sprawdź czy dodałeś "listener" :)

edytowany 2x, ostatnio: antoniaklja
Zobacz pozostałe 6 komentarzy
Antoniossss
Bo to, że komponent jest sam, nie oznacza, że musi on przyjmować focus (w szczególności, kiedy jest otagowany jako "nieskupialny". Wg. mnie takie zachowanie jest uniwersalne, czy to panel będzie samotny czy nie
bogdans
requestFocus() nie starczało, ale kliknięcie myszą w panel starczało (bez setFocusable(true)), zatem był ten panel "skupialny", czy nie był?
Antoniossss
O tym wcześniej nie wspomniałeś i zastanowiło mnie to, ale poszukiwać daleko nie musiałem. Okazuje się, że za focus w Swingu odpowiadają 2 metody. Oprócz focusable, mamy RequestFocusEnabled - to drugie odnosi się do myszy, nie do klawiatury i jest tylko "wskazówką" nie twardym ograniczeniem/narzutem. Sprawdź sam. Więc, Panel mógł nie być focusable, więc nie łapał focusa z klawiatury - ale Swing mu go dawał po myszce
bogdans
Dzięki, pomniejszyłem niewiedzę.
Antoniossss
  • Rejestracja:prawie 16 lat
  • Ostatnio:ponad 10 lat
0

@zagi185 a skąd wiesz, że nic się nie dzieje? Może kod taki napisałeś ;P Żeby na 10000% stwierdzić, że się nic nie dzieje wstaw w akcje np

Kopiuj
System.out.println("No a jednak coś się dzieje");

albo postaw w akcji breakpoint i zdebuguj;]
Wtedy będziesz miał pewność.
Jeżeli nie ma akcji, to albo nie dodałeś action listenera, albo klikasz zupełnie inny button niż Tobie się wydaje :D


www.toptraker.pl
TopTraker! - I wiesz co jest grane!
Mój własny projekt w Javie - najnowsza wersja już jest!
Z1
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 11 lat
  • Postów:16
0

Na szczęście już sobie poradziłem. I niedługo skończę program.
Jeszcze ostatnie pytanko, jak zrobić przycisk, którego zadaniem będzie ponowne włączenie programu? Zresetowanie całej aplikacji żeby wszystkie dane były takie jak na początku i wyświetlony został ekran startowy.

bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
1

Wywołaj ponownie konstruktor swojej klasy, a stare okno usuń (dispose()).


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell

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.