Komunikacja między 2 okienkami JFrame

0

Witam,
Mam 2 okienka JFrame: "Konta użytkowników OKW" i "Nowy użytkownik".
2 okienko aktywuje się po kliknięciu przycisku Dodaj.
Po wprowadzeniu danych w 2 okienku i kliknięciu przycisku Zatwierdź, chcę żeby w 1 okienku, w polu tekstowym ( kremowe tło ) pojawił się w kolejnym wierszu dodany Użytkownik.
Problem polega na uzyskaniu dostępu do JTextArea w okienku, w którym się ono nie znajduje ( 2 ) - po kliknięciu w przycisk Zatwierdź.
Z góry dziękuje :)

user image

1

1.Czemu stary swing a nie JavaFX?
2.Jeśli dobrze rozumiem problem to ja bym tworząc nowe okno przekazywał do niego referencje na 1 (czyli przekazywał this w konstruktorze). Wtedy mozna wywował setter z 2 okienka

0
  1. Mam narzucone z góry wymagania.
  2. Stworzyłem sobie do testowania 2 okienka: A1 z przyciskiem i polem tekstowym, oraz B1 z przyciskiem.
    Zasada działania taka sama - tam gdzie jest pole tekstowe, przycisk ma mnie przekierować do 2 okienka, z 2 okienka po aktywacji przycisku chce wstawić tekst do pola w 1 okienku. Dalej nie potrafię tego rozwiązać, mimo przekazywania referencji do 2 okienka jako parametr w konstruktorze z okienka 1. Udaje mi się wyświetlić zawartość pola tekstowego po zmianie ręcznej tekstu w 1 okienku, ale mam dziwne wrażenie, że wskazanie na ten obiekt jest błędne...

Okienko A1:

 package test;

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

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JTextArea;
import javax.swing.JButton;
import javax.swing.DropMode;

public class A1 extends JFrame implements ActionListener {
	
	private JTextArea poleTekstowe;
	private JButton bPrzycisk;
	private JPanel contentPane;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					A1 frame = new A1();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public A1() {
		setVisible(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		poleTekstowe = new JTextArea();
		poleTekstowe.setColumns(10);
		poleTekstowe.setDropMode(DropMode.INSERT);
		poleTekstowe.setTabSize(50);
		poleTekstowe.setText("probny tekst");
		poleTekstowe.setBounds(10, 11, 183, 114);
		contentPane.add(poleTekstowe);
		
		bPrzycisk = new JButton("Przycisk");
		bPrzycisk.setBounds(10, 136, 89, 23);
		contentPane.add(bPrzycisk);
		
		bPrzycisk.addActionListener(this);
	}

	public JTextArea getPoleTekstowe() {
		return poleTekstowe;
	}
	
	public void zbuduj(String t){
		poleTekstowe.append(t);
	}

	public void setPoleTekstowe(JTextArea poleTekstowe) {
		this.poleTekstowe = poleTekstowe;
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		if(e.getSource()==bPrzycisk){
			B1 b = new B1(this);
			b.setVisible(true);
			dispose();
		}
		
	}
}

Okienko B1:

package test;

import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeSupport;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.border.EmptyBorder;

public class B1 extends JFrame implements ActionListener {

	private JPanel contentPane;
	private JButton bStop;
	private static A1 okno;
	
	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					B1 frame = new B1(okno);
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public B1(A1 okno) {
		B1.okno = okno;
		
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(300, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		bStop = new JButton("Stop");
		bStop.setBounds(91, 95, 89, 23);
		contentPane.add(bStop);
		
		bStop.addActionListener(this);
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		if(e.getSource()==bStop){
			A1 a = new A1();
			a.setVisible(true);
			System.out.println(okno.getPoleTekstowe().getText());
			dispose();
		}
		
	}

}
0

A nie lepiej jest stworzenie klasy Person a w niej zamieścić pola takie jak w drugim okienku masz a następie po wciśnięciu Zatwierdz zwrócić obiekt Person do okienka 1 i dodać go do tabelki?

1
public class B1 extends JFrame implements ActionListener {
 
    private JPanel contentPane;
    private JButton bStop;
    private A1 okno; //bez static
...
    public B1(A1 okno) {
        this.okno = okno;
...
    public void actionPerformed(ActionEvent e) {
        if(e.getSource()==bStop){
            okno.setVisible(true);
...
0

Udało mi się rozwiązać problem - faktycznie tak jak większość napisała, udało mi się przesłać referencję do pierwszego okienka w okienku drugim, dodatkowo sterowałem aktywacją okienka głównego ( setEnabled(true / false) - dzięki temu użytkownicy są uaktualniani od razu po naciśnięciu przycisku Zatwierdź.

Mam tym razem innym problem, a nie chcę zaśmiecać forum, ponieważ również chodzi poniekąd o podobną rzecz co w temacie:

  1. Mam okienko JFrame, na nim przycisk. Po wciśnięciu przycisku aktywuje się okienko JPane.showMessageDialog()
  2. Po wyłączeniu ( w jakikolwiek sposób - OK / lub X ) okienka JPane, zamyka się okno, ale ZA oknem JFrame.

W jaki sposób uzyskać wynik taki, żeby okno JPane zamykało się PRZED oknem JFrame ?

0

zamyka się okno, ale ZA oknem JFrame.

żeby okno JPane zamykało się za oknem JFrame

Niczego nie zmieniaj w kodzie to będzie się zamykało za oknem (cokolwiek to znaczy).

0

Co to znaczy, że JPane zamyka się przed (za) oknem JFrame?

0

Wstawiam 2xjar - pierwszy ukazuje okienko, które zamyka się przed głównym okienkiem, drugie za:

http://www.wyslij-plik.pl/pokaz/967645---cofg.html

http://www.wyslij-plik.pl/pokaz/967646---1ons.html

1

Ja bym to jednak napisał po ludzku z użyciem MVC/MVP więc wydzielił kontroler/prezenter z tych okienek i przekazywał za ich pomocą akcje.

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