Avatar
robineki
Člen
Avatar
robineki:

Ach jo, nerad zase otravuju ale nevím jak přepínat mezi panely.Mám 2 odlišné panely které dělají odlišné věci ale nevím jak mezi nimi přepínat na klik JButton.Prosím poraďte co nejdřív.

Odpovědět 10.2.2015 16:03
Díky, Robineki
Avatar
Rasto
Redaktor
Avatar
Rasto:
public void actionPerformed(ActionEvent ae){
   panel1.setVisible(false);
   panel2.setVisible(true);
}

setVisible() je metoda na tento ucel, ale tazko radit, ked nevieme presne, co a ako by si potreboval....

 
Nahoru Odpovědět 11.2.2015 10:17
Avatar
robineki
Člen
Avatar
Odpovídá na Rasto
robineki:

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

Nahoru Odpovědět 11.2.2015 16:53
Díky, Robineki
Avatar
Silvinios
Redaktor
Avatar
Odpovídá na robineki
Silvinios:

Myslím, že hledáš CardLayout.

 
Nahoru Odpovědět 11.2.2015 18:45
Avatar
Rasto
Redaktor
Avatar
Rasto:

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

 
Nahoru Odpovědět 11.2.2015 18:58
Avatar
robineki
Člen
Avatar
robineki:

A šlo by to nějak tak?:

public void actionmPerfomed(ActionEvent ae){
hlavnyPanel.removeAll();
hlavnyPanel.add(p1);
hlavnyPanel.revalidate();
hlavnyPanel.repaint();
}
Nahoru Odpovědět 12.2.2015 7:27
Díky, Robineki
Avatar
D0ll0k
Člen
Avatar
Odpovídá na robineki
D0ll0k:

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

Nahoru Odpovědět 12.2.2015 17:42
Ten, co se snaží "programovat"
Avatar
D0ll0k
Člen
Avatar
Odpovídá na robineki
D0ll0k:

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.

Nahoru Odpovědět 13.2.2015 19:03
Ten, co se snaží "programovat"
Avatar
robineki
Člen
Avatar
Odpovídá na Rasto
robineki:

No nefunguje mi to ;(

Nahoru Odpovědět 26.2.2015 15:59
Díky, Robineki
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 9 zpráv z 9.