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 :)
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
- Mam narzucone z góry wymagania.
- 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();
}
}
}
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?
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);
...
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:
- Mam okienko JFrame, na nim przycisk. Po wciśnięciu przycisku aktywuje się okienko JPane.showMessageDialog()
- 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 ?
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).
Co to znaczy, że JPane zamyka się przed (za) oknem JFrame?
Wstawiam 2xjar - pierwszy ukazuje okienko, które zamyka się przed głównym okienkiem, drugie za:
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.