Problem z oknem

0

Witam, nie wiem czy dobrze określiłem temat, dlatego opiszę na czym polega mój problem. Piszę pracę inż i od ponad 2 tygodni nie mogę uporać się z następującym problemem, z grubsza wygląda to tak:

Mam aplikację, która po uruchomieniu wyświetla menu główne z 3 podmenu do wyboru, kliknięcie każdego z tych podmenu odpala je w nowym oknie:

public class menuGlowne extends JFrame
{
Container panel = getContentPane();

.....
//jedno z 3 podmenu
przydzial.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)

		{
			try
			{					

				RamkaMenuPrzydzial ramka=new RamkaMenuPrzydzial(rok);
				ramka.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
				ramka.setVisible(true);
			}
			catch (Exception ee)
			{

			}
		}
	});

.....

}</span>

Klasa RamkaMenuPrzydzial wygląda następująco:

class RamkaMenuPrzydzial extends JFrame
{
public static Container panel;

public RamkaMenuPrzydzial(int rok)
{
	panel = getContentPane();
	menuPrzydzial menu = new menuPrzydzial(this,rok);
            panel.add(menu);
    
	        setSize(Toolkit.getDefaultToolkit().getScreenSize());
	setTitle("System wspomagający przydział zajęć dydaktycznychPrz");
	setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
	
	//ustawienie naszego menu
	setJMenuBar(menuPrzydzial.pasekMenu);
}

}</span>

Klasa ta odpala menuPrzydział, które wygląda tak

public class menuPrzydzial extends JPanel
{
static JMenuBar pasekMenu = new JMenuBar();
JMenu menuProwadzacy = new JMenu("Prowadzący ");

JMenuItem przydzielP=new JMenuItem("Przydziel kurs");
static JMenuItem listaP=new JMenuItem("Lista prowadzących");
static JMenuItem wyszukajP=new JMenuItem("Wyszukaj");

JMenu menuKurs = new JMenu("Kurs      ");
JMenuItem przydzielK=new JMenuItem("Przydziel prowadzącego");
static JMenuItem listaK=new JMenuItem("Lista kursów");
static JMenuItem wyszukajK=new JMenuItem("Wyszukaj");

JMenuItem wyjscie=new JMenuItem("Wyjście");

    public menuPrzydzial(final RamkaMenuPrzydzial ramka, int rok)
{

	menuProwadzacy.setFont(new Font("Times New Roman", Font.PLAIN, 18));
	//menuProwadzacy.add(przydzielP);
	menuProwadzacy.add(listaP);
	menuProwadzacy.add(wyszukajP);
	pasekMenu.add(menuProwadzacy);
	
	menuKurs.setFont(new Font("Times New Roman", Font.PLAIN, 18));
	//menuKurs.add(przydzielK);
	menuKurs.add(listaK);
	menuKurs.add(wyszukajK);
	pasekMenu.add(menuKurs);
	
	wyjscie.setFont(new Font("Times New Roman", Font.PLAIN, 18));
	wyjscie.setMaximumSize(new Dimension(100,60));
	pasekMenu.add(wyjscie);

.....

	listaK.addActionListener(new ActionListener() 
	{
		public void actionPerformed(ActionEvent e) 
		{
			try
			{
				ramka.panel.removeAll();
				
				<span style="color: red">System.out.println("ile razy");</span>
                                    <span style="color: red">System.out.println("rok");</span>
				panellK=new panelListaKursowPrzydzial(ramka.panel, null,s,r);
				panellK.tab.filterText.requestFocus();
			}
			catch (Exception ee)
			{
				
			}
		}
	});


	wyjscie.addActionListener(new ActionListener() 
	{
		public void actionPerformed(ActionEvent e) 
		{
			try
			{
                                    JComponent source = (JComponent)e.getSource();
				Component root = SwingUtilities.getRoot(source);
				JFrame frame = (JFrame)root;
				frame.dispose();
				frame=null;
				frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			}
			catch (Exception ee)
			{
				
			}
		}

	});

   }

}</span>

Problem polega na tym, iż za każdym razem jak odpalę z menuGłównego menuPrzydział, wyjdę wybierając "wyjście", znowu odpalę menuPrzydział i wybiorę listaK to odpala się ona podwójnie-co widać poprzez wyświetlanie System.out.println("ile razy"); - wypisuje dwa razy, czyli tj są dwa okna czy panele (ale fizycznie jedno widoczne). Nie byłoby to problemem, gdyby nie to iż za każdym razem jak odpalam menuPrzydział to przekazywany jest tam aktualny parametr rok, który jest w panelListaKursowPrzydzial wyświetlany-wyświetla mi zawsze najstarszy-czyli tj pierwszy po uruchomieniu programu,np.

Odpalam program (menuGlowne), klikam menuPrzydział, nic na nim nie robie od razu klikam wyjście-zamyka się okno menuPrzydział, wybieram znowu menuPrzydział, znowu nic na nim nie robie tylko ej zamykam klikając wyjście, i znowu odpalam menuPrzydział wybieram listaK-wykonuje się 3 krotnie (bo System.out..... wyświetla mi w Eclipse 3 razy napis "ile razy" i 3 wartości pola rok w kolejności od tej która powinna być do tej która była przy pierwszym uruchomieniu-i równieżta wartość jest widoczna na panelu listaK-a musi być aktualna wartość.

Bardzo proszę o pomoc gdyż już nie mam pojęcia o co może chodzić, mam nadzieję że wytłumaczyłem problem wystarczająco. Będę wdzięczny za jakiekolwiek sugestie.

Pozdrawiam

0

Hmmyy tworzysz za każdym razem nową instancję tego paneluPrzydział. Ciężko trochę z tego wyjść co napisałeś, ja bym z "grubej rury" użył wzorca Singleton na tym panelu i wtedy odpada Ci problem wyświetlania nieprawidłowego roku...

A tak poza tym to sobie przeczytaj:
http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html

Pozdrawiam

0

Dzięki za odpowiedź.
Poczytałem trochę o tym wzoru Singleton ale nadal nie wiem jak go użyć w moim przypadku?
A co powoduje to że za każdym zamknięciem i otwarciem pojawia się o panel jeden więcej , ale widać tylko ten najstarszy? Jak je zniszczyć, zamknąć na trwale aby pojawiał się tylko nowy?

Pozdrawiam

0

Ok dzięki wielkie GhostDog, zastosowałem ten wzorzec i wszystko śmiga jak trzeba :)

Jakby komuś się przydał przykład zastosowania, obecnie wygląda to następująco:

public class menuGlowne extends JFrame
{
Container panel = getContentPane();

.....
//jedno z 3 podmenu
przydzial.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)

                    {
                            try
                            {                                        

                                    RamkaMenuPrzydzial ramka=new RamkaMenuPrzydzial(rok);
                                    ramka.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                                    ramka.setVisible(true);
                            }
                            catch (Exception ee)
                            {

                            }
                    }
            });

.....

}

Klasa RamkaMenuPrzydzial wygląda następująco:

class RamkaMenuPrzydzial extends JFrame
{
public static Container panel;

    public RamkaMenuPrzydzial(int rok)
    {
            panel = getContentPane();
         <span style="color: blue">   menuPrzydzial menu = menuPrzydzial.getInstance(this,rok);
	menu.setR(rok);</span>
            panel.add(menu);
   
                setSize(Toolkit.getDefaultToolkit().getScreenSize());
            setTitle("System wspomagający przydział zajęć dydaktycznychPrz");
            setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
           
            //ustawienie naszego menu
            setJMenuBar(menuPrzydzial.pasekMenu);
    }

}

Klasa ta odpala menuPrzydział, które wygląda tak

public class menuPrzydzial extends JPanel
{
static JMenuBar pasekMenu = new JMenuBar();
JMenu menuProwadzacy = new JMenu("Prowadzący ");

    JMenuItem przydzielP=new JMenuItem("Przydziel kurs");
    static JMenuItem listaP=new JMenuItem("Lista prowadzących");
    static JMenuItem wyszukajP=new JMenuItem("Wyszukaj");
   
    JMenu menuKurs = new JMenu("Kurs      ");
    JMenuItem przydzielK=new JMenuItem("Przydziel prowadzącego");
    static JMenuItem listaK=new JMenuItem("Lista kursów");
    static JMenuItem wyszukajK=new JMenuItem("Wyszukaj");
   
    JMenuItem wyjscie=new JMenuItem("Wyjście");

    <span style="color: blue">private menuPrzydzial(final RamkaMenuPrzydzial ramka, int rok)</span>
    {
   
            menuProwadzacy.setFont(new Font("Times New Roman", Font.PLAIN, 18));
            //menuProwadzacy.add(przydzielP);
            menuProwadzacy.add(listaP);
            menuProwadzacy.add(wyszukajP);
            pasekMenu.add(menuProwadzacy);
           
            menuKurs.setFont(new Font("Times New Roman", Font.PLAIN, 18));
            //menuKurs.add(przydzielK);
            menuKurs.add(listaK);
            menuKurs.add(wyszukajK);
            pasekMenu.add(menuKurs);
           
            wyjscie.setFont(new Font("Times New Roman", Font.PLAIN, 18));
            wyjscie.setMaximumSize(new Dimension(100,60));
            pasekMenu.add(wyjscie);

.....

            listaK.addActionListener(new ActionListener()
            {
                    public void actionPerformed(ActionEvent e)
                    {
                            try
                            {
                                    ramka.panel.removeAll();
                                   
                                    System.out.println("ile razy");
                                    System.out.println("rok");
                                    panellK=new panelListaKursowPrzydzial(ramka.panel, null,s,r);
                                    panellK.tab.filterText.requestFocus();
                            }
                            catch (Exception ee)
                            {
                                   
                            }
                    }
            });


            wyjscie.addActionListener(new ActionListener()
            {
                    public void actionPerformed(ActionEvent e)
                    {
                            try
                            {
                                    JComponent source = (JComponent)e.getSource();
                                    Component root = SwingUtilities.getRoot(source);
                                    JFrame frame = (JFrame)root;
                                    frame.dispose();
                                    frame=null;
                                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                            }
                            catch (Exception ee)
                            {
                                   
                            }
                    }

            });

   }

public static menuPrzydzial getInstance(final RamkaMenuPrzydzial ramka, int rok)
{
if (instance==null)
{
instance = new menuPrzydzial(ramka,rok);
}

	return instance;
}


public int getR() {
	return r;
}


public void setR(int r) {
	this.r = r;
}</span>

}

Teraz listaK jest wywoływana tylko raz, z aktualnie ustawionym parametrem rok -> setR.

Dzięki wielkie za pomoc.
Pozdrawiam

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