Mam JFrame w którym mam dwa JPanele w dwóch osobnych klasach. Jak to zrobić aby po wciśnięciu JButtona na jednym panelu zmienił się napis na drugim panelu?

- Rejestracja:około 8 lat
- Ostatnio:ponad 6 lat
- Postów:19

- Rejestracja:około 21 lat
- Ostatnio:prawie 3 lata
- Lokalizacja:Space: the final frontier
- Postów:26433
Musisz przekazać tą informacji w jakiś sposób. Możesz przez tego JFrame, a mozesz też użyć jakiegoś EventBus.

- Rejestracja:około 8 lat
- Ostatnio:ponad 6 lat
- Postów:19
właśnie chciałem przez event, ale z klasy w której mam JPanel nie wiem jak się odnieść do drugiej klasy w której mam drugiego JPanel. Te klasy nie są ze sobą powiązane. obie są wywoływane w JFrame, ale między sobą nie wiem jak się mają skomunikować.
Jak zrobić tak aby po wciśnięciu JButtona w jednym JPanel coś się wyświetliło w drugim JPanel kiedy mam dostęp do paneli tylko przez JFrame i to tylko w jedną stronę. No chyba że jest jakiś sposób aby z JPanel wywołać JFrame i potem inny JPanel, ale nie wiem jak to zrobić.
Wszystkie przykłady i filmiki pokazują że się tworzy JFrame, w nim JPanel i w nim wszystko. Ja chciałem sobie rozbić program na kilka JPaneli i wyszło mi że każdy z nich może działać wyłącznie w swoim zakresie.

- Rejestracja:około 21 lat
- Ostatnio:prawie 3 lata
- Lokalizacja:Space: the final frontier
- Postów:26433
No a gdzie jest problem zeby je ze sobą powiazać? o_O Zawsze mozesz przekazać referencje od jednego do drugiego. Albo tak jak pisałem wcześniej, użyć jakiegoś EventBus ;)

- Rejestracja:około 14 lat
- Ostatnio:ponad 5 lat
- Postów:400
Ja takie rzeczy robię w controllerze- przekazuje do kontrolera referencję do ramki i tam ustawiam wszystkie actionListenery. Przykład w aplikacji Swing:
https://github.com/DanielMichalski/spring-boot-swing-reservations

- Rejestracja:około 21 lat
- Ostatnio:prawie 3 lata
- Lokalizacja:Space: the final frontier
- Postów:26433
@bakeraw2: hm przy rozbudowanym UI to może być niezbyt dobre rozwiązanie. Ja podobny problem, o którym zresztą pisałem swego czasu na forum, rozwiązuje za pomocą Guava EventBus. Odpowiednie komponenty rejestrują sie w tym busie na wybrane eventy a wszystkie akcje spinam przez prezentera/kontroler, tzn każde kliknięcie robi coś w stylu presenter.cośtam()
a prezenter wykonuje co tam ma się wykonać a potem rozsyła odpowiednie eventy. W efekcie nie ma potrzeby fizycznego wiązania prezentera z kontrolkami UI. Ba, można podmienić całe UI na inne równie dobrze bo nie ma tam nigdzie silnego powiązania.

- Rejestracja:ponad 13 lat
- Ostatnio:prawie 3 lata
A co jest nie tak z Observable?
http://www.javaworld.com/article/2077258/learn-java/observer-and-observable.html
https://dzone.com/articles/observer-pattern-java
http://www.developer.com/java/data/understanding-java-observable-and-javafx-observable.html
http://www.javapractices.com/topic/TopicAction.do?Id=156

- Rejestracja:około 8 lat
- Ostatnio:ponad 6 lat
- Postów:19
Nadal nie wiem jak to zrobić. Napiszę co mam to może będzie łatwiej. Rozwiązanie pewnie jest bardzo proste, ale jakoś się zaciąłem.
Pytanie brzmi: Jak to zrobić aby po wciśnięciu JButtona na Panel2 zmienił się tekst na JLabel l2 w Panel1.
plik: OX.java
package ox;
import java.awt.FlowLayout;
import javax.swing.JFrame;
public class OX extends JFrame {
JFrame okno1 = new JFrame("ok");
FlowLayout layout = new FlowLayout();
Panel1 p1 = new Panel1();
Panel2 p2 = new Panel2();
public OX() {
okno1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
okno1.setSize(500, 500);
okno1.setLayout(layout);
okno1.add(p1);
okno1.add(p2);
okno1.setVisible(true);
okno1.setLocationRelativeTo(null);
}
public static void main(String[] args) {
new OX();
System.out.println("ok");
}
}
plik Panel1.java
package ox;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class Panel1 extends JPanel implements ActionListener {
String tekst = "hello man";
JLabel l2 = new JLabel(tekst);
public Panel2 panel2;
public Panel1() {
setPreferredSize(new Dimension(200, 200));
setBackground(Color.pink);
setVisible(true);
System.out.println("Działa Panel1");
add(l2);
}
@Override
public void actionPerformed(ActionEvent e) {
Object źródło = e.getSource();
if (źródło == panel2.b) {
System.out.print("i jest ok.\n");
}
}
}
plik Panel2.java
package ox;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JTextField;
import lombok.Getter;
import lombok.Setter;
import javax.swing.JLabel;
@Setter
@Getter
public class Panel2 extends JPanel implements ActionListener {
JLabel l = new JLabel("hello\n");
JTextField t = new JTextField("a");
JButton b = new JButton("Change");
Panel1 panel1;
public Panel2() {
setPreferredSize(new Dimension(200, 200));
setBackground(Color.YELLOW);
setVisible(true);
System.out.println("Działa Panel2");
t.setPreferredSize(new Dimension(100, 20));
b.addActionListener(this);
add(l);
add(t);
add(b);
}
@Override
public void actionPerformed(ActionEvent e) {
Object źródło = e.getSource();
if (źródło == b) {
l.setText(t.getText());
panel1.l2.setText(" sadffff");
}
}
}

- Rejestracja:około 21 lat
- Ostatnio:prawie 3 lata
- Lokalizacja:Space: the final frontier
- Postów:26433
No prawie ci sie udalo, ale nigdzie nie wypelniasz tych referencji o_O
Panel1 p1 = new Panel1();
Panel2 p2 = new Panel2();
p1.setPanel2(p2);
p2.setPanel1(p1);

- Rejestracja:około 8 lat
- Ostatnio:ponad 6 lat
- Postów:19
a mógłbyś mi poprawić ten kod tak aby działał, bo nie ukrywam że chyba nie rozumiem. Bardzo proszę, bo już tydzień nad tym główkuję w wolnym czasie i nie widzę rozwiązania.

- Rejestracja:około 21 lat
- Ostatnio:prawie 3 lata
- Lokalizacja:Space: the final frontier
- Postów:26433
Juz poprawilem wlasnie. Dodaj te 4 linijki zamiast 2 linijek z new
ktore sa tam u gory i voila.

- Rejestracja:około 8 lat
- Ostatnio:ponad 6 lat
- Postów:19
Zanim to przeczytasz to weź głęboki oddech ;) .
Jak to podmieniłem w pliku OX.java to wyrzuca błąd. dodałem też @Getter i @Setter do Panel1.java i Panel2.java i nadal nic.

- Rejestracja:około 8 lat
- Ostatnio:ponad 6 lat
- Postów:19
Już wiem. DZIAŁA ;D. Dziękuję.
package ox;
import java.awt.FlowLayout;
import javax.swing.JFrame;
public class OX extends JFrame {
JFrame okno1 = new JFrame("ok");
FlowLayout layout = new FlowLayout();
Panel1 p1 = new Panel1();
Panel2 p2 = new Panel2();
public OX() {
okno1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
okno1.setSize(500, 500);
okno1.setLayout(layout);
okno1.add(p1);
okno1.add(p2);
okno1.setVisible(true);
okno1.setLocationRelativeTo(null);
p1.setPanel2(p2);
p2.setPanel1(p1);
}
public static void main(String[] args) {
new OX();
System.out.println("ok");
}
}
Shalomvpiotr