komunikacja pomięczy JPanel'ami

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?

0

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

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.

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

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

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.

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

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

0

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

0

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

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.

0

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

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