odwolanie sie do obiektu funkcji nr1 w funkcji nr2

0

hej,
mam taki problem:

mam klase Okno ktora jest glownym JFrame programu + zawiera zestaw podstawowych przyciskow/pol etc.
w jej obrebie jest jedno pole tekstowe w ktore mozna cos wpisac. zrobilam stringa String nazwisko ktory sczytuje mi to co wspisane w to pole (przez getText()). i teraz mam 2 problemy :
1)do tego stringa odwolac sie musze w innej klasie, tylko nie wiem jak. probowalam zrobic tak, ze w mojej klasie Okno napisalam funkcje zwroc_nazwisko, ktora zwroci mi tego stringa ale:

class Okno extends JFrame{
 public Okno(){
//tu rysuje panel i takie tam 
//i teraz:
 // dodajemy i umieszczamy pole tekstowe
	JTextField pole_tekstowe = new JTextField();
		add(pole_tekstowe);
		pole_tekstowe.setBounds(20, 25, 100, 20);
		
		String nazwisko = new String();
		nazwisko = pole_tekstowe.getText();

}

// i druga funkcja w tej klasie ktora mi zwrocic Stringa nazwisko:
		public String zwroc_nazwisko()	{
				
				return nazwisko;
				//tylko wlasnie w tej funkcji String nazwisko jest niewidoczny:/ jak zrobic by byl //widoczny i bym mogla go zwrocic?
			}
	
}
  1. i sprawa numer dwa: na poczatku pole_tekstowe jest puste. Pozniej jak sie wpisze nazwisko, kliknie na jakis przycisk to wywola sie ActionListener z obiektem typu Okno zwaracajacy wynik funkcji zwroc_nazwisko-i teraz moje pytanie-czy zwroci Stringa = null? czy zwroci to co pobral przez getText() ?

Pozdrawiam!

0

Bardzo podobne (może nawet identyczne pytanie) już zadałaś. Moja odpowiedź (wraz z pytaniem) znalazła się w koszu. Szkoda że jej nie przeczytałaś.
W skrócie:
musisz utworzyć pole

   private JTextField pole_nazwisko; // wymyśl inną nazwę 

W kodzie ogranicz się do wierszy

     pole_tekstowe=new JTextField();
     pole_tekstowe.setBounds(20, 25, 100, 20);
     add(pole_tekstowe);    

Zmień funkcję:

public String zwroc_nazwisko()
{
     return pole_tekstowe.getText();
}
0

no ale pole_tekstowe jest w jednej funkcji, zas return pole_tekstowe.getText() w drugiej. funkcja zwroc_nazwisko nie widzi zmiennej pole_tekstowe
pole_tekstowe cannont be resolved

0

Przepraszam, miało być tak:

   private JTextField pole_tekstowe; // wymyśl inną nazwę  
0

'wyrzuć' pole_textowe poza metodę

class MojaKlasa{

JTextField pole_textowe;
String nazwisko;//jesli chcesz miec nawzwisko w jakims łańcuchu, to musisz do tego stringa przypisac zawartosc pola tekstowego, w jaki sposób, to już tylko od Ciebie zależy
public MojaKlasa(){
pole_textowe=new JTextField();
}

public String podajNazwisko(){
return pole_textowe.getText();
}

i już

0

@Shimmi, a czy ja coś innego zaproponowałem ?

0

@bogdans
pardon...

po bezsennej nocy nad eclipsem człowiek niedowidzi już...

0

tylko ze to nie zadziala do konca tak jak chce-o co wlasnie pytalam w drugiej czesci postu-przekazana zmienna bedzie pusta.
oto moj kod:
glowna klasa:

 class Okno {
  public/private JTextField pole_tekstowe;

 public Okno(){
  pole_tekstowe = new JTextField();
  add(pole_tekstowe);
  pole_tekstowe.setBounds(100,100,200,30);
}
       
          public String zwroc_nazwisko(){
       String pobrane_nazwisko = new Strign();
       pobrane_nazwisko=pole_tekstowe.getText();
       return pobrane_nazwisko;
}
}

i teraz klasa w ktorej probuje sie odwolac:


 class JakasKlasa{

  Okno zwrocone_nazwisko = new Okno();
 String nazwisko = new String();
  nazwisko=zwrocone_nazwisko.zwroc_nazwisko();
       System.out.println("pobrane nazwisko to" +nazwisko);  


}

no, ale oczywiscie otrzymam tylko :pobrane nazwisko to
no i ta zmienna jest pusta:/

0

no oczywiscie ze masz tą zmienną pustą skoro tworzysz nowy obiekt klasy Okno przy tworzeniu 'JakasKlasa' musisz przekazac referencje do istniejacego juz obiektu, w ktoorym wpisalas to nazwisko w pole_textowe ( bardzo prymitywny wzorzec mostu, a może nawet nie... )

package misty;

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

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.WindowConstants;

public class Okno extends JFrame{
	JTextField pole_textowe;
	String nazwisko;
	JButton guzik;
	public Okno(){
		setSize(300, 300);
		setLocation(200, 200);
		setLayout(null);
		guzik=new JButton("OK");
		pole_textowe=new JTextField();
		pole_textowe.setBounds(20, 20, 100, 30);
		guzik.setBounds(20, 50, 40, 20);
		getContentPane().add(pole_textowe);
		getContentPane().add(guzik);
		setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		guzik.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				new JakasKlasa(Okno.this);
			}
		});
	}
	public String getNazwisko(){
		nazwisko = pole_textowe.getText();
		
		return nazwisko;
	}
	public static void main(String[] args) {
		new Okno().setVisible(true);
	}
	
}
class JakasKlasa{
	
	Okno zwrocone_nazwisko;
	 String nazwisko;
	 public JakasKlasa(Okno arg){
	 zwrocone_nazwisko=arg;
	 nazwisko = new String();
	  nazwisko=zwrocone_nazwisko.getNazwisko();
	       System.out.println("pobrane nazwisko to " +nazwisko); 
	 }	
}

pzdr.

0

a czy new JakasKlasa(Okno.this); musi byc w actionListener? czemu nie moge zrobic czegos takiego:

public String zwroc_nazwisko()	{
name = pole_tekstowe.getText();
	new JakasKlasa(Okno.this);
	return name;
		}

? zwraca mi: The constructor JakasKlasa(Okno) is undefinied
metoda zwroc_nazwisko() jest wewnetrzna metoda klasy Okno..
wiec o co chodzi?:|

0
  1. umieszczaj jakieś większe kawałki kodu, bo nawet nie wiadomo gdzie podany przez Ciebie się znajduje.
  2. jak chcesz żeby ten program tak na prawdę działał? bo z tego co zrozumiałem, to masz jakiegoś JFrame'a z polem textowym, w które wpisujesz jakieś nazwisko, tak? i później w tej drugiej klasie chcesz to nazwisko wykorzystać, tak? no dobra, ale stworzyć obiekt tej drugiej klasy musisz dopiero po wpisaniu tego nazwiska w to pole textowe, bo w przeciwnym razie tego nazwiska po prostu nie bedzie, no nie? tak, że ja zaproponowałem rozwiązanie takie jak 2 posty wyżej: wpisujesz nazwisko, klikasz ok, tworzy sie JakasKlasa(Okno.this) i już. No chyba że chodzi Ci o coś innego, w takim razie powiedz o co?
0

juz Ci przedstawiam jak to u mnie wyglada i o co mi chodzi. Wiec, po kolei:

//wiec na poczatku glowna klasa, w obrebie ktorej tworze obiekt klasy Okno oraz go wywoluje.
//klasa ta posiada rowniez jednego ActionListenera, tak wiem, pewnie nie powinien byc tutaj, ale
// jest:)
public class GlownaKlasa extends javax.swing.JFrame  {
	public static void main(String[] args) {
		Okno okn = new Okno();
		
		okn.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		okn.setVisible(true);
		okn.setSize(950,700);

	}//koniec public static void main

	//-- tego ActionListenera robie jako wewnetrzna klase glownej klasy --
	
	class ZdarzenieSzukaj implements ActionListener {
//tu jakies tam akcje zachodza
}
}

//dalej moja klasa Okno

		class Okno extends GlownaKlasa {
		
public static String nazwisko = null; //do tej zmiennej bede wczytywac to co wpisane w polu
// JTextField i pozniej wlasnie do tej zmiennej chce miec dostep w innych klasach

			public static String name=null;
 			
			public Okno() {
	JPanel panel2 = new JPanel();
	getContentPane().add(panel2);

//to moje pole tekstowe ktorego wartosc chce miec mozliwosc sczytac w kazdej innej klasie zewn
  JTextField pole_tekstowe = new JTextField();
  add(pole_tekstowe);
  pole_tekstowe.setBounds(100,100,150,50); 
   }
//teraz funkcja klasy Okno ktora ma mi zwrocic to co jest wpisane w pole_tekstowe

   			public String zwroc_nazwisko()	{
				nazwisko = pole_tekstowe.getText();
				
				return nazwisko;

			}


}

//a teraz jakas tam sobie klasa zewnetrzna w ktorej chce miec dostep do zmiennej nazwisko, ale
// oczywiscie wypelnionej przez pole_tekstowe.getText()

    class JakasKlasa{
//i tu chce wywolas to zmienna i miec dostep do jej zwartosci, czyli cos w stylu 
// new Okno.nazwisko . i nie wiem jak to zrobic:/

public JakasKlasa(){}
}
0
//skoro ta klasa ma tylko wywolywac noew Okno to nie musi dziedziczyć po JFrame
public class GlownaKlasa {
	public static void main(String[] args) {
		Okno okn = new Okno();
		okn.setVisible(true);		
	}
}

//dalej moja klasa Okno

class Okno  extends javax.swing.JFrame {

	public  String nazwisko = null; 
	public  String imie = null;
	JButton guzik;
	JTextField pole_tekstowe,pole_textowe2;
	public Okno() {
		setTitle("OKNO");
		Dimension dim = getToolkit().getScreenSize();
		setSize(300, 300);
		setLocation(dim.width/2 - this.getWidth()/2, 
			      dim.height/2 - this.getHeight()/2);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);		
		JPanel panel2 = new JPanel();
		setLayout(null);
		guzik=new JButton("Zatwierdz");		
		pole_tekstowe = new JTextField();
		pole_textowe2=new JTextField();
		new JLabel("imie").setBounds(5, 10, 50, 20);
		new JLabel("nazwisko").setBounds(5, 45, 100, 20);
		pole_tekstowe.setBounds(50, 10, 150, 20);
		pole_textowe2.setBounds(50, 45, 200, 20);
		guzik.setBounds(10, 70, 100, 20);
		getContentPane().add(pole_tekstowe);
		getContentPane().add(pole_textowe2);
		getContentPane().add(guzik);
		
		guzik.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				new JakasKlasa(Okno.this).setVisible(true);
			}
		});
	}
	public String zwroc_nazwisko() {
		nazwisko = pole_textowe2.getText();		
		return nazwisko;
	}
	public String zwroc_imie() {		
		imie=pole_tekstowe.getText();
		return imie;
	}
}

class JakasKlasa extends JFrame{
	String nazwisko;
	String imie;
	JLabel label1;
	public JakasKlasa() {}
	public JakasKlasa(Okno arg_okno) {
		nazwisko=arg_okno.zwroc_nazwisko();
		imie=arg_okno.zwroc_imie();
		
		setTitle("JakasKlasa");
		Dimension dim = getToolkit().getScreenSize();
		setSize(400, 100);
		setLocation(dim.width/2 - this.getWidth()/2, 
			      dim.height/2 - this.getHeight()/2);
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);	
		
		setLayout(null);
		label1=new JLabel();
		label1.setBounds(10, 10, 300, 20);
		getContentPane().add(label1);
		label1.setText("Pobrane dane to : "+imie+" i "+nazwisko);
	}
	//no i już możesz coś z tym nazwiskoem robić
}


/*zakładam że najpierw chcesz stworzyć Okno, później wpisać nazwisko, następnie stworzyć obiekt JakiejśKlasy
i tam coś z tym nazwiskiem zrobić. Jeżeli tak, to musisz wykonać po wpisaniu rzeczonego nazwiska
jakąś akcję (np kliknąć Button) ktora stworzy obiekt JakiejsKlasy z referencja do istniejacego okna
co pozwoli Ci pobrac nazwisko, imie, czy co tam jeszcze...mam nadzieje że to pomoże
*/
0

hej!
przerobilam troche swoj kod, tak by dopasowac bardziej do tego co mi podpowiedziales i najwazniejsze ze zadzialalo. dziekuje za pomoc i cierpliwosc:)
nie chce jednak bezmyslnie przerabiac Twojego kodu, dlatego mam pare pytan (z gory przepraszam za ich tresc ale jestem bardzo poczatkujaca):

  1. trzeba bylo stworzyc obiekt JakasKlasa, ktory poprzez this bedzie mogl sobie pobierac co tam chce z klasy Okno, tak? wiec-czy ten ActionListener musi byc koniecznie wewnatrz tej klasy Okienko?
  2. zauwazylam ze w klasie JakasKlasa sa 2 konstruktory-czy nie powoduje to zamieszania w dzialaniu aplikacji? tzn. generalnie nie wiedzialam ze klasa moze miec wiecej niz 1 konstruktor
  3. czy zawsze dostep w klasie B do zmiennych klasy A musi odbywac sie poprzez jakas akcje, typu nacisniecie guzika-tak jak tutaj? bo powiedzmy ze w klasie A mam zdefiniowanego jakiegos Stringa o jakiejs tam wartosci. i w klasie B chce miec do niego dostep, ale nie poprzez wywolanie jakiejs akcji, typu nacisniecie guzika, tylko od razu (zakladam ze po uruchomieniu programu obiekty klas A i B sa inicjowane )

pzdr i jeszcze raz dzieki:)

0

hmm..
a znasz moze jakis dobry artykul na temat przekazywania zmiennych pomiedzy funkcjami w javie? bo generalnie pomysl ktory mi podales nie jest uniwersalny (no bo na przyklad nie bede mogla stworzyc new JakasKlasa(Okno.this) jesli JakasKlasa bedzie ActionLisnterem i w klasie okno bedzie jej definicja przy jakims guziku jakis_guzik.addActionListener(new JakasKlasa())
ogolnie mam straszne problemy z przekazywaniem tego wszystkiego miedzy soba, a to dlatego ze nie do konca to rozumiem.
moglbys mi cos polecic? wiem, ze na necie tego sporo, ale znajduje raczej jakies kursy albo przyklady programow a nie konkretne tematy o przekazywaniu zmiennych.
pzdr!

0
  • pomysl jest wg mnie w miarę uniwersalny, trzeba go tylko zmienić pod dane zadanie
  • klasa może mieć dowolną ilość różnych konstruktorów
  • to tzw. przekazywanie to jest ( jeśli chodzi o aplikacje okienkowe, ale nie tylko ) MDI czyli multi-document-interface, są gotowe frameworki, które załatwiają sporo za nas, ale nigdy aż takich dużych aplikacji nie pisałem, żebym sobie sam nie mógł z tym poradzić.
    -actionListenery powinny być dokł. w tej klasie której dotyczą, a dokładniej rzecz ujmując w tej, w której znajduje się komponent (np. JButton ) którego dotyczą...
  • 'dostęp w klasie B do zmiennych klasy A' nie musi się odbywać poprzez kliknięcie buttona, ale w tym wypadku, wciśnięcie przycisku jest równoznaczne z tym, że chcesz przejść do nowego okna. Natomiast, normalnie masz oczywiście dostęp do publicznych pól/metod każdej klasy, z tym że klasa A musi zawierać pole będące obiektem klasy B:
class A{
public String cos;

}

class B{

A jakies_a;

public String pobierzCos(){
  return jakies_a.cos;
}

}

ja zazwyczaj robiłem to tak (np. mając listę jakichś obiektów wyświetloną w tabelce i chcąc edytować jeden z nich) mam 2 klasy: OknoLista i OknoEdytuj, po wybraniu obiektu do edycji, klikam Button, tym samym tworzac new OknoEdycja(OknoLista.this) i dzieki temu mam dostep do wszystkich publicznych metod OknoLista (w tym np. do listy moich Obiektów), jak już sobie coś tam poedytuję, to mogę bez problemu wrócić do mojej OknoLista i już...

0

w sumie masz racje ze jest dosc uniwersalny, wczoraj napisalam wprawdzie co innego, ale w koncu posiedzialam troche w nocy i zobaczylam ze da sie go podpasowac pod wiele rzeczy.
dzieki za odpowiedzi na pytania, troche mi to rozjasnilo w glowie;)
Pzdr!

0

Witam
Mam podobny problem co kolega, tyle że ja chciałbym przekazać do klasy JFrame cały obiekt JButton, a dokładniej chciałbym aby ten przycisk który znajduje się w 1 klasie Okno(JPanel )był obsłużony w klasie 2 (JFrame). Chodzi mi o to żeby zadziałało następująco:
przycisk b1 znajduje się w Oknie(JPanel) i po jego przyciśnięciu z JFrame(czyli z 2 klasy) zniknął JPanel, który gdzieś tam wczesniej był dodany.

Próbowałęm zastosować się do tego co jest napisane powyżej ale nie bardzo to dział.
Z góry thx.

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