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()).
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.
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ę.
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ę).
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ę.
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);
}
}
}
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?
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);
}
}
Spoko, o coś takiego mi chodziło. Dzięki za wszystkie wskazówki i pomoc.