Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Problem sa prikazom JPanel-a unutar Listener-a

[es] :: Java :: Problem sa prikazom JPanel-a unutar Listener-a

[ Pregleda: 2566 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

vatri
Banja Luka, RS

Član broj: 68697
Poruke: 1006
188.124.193.*



+18 Profil

icon Problem sa prikazom JPanel-a unutar Listener-a07.08.2013. u 17:52 - pre 101 meseci
Pozdrav ljudi.

Ispod sam postavio kod koji bi trebao nakon klika na dugme "User list" prikazati jednu tabelu.


Imam public funkciju showUserList() koja generise JPanel sa elementima i doda u glavni JPanel main_panel... Ako tu funkciju pozovem iz konstruktora, odradice posao.

Medjutim, kada ju pozovem unutar klase Evt(public class Evt implements ActionListener) nakon klika - ne radi. Ona se u stvari pozove (ispise mi u konzolu liniju 60 kao i liniju 84) ali ne doda taj pomocni u glavni JPanel.


Pretpostavljam da je problem sa "scope", ali ne kontam zasto kad sam taj glavni panel definisao kao parametar glavne klase a ActionListener je takodje unutar te glavne klase?


Ovo sam rjesio na drugaciji nacin ali me zanima u cemu je ovde problem ?

(Rjesio sam tako da dodam u konstruktoru pomocni na glavni panel s tim da je po defaultu pomocni panel setVisible(false) a nakon klika se pozove setVisible(true) )

Pocetnik sam u Javi tako da se izvinjavam na mozda glupom pitanju :)

Hvala unaprijed!


Code:


import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Event;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JLabel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTable;

import static java.lang.System.out;


public class FitnessManager extends JFrame
{

    private static final long serialVersionUID = -1637092118047436365L;

    JPanel panel_main = new JPanel(new GridBagLayout());
    JPanel panel_user_list = new JPanel(new GridBagLayout());

    GridBagConstraints c = new GridBagConstraints();
    

    public FitnessManager()
    {
        getContentPane().add(panel_main,BorderLayout.NORTH);
        Evt e = new Evt();
        panel_main.setLayout(new GridBagLayout());

        JButton btn_reports = new JButton("Reports");
        c.insets = new Insets(20, 20, 20, 20);
        c.gridx = 0;
        c.gridy = 1;
        panel_main.add(btn_reports,c);

        JButton btn_user_list = new JButton("User list");
        c.gridx = 1;
        c.gridy = 1;
        panel_main.add(btn_user_list,c);
        btn_user_list.addActionListener(e);

        JButton btn_user_add = new JButton("Add user");
        c.gridx = 2;
        c.gridy = 1;
        panel_main.add(btn_user_add,c);

        //this works:
        //showUserList();
    }
    
    public void showUserList()
    {
        out.println("showUserList() called...");
        JLabel table_title = new JLabel("List of users");

        c.gridy = 2;
        c.gridx = 0;
        c.gridwidth = 5;
        c.anchor = GridBagConstraints.LINE_START;
        c.insets = new Insets(5, 5, 5, 5);
        panel_user_list.add(table_title,c);
        
        String[] columns = {"Name and surname", "Last payment"};
        Object[][] data = {
            {"John Suton", "19.07.2013."}
            ,{"Mark Bergen", "20.07.2013."}
            ,{"Djordje Djuric", "02.07.2013."}
        };
        JTable tbl_list = new JTable(data,columns);
        tbl_list.setPreferredScrollableViewportSize(new Dimension(200, 50));
        tbl_list.setFillsViewportHeight(true);
        
        c.gridy = 3;
        c.gridx = 0;
        c.gridwidth = 3;
        panel_user_list.add(tbl_list,c);
        out.println( panel_user_list);
        panel_main.add(panel_user_list,c);
    }
    
    public class Evt implements ActionListener
    {
        public void actionPerformed(ActionEvent a)
        {
            String act = a.getActionCommand();
            if( act.equals("User list")){
                out.println("Event listener called");
                showUserList();
            }
        }
    }
    
    
    public static void main(String[] args)
    {
        FitnessManager gui = new FitnessManager();
        gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        gui.setVisible(true);
        gui.setSize(450, 450);
        gui.setTitle("BT Fitness Manager");
    }


}//class

 
Odgovor na temu

blekmor
fax
fax

Član broj: 309532
Poruke: 55
*.teol.net.



+30 Profil

icon Re: Problem sa prikazom JPanel-a unutar Listener-a21.08.2013. u 01:19 - pre 100 meseci
Nema glupih pitanja, nemoj da se brines. ;)

Svi kontejneri su podklasa klase Container (awt), pa tako i JPanel, JFrame...
Kada je neki kontejner prikazan (zavrsena inicijalizacija) i kada mu dodas neki element ( add(Component c) ) ta komponenta nece biti prikazana dok se kontejneru ne da znak da je nesto ubaceno.
Ti si prikazao JFrame i naknadno zelis da mu dodas novu komponentu klikom na dugme.
Frejmu ces javiti da treba da se osvjezi i iscrta ponovo tako sto ces uraditi "validate".
To ces uraditi tako sto ces, nakon sto dodas element, da kazes :
Code:

getContentPane().revalidate();

Znaci ovo ubacujes kao poslednju liniju koda u metodu showUserList().

Sa getContentPane (metod klase JFrame, tj njegove nadklase Container) ces da pristupis "glavnom kontejneru" i da mu kazes da osvjezi sebe i svu svoju djecurliju.

Mozes primjetiti da ce tvoj kod da radi ukoliko ga pokrenes, pritisnes dugme, a zatim prosiriris ili skupis prozor. To je zato sto ce kontejner ponovo da se iscrtava kada se mjenja velicina ekrana, i samim tim ce da iscrta i novu komponentu.

E sad se mozes zapitati zasto ti je radilo kada pozoves u konstruktoru ?
Ako se vratis na pocetak mog izlaganja vidices da sam napisao sledece
"Kada je neki kontejner prikazan (zavrsena inicijalizacija) ..."
Ovo je jako bitna stvar. Prozor prikazujes tek nakon sto je iskonstruisan; znaci u konstruktoru ce prvo da se doda nova komponenta, a tek zatim ces da ga nacrtas i neces naici na onaj problem.

Takodje da napomenem da je revalidate() skupa operacija, i ne treba je pozivati bez potrebe. Znaci treba da dodas sto vise moguce komponenata i da ih osvjezis jednim revalidate-om kako bi ti aplikacija bila efikasnija. Ovo sam napisao cisto da imas na umu za sada. Tvoja aplikacija nece trpiti ama bas nikakve posljedice ni da pozoves revalidate 100 puta, ali neke veci i kompleksniji programi hoce.

Pozdrav

 
Odgovor na temu

vatri
Banja Luka, RS

Član broj: 68697
Poruke: 1006
188.124.193.*



+18 Profil

icon Re: Problem sa prikazom JPanel-a unutar Listener-a17.09.2013. u 14:43 - pre 99 meseci
Evo mene tek sad vidim da je neko odgovarao.

Hvala @blekmor na iscrpnom odgovoru. Sad mi je jasno, a i logicno objasnjenje zasto nije radilo. :)


Pozdrav!
 
Odgovor na temu

[es] :: Java :: Problem sa prikazom JPanel-a unutar Listener-a

[ Pregleda: 2566 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.