Aplet, komunikacja między panelami

0

Witam. Problem wygląda następująco: mam aplet w którym jest kilka paneli z kontrolkami. Jak mianowicie dokonać zmian w jednym panelu z poziomu drugiego? W moim przypadku: akcja w panelu A, spowoduje wyświetlenie wyniku w panelu B (np. JLabel setText) i odświeżenie panelu B (repaint(), revalidate()).

0

W panelu zmieniającym musisz mieć po prostu referencję do zmienianego. Wtedy na zmienianym wykonujesz odpowiednią metodę i już. Jeśli się nie da, to przynajmniej referencję do jakiegoś rodzica, który pamięta o wszystkich panelach i może wywoływać we wszystkich metody. Wtedy w rodzicu musisz mieć metodę zmienTekst(String), która zmieni tekst na odpowiednim panelu.

0

Mógłbym prosić o drobny przykład? Główny problem mam z odświeżeniem docelowego panelu poprzez panel z którego inicjuje akcję.

0

Wrzuć trochę swojego kodu - skąd otwierasz panele i co w nich jest (jeśli jest tego dużo, to bez zbędnych w tym przypadku elementów proszę).

0
public class Panel1 extends JPanel{
	JButton jb1 = new JButton("nacisnij");
	ActionListener al1;
	 
	public Panel1() {
		
		
		 al1 = new ActionListener() {   
		          public void actionPerformed(ActionEvent e)
		          {
		         		System.out.println("nacisnieto");
		          }
		      };
		      
		jb1.addActionListener(al1);
		add(jb1);
	}

}


public class Aplet1  extends JApplet {
	JPanel jp1 = new JPanel(new BorderLayout());;
	JLabel jl1 = new JLabel("tekst");
	Panel1 mp1 = new Panel1();
	
	public void start() {
		setLayout(new FlowLayout());
		jp1.add(jl1);
		add(jp1);
		add(mp1);
	}
	
	
}

W tym przykładzie, chcę by, po naciśnięciu Buttona jb1, zmieniła się zawartość etykiety Jlabel jl1 i jednocześnie odświeżyła się.

0

Możesz klasę Panel1 zrobić jako wewnętrzną i wtedy będzie mogła ona edytować pola klasy nadrzędnej:


public class Aplet1  extends JApplet {
        JPanel jp1 = new JPanel(new BorderLayout());;
        JLabel jl1 = new JLabel("tekst");
        Panel1 mp1 = new Panel1();
 
        public void start() {
                setLayout(new FlowLayout());
                jp1.add(jl1);
                add(jp1);
                add(mp1);
        }
 
class Panel1 extends JPanel{
        JButton jb1 = new JButton("nacisnij");
        ActionListener al1;
 
        public Panel1() {
 
 
                 al1 = new ActionListener() {   
                          public void actionPerformed(ActionEvent e)
                          {
                                        jl1.setText("Tekst");
                          }
                      };
 
                jb1.addActionListener(al1);
                add(jb1);
                }
        }
 
}
0

Tak, tylko że mam w sumie kilka paneli i to dość rozbudowanych. Jak zacznę wrzucać to wszystko w jedną klasę, to zrobi mi się niezły chaos. Jest może jakieś prostsze rozwiązanie?

1

Coś takiego

public class Aplet1  extends JApplet {
        JPanel jp1 = new JPanel(new BorderLayout());;
        JLabel jl1 = new JLabel("tekst");
        Panel1 mp1 = new Panel1(this);
 
        public void start() {
                setLayout(new FlowLayout());
                jp1.add(jl1);
                add(jp1);
                add(mp1);
        }
}
 
class Panel1 extends JPanel{
        JButton jb1 = new JButton("nacisnij");
        ActionListener al1;
        Aplet1 parent;
 
        public Panel1(Aplet1 parent) {
                 this.parent = parent;
 
                 al1 = new ActionListener() {   
                          public void actionPerformed(ActionEvent e)
                          {
                                        parent.jl1.setText("Tekst");
                          }
                      };
 
                jb1.addActionListener(al1);
                add(jb1);
                }
 
}
0

Spoko, o coś takiego mi chodziło. Dzięki za wszystkie wskazówki i pomoc.

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