Przekazywanie zmiennej miedzy oknami

0

Witam.

Dopiero zaczynam w javie wiec proszę o wyrozumiałość.

Jak moge przeniesc dane z okna dialogowego z komponentu jTextField do głównego okna aplikacji,do komponentu Jlabel?

Robiłem to tak:

new glowneokno().jLabel1.setText(jTextField1.getText());

Nic to nie zmienia i nie ma zadnego bledu w NetBeans;

Pozdrawiam.

0

Używając "new" za każdym razem tworzysz nowy obiekt. Powinieneś zapisać sobie referencję do raz utworzonego okna i konsekwentnie używać jej przy dostępie do tego okna. Możesz utworzyć mnóstwo obiektów okien tej samej klasy (klasa jest tylko "szablonem" obiektu) i nie zobaczysz żadnego rezultatu bo to będą inne okna (choć zazwyczaj w tym samym miejscu - jedne przykryte przez inne).

0

Mozesz napisac przykladowy kod?

0

Jeśli klasa GłówneOkno ma być w co najwyżej jednym egzemplarzu to zrób z niej singleton.

Wersja leniwa:

  • prywatny konstruktor,
  • statyczne pole "instance" - początkowo null,
  • statyczna metoda getInstance() - jeśli instance == null to stwórz nowy obiekt, na końcu zwróc instance,

Wersja zachłanna:

  • prywatny konstruktor,
  • statyczne pole "instance = new Klasa"
  • statyczna metoda getInstance() zwracająca instance,

Używa się praktycznie tylko metody leniwej (tzn tworzenie obiektu dopiero gdy jest potrzebny), ale tutaj przypadek użycia jest taki, że lepiej byłoby zrobić wersję zachłanną.

0

@donki

Bravo!!!! Kolo pyta jak się przekazuje zmienne i prosi o kod a Ty mu takie coś...taki post nic nikomu nie da.

Jak wrócę do domu napiszę Ci przykładowy kod

0

Nie bardzo rozumiem. Moge cie prosic o przedstawienie tego w kodzie z opisem. Dopiero zaczynam z java i mam duze problemy:)

0

http://pl.wikisource.org/wiki/Singleton_(wzorzec_projektowy)/kod#Java

Rozw 1 - model zachłanny, instancja tworzona od razu,
Rozw 2 - model leniwy, ręcznie sprawdzamy czy instancja już była utworzona,
Rozw 3 - model leniwy, instancja tworzona automatycznie przy ładowaniu pliku .class SingletonHoldera,

Wszystkie tamte rozwiązania są thread-safe, metoda 3 jest generalnie najlepsza.
"Singleton" zamień na "MójPanel" (tzn tak jak nazwałeś swój panel) i wszystkie wystąpienia new MójPanel(...) zamień na MójPanel.getInstance().

Zaraz przetestuję to w NetBeansie czy to nie będzie się gryźć z tym Matisse czy jakoś tak.

0

Projekt z NetBeans:
http://www.przeklej.pl/download/001bg92n1bq4/desktopapplication-100802-164520-zip

Wyeksportowane pluginem Project Packager w NetBeans 6.9.

Zmiany opisane w komentarzu do klasy DesktopView i metody DesktopApplication.startup();

Przy czym rozwiązanie nie jest super eleganckie, bo DesktopView wymaga parametru w konstruktorze - dodatkowe zależności, ale tutaj to nie powinno być wadą.

0

A jak teraz przekazac dane z jtextfield ktore jest na jDialog do jLabel ktorej jest na jFrame, kliknięciu Buttona?

0

Najlepiej wrzuć projekt to się obaczy :) Może nawet singletony nie będą tutaj przydatne, kto wie :P

0

OK juz sobie poradzilem.Okazało sie bardzo proste, w wlasciwosciach formy wystarczyło wybrac public i zaznaczyc static i juz dziala.
I tak nie wiem co dokladnie to dalo i naczym zmiana polega, ale zauwazylem ze zmianie uleglo to:

public static javax.swing.JLabel jLabel1;

To moj 3 dzien nauki javy i bede musial sobie kupic jakas ksiażke, bo nic z tego nie kapuje [???] .

Dziekuje wszystkim za pomoc.

Pozdrawiam.

0

Pole typu static jest klasowe. Pole typu nie static jest instancji. To znaczy że jak zrobisz n x new ObiektX zawierający statyczne pole poleX to to będzie jedno wspólne pole.

Generalnie staticów powinno się unikać (oczywiście oprócz singletonów których nie ma jak inaczej sensownie zaimplementować w Javie). Już lepiej stosować singletony. W tym przypadku powinieneś przynajmniej zrobić metodę w tym jFrame która dostaje stringa i wkleja go do tego fielda.

0

Jaka dobra ksiazke polecicie do nauki Javy?

0

Filozofia Swinga jest taka, że mamy drzewo komponentów i możemy sobie je odcinać/ przypinać praktycznie gdzie chcemy. Możemy przelecieć sobie to drzewo w taki sposób jaki się nam podoba. Zwykłe new JCośTam() nic nie zmieni, dopiero trzeba wywołać .add(new JCośTam()) do jakiegoś elementu, żeby to się gdzieś pokazało.

W twoim przypadku jednak powinieneś zrobić sobie klasę rozszerzającą JFrame, dać tam metodę ustawcośtam(String innecoś). Najlepiej też zsubclassować cały JPanel czy tam jakieś window i dać metodę getCośTamFrame().

Wtedy zamiast zmiennych statycznych, singletonów itp byłoby po prostu coś w stylu getParent().getCośTamFrame().ustawCośTam(naszString).

ZTCP Matisse radzi sobie elegancko z klasami dziedziczącymi po JPanel i JCośTamInnego.

Książek do Javy nie czytałem, ale może "Thinking in Java"?

0

Thinking in Java jest kiepskie jakieś...
Zdaje mi się że "Java: Kompendium Programisty" byłoby w miare na początek dobre... ale i ta książka bardziej uczy samego języka niż programowania...

0

No ale autorowi chodziło o naukę Javy, a nie programowania chyba.

0

Chodzi mi o nauke podstaw, książke w ktorej jest wszystko ladnie opisane i wyjasnione.

0

http://download.oracle.com/javase/tutorial/ z tego możesz czytać :D

0

Thinking in Java czytałem dość dawno, więc mogę źle mówić. Jeśli znasz już choć podstawy programowania obiektowego (a chyba znasz), to ją na początek polecam - przyjemnie się czyta i opisuje wszystkie podstawowe zagadnienia (no i nie jest wcale przestarzała). Kompendium też dobre.

0

Najprostszy przykład:

public class GlowneOkno
{
	public JLabel getEtykietaPiwa()
	{
		return jLabel1;
	}
	/*...*/
	private void jakaśPrywatnaMetoda(/*...*/)
	{
		jLabel1.setText(jTextField1.getText());
		/*...*/
	}
	/*...*/
	private JLabel jLabel1 = new JLabel();
}

public class Program
{
	/*...*/
	private void jakaśInnaMetoda(/*...*/)
	{
		okno.getEtykietaPiwa().setText("Zimny Lech");
		/*...*/
	}

	private GlowneOkno okno = new GlowneOkno();
}

Masz tu dwa sposoby modyfikacji pola etykiety. Pierwsza jest w obrębie samego obiektu okna, a druga jest spoza tego obiektu. Oczywiście najlepiej jest nadawać poszczególnym polom i metodom bardziej treściwe nazwy niż nic nie mówiące jLabel1. Nawet jeżeli wygeneruje taką nazwę automat (np. edytor wizualny w Netbeans), to można mu w tym samym edytorze dowolną nazwę pola lub metody zmienić na swoją własną. Wtedy wygeneruje się taka jaką się ustawiło.
Ustawianie od początku właściwych nazw określających czym jest dana rzecz lub co reprezentuje to świetne zabezpieczenie przed podstawowymi błędami użycia.
W tym przykładzie mimo braku zmiany nazwy pola jest metoda, która dla obiektów z poza klasy podaje w swojej nazwie czym jest zwracane pole.

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