Diskuze: Panely...
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 9 zpráv z 9.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
Potřeboval bych to tak že...Mám 2 nadesignované panely (Panel1.java a Panel2.java)a potom mám třídu (JFrame) main.V ní (main) mám 1 prázdný panel ve kterém bych chtěl vyměňovat Panel1.java a Panel2.java. na jradiobutton1 chci Panel1.java a na jradiobutton2 chci Panel2.java .
Doufám že jsem to napsal srozumitelně a pochopitelně.Raději ještě
posílám obrázek jak to mám
Myslim, ze problem moze naozaj byt v pouzitych Layout manageroch.
JFrame ma defaultne BorderLayout, JPanel Flowlayout.
Ak teda do prazdneho JPanelu, kde si ponechal defaultny FlowLayout vlozis 2
dalsie panely, ulozia sa ti akoby vedla seba a este k tomu s nejakou systemom
urcenou velkostou.
CardLayout je urcite vhodny na to co potrebujes.
Alebo uplne zrus defaultny flowlayout (setLayout(null)) a manazuj vizibilitu a
umiestnenie panelov manualne.
Prikladam uryvok kodu.
public class PanelTest {
JFrame okno;
JPanel hlavnyPanel;
Panel1 p1;
Panel2 p2;
JRadioButton b1;
JRadioButton b2;
ButtonGroup bg;
public PanelTest(){
okno = new JFrame("Panel Test");
okno.setSize(400,500);
okno.setLocationRelativeTo(null);
okno.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//okno.setLayout(null);
p1 = new Panel1();
p2 = new Panel2();
b1 = new JRadioButton("Panel 1");
b1.setBounds(100,420,70,30);
b1.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent ae){
p1.setVisible(true);
p2.setVisible(false);
}
});
b2 = new JRadioButton("Panel 2");
b2.setBounds(200,420,70,30);
b2.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent ae){
p2.setVisible(true);
p1.setVisible(false);
}
});
bg = new ButtonGroup();
bg.add(b1);
bg.add(b2);
nastavHlavnyPanel();
okno.add(hlavnyPanel);
okno.setVisible(true);
}
private void nastavHlavnyPanel(){
hlavnyPanel = new JPanel();
hlavnyPanel.setLayout(null);
hlavnyPanel.add(p1);
hlavnyPanel.add(p2);
hlavnyPanel.add(b1);
hlavnyPanel.add(b2);
}
Triedy Panel1 a Panel2 "extenduju" JPanel a mam v nich nastavene cez
setBounds() velkost a umiestnenie. POslem ti aj cely "program" ak chces
A šlo by to nějak tak?:
public void actionmPerfomed(ActionEvent ae){
hlavnyPanel.removeAll();
hlavnyPanel.add(p1);
hlavnyPanel.revalidate();
hlavnyPanel.repaint();
}
Nejsem v tom nějaký odborník, ale pokud jsem to správně pochopil, máš
hlavní třídu Main a v ní by jsi chtěl mít panel, ze kterého by jsi měnil
oba dva panely (Panel1 a Panel2).
Já bych to udělal tak, že bych si vytvořil další třídu (HlavniPanel),
která dědí z JPanel. To by byl panel, který by měnil viditelnost u
zbývajících dvou panelů. Dal jsi do něj tyhle řádky:
public HlavniPanel() {
setBorder(new EmptyBorder(5, 5, 5, 5));
setLayout(null);
}
a pak přidal Panel1 a Panel2 a nastavil jim parametry:
Panel1 panel1 = new Panel1(); //Vytvoříš si instance tříd Panel1
Panel2 panel2 = new Panel2(); //a Panel2
panel1.setBounds(xsouradnice, ysourandice, delka, vyska); //Toto hodně používám,
panel2.setBounds(xsouradnice, ysourandice, delka, vyska); //protože si můžeš nastavit
//místo a velikost componentu
add(panel1); //Přidá Panel1
add(panel2); //a Panel2 do hlavního panelu
Délku a šířku si nastav podle toho, jak velký máš JFrame. Následně bych přidal tlačítkům ActionListener:
jradiobutton1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
panel1.setVisible(true); //panel1 se pomocí metody setVisible() zviditelní
panel2.setVisible(false); //a panel2 se zneviditelní
}
});
potom bych ActionListener přidal i druhému tlačítku, ale hodnoty v setVisible() musí být obrácené, jinak by se nic nezměnilo (a nezapomeň nastavit bounds i tlačítkům!).
A na konec zbývá to nejdůležitější. Do třídy Main musíš přidat hlavní panel. To uděláš stejně jako při přidávání Panel1 a Panel2 do HlavniPanel, jen mu už nemusíš nastavovat bounds.
Tak doufám, že jsem poradil
Zapomněl jsem zmínit, že tlačítka musíš přidat dřív než panely, jinak by nebyly vidět, protože potom budou za panelama.
Zobrazeno 9 zpráv z 9.