Testowałem wymianę komponentu wyświetlanego w oknie typu JFrame i trafiłem na niezrozumiałe dla mnie zachowanie programu. Wymieniane komponenty były z klasy Zmieniany Panel:
class ZmiennyPanel extends JPanel
{
private JLabel l;
//------------------------
public ZmiennyPanel(int i)
{
super();
setLayout(new FlowLayout(FlowLayout.CENTER));
l=new JLabel("Panel nr "+i,JLabel.CENTER);
add(l);
}
//------------------------
public String getText()
{
return l.getText();
}
}
Konstruktor klasy głównej zawiera taki fragment:
panele=new ZmiennyPanel[ILE_PANELI];
for(int i=0;i<ILE_PANELI;i++)
{
panele[i]=new ZmiennyPanel(i);
}
setLayout(new BorderLayout(2,2));
getContentPane().add(panele[indeks],BorderLayout.CENTER);
Obsługa przycisków zmieniających panel wygląda tak:
String cmd=e.getActionCommand();
getContentPane().remove(panele[indeks]);
if(cmd.equals("Następny panel"))
{
indeks++;
}
if(cmd.equals("Poprzedni panel"))
{
indeks--;
}
if(cmd.equals("Pierwszy panel"))
{
indeks=0;
}
if(cmd.equals("Ostatni panel"))
{
indeks=ILE_PANELI-1;
}
if(indeks<0)
{
indeks=ILE_PANELI-1;
}
indeks=indeks%ILE_PANELI;
getContentPane().add(panele[indeks],BorderLayout.CENTER);
System.out.println(panele[indeks].getText()); //**
getContentPane().invalidate();
getContentPane().validate();
Komunikaty na konsoli (wiersz(**) są zgodne z oczekiwaniami, napisy w oknie są zagadkowe - żaden napis nie powraca. Jeżeli na starcie programu ILE_PANELI=8, indeks=3, to napisy są takie:
po starcie programu Panel nr 3
po "Następny panel" Panel nr 4
po "Pierwszy panel" Panel nr 0
po "Następny panel" Panel nr 1
po "Następny panel" Panel nr 2
po "Następny panel" Panel nr 2 ???
po "Następny panel" Panel nr 2 ???
po "Następny panel" Panel nr 5
Może mi ktoś to wyjaśnić?