komunikacja pomięczy JPanel'ami

komunikacja pomięczy JPanel'ami
PawelEwald
  • Rejestracja:około 8 lat
  • Ostatnio:ponad 6 lat
  • Postów:19
0

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?

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Musisz przekazać tą informacji w jakiś sposób. Możesz przez tego JFrame, a mozesz też użyć jakiegoś EventBus.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
PawelEwald
  • Rejestracja:około 8 lat
  • Ostatnio:ponad 6 lat
  • Postów:19
0

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.

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

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 ;)


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
bakeraw2
  • Rejestracja:około 14 lat
  • Ostatnio:ponad 5 lat
  • Postów:400
0

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

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

@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.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
1
edytowany 3x, ostatnio: vpiotr
Shalom
EventBus działa generalnie właśnie jak observer, tylko nie trzeba wszystkiego pisać ręcznie ;)
vpiotr
ale trzeba wciagnąć zależność - co nie zawsze jest dopuszczalne lub wygodne lub pożądane.
PawelEwald
  • Rejestracja:około 8 lat
  • Ostatnio:ponad 6 lat
  • Postów:19
0

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

Kopiuj
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

Kopiuj
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

Kopiuj
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");
        }
    }
}

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

No prawie ci sie udalo, ale nigdzie nie wypelniasz tych referencji o_O

Kopiuj
    Panel1 p1 = new Panel1();
    Panel2 p2 = new Panel2();
    p1.setPanel2(p2);
    p2.setPanel1(p1);

"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
PawelEwald
  • Rejestracja:około 8 lat
  • Ostatnio:ponad 6 lat
  • Postów:19
0

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.

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Juz poprawilem wlasnie. Dodaj te 4 linijki zamiast 2 linijek z new ktore sa tam u gory i voila.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
PawelEwald
  • Rejestracja:około 8 lat
  • Ostatnio:ponad 6 lat
  • Postów:19
0

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.

PawelEwald
  • Rejestracja:około 8 lat
  • Ostatnio:ponad 6 lat
  • Postów:19
0

Już wiem. DZIAŁA ;D. Dziękuję.

Kopiuj
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");
    }
}

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.