Pokaż wyniki 1 do 6 z 6

Temat: ActionListener nowe obiekty

  1. #1
    Zarejestrowany
    Aug 2008
    Postów
    9

    Domyślnie ActionListener nowe obiekty

    Witam,

    mój problem polega na tym:
    Chciałbym po kliknieciu wewnatrz actionPerformed tworzyć(!) nowy obiekt i nastepnie moc go dodac do istniejącego juz panelu. Zalezy mi na tym aby tworzyc ten obiekt po kliknieciu, gdyz na samym starcie nie wiem ile takich obiektow chcialbym utworzyc, jest to rzecz ktora ma dzialac nazwijmy to dynamicznie - nizej uproscilem przyklad do tworzenia buttona.

    O co chodzi? Kompilator nie zgłasza błędu, ale w panelu wcale nie jest dodawany nowy przycisk.

    Czemu tak jest? Patrzac obiektowo ma to przeciez sens - co potwierdza brak błędów przy kompilacji

    p.s. przepraszam ze ewentualne literowki - przyklad pisalem w notatniku.

    Kod:
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JButton;
    import java.awt.event.ActionListener;
    import java.awt.event.ActionEvent;
    
    public class Obiekt extends JFrame {
    
    	private JPanel jPanelMain;
    	private JButton jButtonStart;
    	
    	public Obiekt() {
    	
    		setTitle("Obiekt");
    		setBounds(0,0, 300, 300);
    		gui();
    	
    	}
    
    	public void gui (){
    	
    		SpringLayout layout = new SpringLayout();
    		jPanelMain = new JPanel (layout);
    		jPanelMain.setPreferredSize(new Dimension(200,200));
    
    //szczegoly w kodzie dotyczace rozmieszczenie panelu w layout pomijam
    		
    		jButtonStart = new JButton ("OK");
    		jPanelMain.add(jButtonStart);
    		
    		jButtonStart.addActionListener(new ActionListener() {
    		
    			public void actionPerformed(ActionEvent evt){
    			
    					//Chodzi o ten kawałek kodu
    					JButton jButtonNowy = new JButton ();
    					jPanelMain.add(jButtonNowy); // to byla literowka - zreszta jakbys sie przypatrzyl to nie utworzylem jPanelOption
    			
    			}
    		});
    	
    	}
    	
    }
    Ostatnio edytowane przez ziomyslaw : 09-06-2008 - 18:35

  2. #2
    Avatar javaman
    javaman jest offline www.javainside.pl
    Zarejestrowany
    Mar 2008
    Skąd
    no przed monitorem przecież...
    Postów
    474

    Domyślnie

    no... a zobacz do czego dodajesz

  3. #3
    Zarejestrowany
    Aug 2008
    Postów
    9

    Domyślnie

    zmienilem kod - ale to akurat byla literowka

    edit: zreszta wkleje jeszcze raz kod - ten jest juz bez 'bledu'

    Kod:
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JButton;
    import javax.swing.SpringLayout;
    import java.awt.event.ActionListener;
    import java.awt.event.ActionEvent;
    import java.awt.Dimension;
    
    public class Obiekt extends JFrame {
    
    	private JPanel jPanelMain;
    	private JButton jButtonStart;
    	private SpringLayout layout;
    	
    	public Obiekt() {
    	
    		setTitle("Obiekt");
    		setBounds(0,0, 300, 300);
    		gui();
    	
    	}
    
    	public void gui (){
    	
    		layout = new SpringLayout();
    		jPanelMain = new JPanel (layout);
    		jPanelMain.setPreferredSize(new Dimension(200,200));
    
    		jButtonStart = new JButton ("OK");
    		jPanelMain.add(jButtonStart);
    		getContentPane().add(jPanelMain);
    		
    		//bez tych dwoch linii przycisk tez sie doda wiec nie w tym problem
    		layout.putConstraint("West", jButtonStart, 50, "West", jPanelMain); //od lewej
            layout.putConstraint("North",jButtonStart, 50, "North", jPanelMain); //od góry
    		
    		jButtonStart.addActionListener(new ActionListener() {
    		
    			public void actionPerformed(ActionEvent evt){
    			
    					//Chodzi o ten kawałek kodu
    					JButton jButtonNowy = new JButton ("nowy");
    					jPanelMain.add(jButtonNowy); 
    			
    			}
    		});
    	
    	}
    	public static void main(String args[]) {
            java.awt.EventQueue.invokeLater(new Runnable() {
                public void run() {
                	Obiekt obiekt = new Obiekt();
                	obiekt.setVisible(true);
                }
            });
        }
    	
    }

    poza tym interesuje mnie dokładnie dlaczego nie dzial moj kod, a nie jak to rozwiazac zeby jednak sie ten button pojawil.

    sposob dla zainteresowanych kryje sie w tym przykladzie
    http://forum.programuj.com/viewtopic...506219f05385f9

    a dokladnie w napisaniu sobie takiej metody

    Kod:
    public void addButton(Container c, String title, ActionListener a) { 
        JButton b = new JButton(title); 
        c.add(b); 
        b.addActionListener(a); 
      }
    Ostatnio edytowane przez ziomyslaw : 09-06-2008 - 18:49

  4. #4
    Avatar javaman
    javaman jest offline www.javainside.pl
    Zarejestrowany
    Mar 2008
    Skąd
    no przed monitorem przecież...
    Postów
    474

    Domyślnie

    no właśnie o tym mówiłem

    jPanelMain.add(jButtonNowy); // to byla literowka - zreszta jakbys sie przypatrzyl to nie utworzylem jPanelOption
    Dodawałeś do nie utworzonego obiektu.

  5. #5
    Zarejestrowany
    Aug 2008
    Postów
    9

    Domyślnie napisalem "Kompilator nie zgłasza błędu"

    niestety twoja odpowiedz nic nie wnosi ;/

    prosze o skupieniu sie na rozwiazaniu problemu - pytania.

    skopiuj drugi kod "poprawny" i zobaczysz ze przycisk wcale sie nie dorysuje - a co wiecej w terminalu nie pojawi sie nawet exception. Wiec co jest nie tak ?

  6. #6
    Zarejestrowany
    Aug 2008
    Postów
    5

    Domyślnie

    Nie za bardzo potrafię ogarnąć co chcesz robić w swoim kodzie. Dlatego napisałem swój kod, w którym dodaję do panelu wcześniej utworzone buttony (nie dodane do panelu) przechowywane w tablicy.

    Oto kod:

    Klasa Main:
    Kod:
    package DodawaniePrzycisku;
    
    /**
     *
     * @author xiom
     */
    public class Main {
        public static void main(String[] args) {
            Okno ok = new Okno();
            ok.setDefaultCloseOperation(3);
            ok.setVisible(true);
        }
    }
    Klasa Panel:
    Kod:
    package DodawaniePrzycisku;
    
    import java.awt.event.ActionListener;
    import javax.swing.*;
    
    /**
     *
     * @author xiom
     */
    public class Panel extends JPanel {
    
        JButton dodaj;
    
        public Panel(ActionListener myl) {
            dodaj = new JButton("dodaj");
            dodaj.setBounds(10, 10, 50, 100);
            dodaj.addActionListener(myl);
            add(dodaj);
            
        }
    }
    Klasa Okno:
    Kod:
    package DodawaniePrzycisku;
    
    import java.awt.event.*;
    import javax.swing.*;
    
    /**
     *
     * @author xiom
     */
    public class Okno extends JFrame {
    
        Panel panel;
        JButton[] tab;
        int ostatni;
    
        public Okno() {
            setBounds(50, 50, 500, 500);
            ostatni=0;
            panel = new Panel(new MyListener());
            add(panel);
            tab = new JButton[10];
            tab[0] = new JButton("button0");
            tab[0].setBounds(10, 10, 120, 20);
            tab[1] = new JButton("button1");
            tab[1].setBounds(10, 40, 120, 20);
            tab[2] = new JButton("button2");
            tab[2].setBounds(10, 70, 120, 20);
            tab[3] = new JButton("button3");
            tab[3].setBounds(10, 100, 120, 20);
            tab[4] = new JButton("button4");
            tab[4].setBounds(10, 130, 120, 20);
            tab[5] = new JButton("button5");
            tab[5].setBounds(10, 160, 120, 20);
        }
    
        class MyListener implements ActionListener {
    
            public void actionPerformed(ActionEvent e) {
                if (e.getSource() == panel.dodaj) {
                    panel.add(tab[ostatni]);
                    ostatni++;
                    repaint();
                }
            }
        }
    }
    Oczywiście wszystko możesz napisać w jednej klasie. Ja po prostu mam taki styl pisania.
    Ostatnio edytowane przez xiom : 12-20-2008 - 23:15

Podobne wątki

  1. Nowe posty
    By eMCe in forum Problemy/Skargi
    Odpowiedzi: 8
    Autor: 07-23-2008, 21:16
  2. Nowe mapy IGO + MIO
    By boxip in forum Systemy radiokomunikacyjne
    Odpowiedzi: 0
    Autor: 06-17-2007, 13:43
  3. Nowe Mapy TomTom 6 do Ipaq RX5900
    By oklej in forum Systemy radiokomunikacyjne
    Odpowiedzi: 3
    Autor: 05-26-2007, 23:46
  4. Nowe wątki na forum !
    By Kamlo in forum Pomysły/Sugestie
    Odpowiedzi: 5
    Autor: 01-29-2007, 16:27

Zasady Postowania

  • Nie możesz zakładać nowych tematów
  • Nie możesz pisać wiadomości
  • Nie możesz dodawać załączników
  • Nie możesz edytować swoich postów
  •  
Subskrybuj