|
[ Max Payne @ 16.06.2006. 21:53 ] @
| Da li neko zna rešenje sledećeg problema? Ali, ako je moguće, da se u ove dve klase reši stvar, dakle da iz podklase stavim akciju na dugmetu iz nadklase. Prva klasa izgleda ovako:
public class GlavnaKlasa extends JFrame {
JPanel pGlavni = new JPanel(new BorderLayout());
JPanel pPrvi = new JPanel(new FlowLayout());
JButton dugme = new JButton("Biljana");
public GlavnaKlasa() {
pPrvi.add(dugme);
pGlavni.add(pPrvi);
setContentPane(pGlavni);
}
public static void main(String[] arg) {
JFrame.setDefaultLookAndFeelDecorated(false);
JFrame Win1 = new GlavnaKlasa();
Win1.setDefaultCloseOperation(EXIT_ON_CLOSE);
Win1.setSize(600, 350);
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize = Win1.getSize();
if (frameSize.height > screenSize.height) {
frameSize.height = screenSize.height;
}
if (frameSize.width > screenSize.width) {
frameSize.width = screenSize.width;
}
Win1.setLocation((screenSize.width - frameSize.width) / 2,
(screenSize.height - frameSize.height) / 2);
Win1.setVisible(true);
}
}
A druga:
public class Akcija extends GlavnaKlasa implements ActionListener {
public Akcija() {
dugme.addActionListener(); // ovde naravno crveni Idea
dugme.setActionCommand("Biljana");
}
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand() == "Biljana") {
System.out.println("radi");
}
}
}
Dakle, ovo ne radi, tj. dugme ne prima komandu, odnosno, kako da stavim osluškivač na dugme u ovoj drugoj klasi? Znam da sve ovo može da radi iz jedne klase, to nije problem, ali može li ovako nešto da se izvede?
|
[ anon315 @ 17.06.2006. 00:12 ] @
Kolko vidim na brzaka, trebalo bi ovako:
Code:
dugme.addActionListener(this);
Odnosno:
Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Akcija extends GlavnaKlasa implements ActionListener {
public Akcija() {
dugme.addActionListener(this); // SADA CE DA RADI!
dugme.setActionCommand("Biljana");
}
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand() == "Biljana") {
System.out.println("radi");
}
}
public static void main(String[] arg) {
JFrame.setDefaultLookAndFeelDecorated(false);
JFrame Win1 = new Akcija();
Win1.setDefaultCloseOperation(EXIT_ON_CLOSE);
Win1.setSize(600, 350);
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize = Win1.getSize();
if (frameSize.height > screenSize.height) {
frameSize.height = screenSize.height;
}
if (frameSize.width > screenSize.width) {
frameSize.width = screenSize.width;
}
Win1.setLocation((screenSize.width - frameSize.width) / 2,
(screenSize.height - frameSize.height) / 2);
Win1.setVisible(true);
}
}
Mada ja vise praktikujem stil gde se koristi tzv. bezimena klasa, npr:
Code:
JButton ok = new JButton("OK");
ok.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) { // Radi nesto }
});
Osim u slucaju da se osluskivac koristi na vise mesta, pa onda pises posebnu ugnjezdenu klasu...
[ sasa_vu @ 17.06.2006. 01:45 ] @
Meni se cini da Max Payne-a interesuje da razdvoji prikaz i akciju u vise klasa.Odnosno da iz jedne klase poziva akciju iz druge klase.
==================================
Prva klasa=glavna
==================================
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Toolkit;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Paneli extends JFrame{
JPanel glavni = new JPanel(new BorderLayout());
JPanel prvi = new JPanel(new FlowLayout());
Dugmici dugmiciPanel = new Dugmici();
/** Creates a new instance of Paneli */
public Paneli() {
prvi.add(dugmiciPanel);
glavni.add(prvi);
setContentPane(glavni);
}
public static void main(String[] arg) {
JFrame.setDefaultLookAndFeelDecorated(false);
JFrame Win1 = new Paneli();
Win1.setDefaultCloseOperation(EXIT_ON_CLOSE);
Win1.setSize(600, 350);
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize = Win1.getSize();
if (frameSize.height > screenSize.height) {
frameSize.height = screenSize.height;
}
if (frameSize.width > screenSize.width) {
frameSize.width = screenSize.width;
}
Win1.setLocation((screenSize.width - frameSize.width) / 2,
(screenSize.height - frameSize.height) / 2);
Win1.setVisible(true);
}
}
==========================================================
Druga klasa=panel sa dva dugmeta
===========================================================
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JPanel;
public class Dugmici extends JPanel implements ActionListener{
Akcije a = new Akcije();
JPanel panelPrikaz = new JPanel();
JButton dugmeA = new JButton();
JButton dugmeB = new JButton();
/** Creates a new instance of Dugmici */
public Dugmici() {
this.setLayout(new FlowLayout());
dugmeA.setText("aaaa");
dugmeB.setText("bbbb");
dugmeA.addActionListener(this);
dugmeA.setActionCommand("a");
dugmeB.addActionListener(this);
dugmeB.setActionCommand("b");
this.add(dugmeA);
this.add(dugmeB);
setVisible(true);
}
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand() == "a"){
a.stampajA();
}
if(e.getActionCommand() == "b"){
a.stampajB();
}
}
}
=======================================
Treca klasa=neke akcije
=======================================
import java.awt.Color;
public class Akcije {
/** Creates a new instance of Akcije */
public Akcije() {
}
public void stampajA(){
System.out.println("aaaaaaa");
}
public void stampajB(){
System.out.println("bbbbbbbbb");
}
}
==========================================
Pozzz
[ Max Payne @ 17.06.2006. 08:56 ] @
Vanja,
NECE DA RADI! Bar nece kod mene, u tome i jeste problem.
Citat:
public Akcija() {
dugme.addActionListener(this); // SADA CE DA RADI!
dugme.setActionCommand("Biljana");
}
Ovako kad se stavi osluskivac na dugme u drugoj klasi, nece da ga prihvati, ne znam zasto.
Sasa_vu, nije losa ideja, jos cu da razmislim, ali bi voleo i ovo gore da resim. Pozdrav svima
[ anon315 @ 17.06.2006. 10:03 ] @
Ne znam sta da ti kazem, kod mene radi:
Da li su ti klase u istom paketu?
[ Max Payne @ 17.06.2006. 10:45 ] @
Dakle, ne razumem. Jednostavno neće. Vidim da si ti stavio glavni metod u drugu klasu, Akcije, probao sam i to, i opet ne radi. Koristim Intelij Ideu 5.1 i javu 6, ne verujem da to ima neke veze. Da li ja nešto ne vidim u ovom mom kodu, evo šaljem ga opet:
1. Glavna klasa
import javax.swing.*;
import java.awt.*;
public class GlavnaKlasa extends JFrame {
JPanel pGlavni = new JPanel(new BorderLayout());
JPanel pPrvi = new JPanel(new FlowLayout());
JButton dugme = new JButton("Biljana");
public GlavnaKlasa() {
pPrvi.add(dugme);
pGlavni.add(pPrvi);
setContentPane(pGlavni);
}
public static void main(String[] arg) {
JFrame.setDefaultLookAndFeelDecorated(false);
JFrame Win1 = new GlavnaKlasa();
Win1.setDefaultCloseOperation(EXIT_ON_CLOSE);
Win1.setSize(600, 350);
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize = Win1.getSize();
if (frameSize.height > screenSize.height) {
frameSize.height = screenSize.height;
}
if (frameSize.width > screenSize.width) {
frameSize.width = screenSize.width;
}
Win1.setLocation((screenSize.width - frameSize.width) / 2,
(screenSize.height - frameSize.height) / 2);
Win1.setVisible(true);
}
}
2. druga klasa Akcije
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Akcija extends GlavnaKlasa implements ActionListener {
public Akcija() {
dugme.addActionListener(this);
dugme.setActionCommand("Biljana");
}
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand() == "Biljana") {
System.out.println("radi");
}
}
}
Ništa ne crveni ali neće da odradi akciju.
[ Max Payne @ 17.06.2006. 10:49 ] @
Aaaaaa, sad tek vidoh
JFrame Win1 = new Akcija();
sad radi. Ali u čemu je štos, možeš li malo da mi objasniš ovo?
[ anon315 @ 17.06.2006. 10:55 ] @
Pa normalno ;)
Prvi put sam kopi-pejstovao, pa sam i ja imao JFrame Win1 = new GlavnaKlasa() i tada nije htelo da radi.
A prosto treba da instanciras frejm Akcija i to je to, ne znam sta ti tacno nije jasno?
Poz.
V
[ Max Payne @ 17.06.2006. 12:20 ] @
Pa, pravim jedan programcic, i ovo je bio problem na koji sam naisao. Struktura koju sam zamislio izgleda ovako
http://www.geocities.com/anmarkovi/
E, sad ako izmenim glavni metod kao sto kazes, onda upadam u druge probleme. Idealno bi bilo kad bi ovo moglo da se resi u one dve klase s pocetka, dakle bez izmena glavnog metoda, ali ako vec to ne moze onda cu nesto drugacije da budzim, mozda kao sto rece sasa_vu.
Pozdrav
[ anon315 @ 17.06.2006. 12:35 ] @
Pa nista, onda zaadrzi klasu akcija kakva ti je bila, a samo u GlavnaKlasa koristi ovo:
Code:
JFrame Win1 = new Akcija();
[ anon315 @ 17.06.2006. 12:36 ] @
Aha, mada sad shvatam da ti ni to nece resiti problem jer onda imas akciju, a ne glavnu klasu?
Mada mozes da razmotris i reorganizaciju. Ja se, npr, trudim da kada oganizujem neki projekat, zadrzim dobar nacin programiranja, a da i organizacija bude onakva kakva mi pasuje, mada obicno se ovo drugo prilagodjava prvom ;)
Poz.
[ Max Payne @ 17.06.2006. 13:08 ] @
Hvala na pomoci, nesto cu vec da smislim, mada mi se onako sve lepo uklapalo, ali sta da se radi, takav je zivot :) . Pozdrav
[ tiranin @ 18.06.2006. 19:15 ] @
Pa, ovako, na brzinu mislim da je ono sto je odmah predlozeno
Code:
dugme.addActionListener(this);
bilo dovoljno, ali samo testiranje sa
Code:
if (e.getActionCommand() == "Biljana")
ne valja jer se stringovi porede sa equals().
[ Max Payne @ 18.06.2006. 20:32 ] @
Dakle, problem je sledeći: ono što je predloženo nije dovoljno, tj.kad se u onaj moj kod na početku, bez drugih izmena, stavi dugme.addActionListener(this); nema nikakve akcije na dugmetu. Ja bi hteo to da rešim, ali bez nekih drastičnih izmena koda. Jer, ovo je samo isečak iz celog programa, koji mi predstavlja problem. Znam ja da je to moguće rašiti na razne načine, ali ja bi hteo da to rešim u ove dve klase koje sam naveo, ako je moguće
[ logotet @ 19.06.2006. 12:00 ] @
Pa, sta je problem u onome sto je vec receno da u main() stavis
Code: JFrame Win1 = new Akcija();
To resava problem i ne vidim sta je tu sporno. Tvoja klasa Akcija je JFrame i istovremeno ActionListener i to je valjda ono sto si zeleo.
Ne znam doduse zasto insistiras na ovakvom konceptu, ali problem je resiv, i to ti je vec ovde neko odgovorio.
[ Max Payne @ 19.06.2006. 17:30 ] @
Pa problem je što
Citat: ovo je samo isečak iz celog programa
i što
Citat: Ja bi hteo to da rešim, ali bez nekih drastičnih izmena koda
i što
Citat: Znam ja da je to moguće rašiti na razne načine, ali ja bi hteo da to rešim u ove dve klase koje sam naveo, ako je moguće .
Dakle, ako je moguće u one dve klase onakve kakve jesu na početku. Ako nije moguće, hvala u svakom slučaju.
[ anon315 @ 19.06.2006. 18:12 ] @
Meni se cini da ti hoces da popravis gresku, tako sto nista neces da izmenis, e pa to ne moze...
[ Max Payne @ 19.06.2006. 19:09 ] @
Ma hoću da izmenim, samo mi ne dirajte glavni metod  .
Ili možda da postavim drugo pitanje: postoji li neki patern ili neko rešenje pomoću koga se sve akcije mogu smestiti u posebnu klasu?
I još: može li neko da preporuči neku knjigu, skriptu ili nešto o organizaciji klasa, hijerarhiji, uopšte dakle o planiranju programa, ili nešto o paternima da je provereno dobro i razumljivo, po mogućnosti na srpskom ali može i na engleskom?
[ milas @ 19.06.2006. 19:47 ] @
Naravno, tu je biblija softverski paterna (Design patterns), kod nas u izdanju CET-a pod nazivom "Gotova resenja". Tu je koriscen C++, ali sve vazi i za Javu (zbog slicne sintakse). Imas i "Projektne obrasce" kod Mikro knjige na srpskom. A na engleskom je izbor i vise nego dobar,....
[ logotet @ 19.06.2006. 21:21 ] @
Citat: Max Payne: Ma hoću da izmenim, samo mi ne dirajte glavni metod :).
Sta ti to znaci ? Metoda main() nije deo klase GlavnaKlasa. To deluje cudno i netacno, jer se nalazi u istom source fajlu, ali mozes celu metodu da prebacis u potpuno novu kasu i sve ce da radi. Main() se stavlja u neku klasu jer je tako lakse za kucanje, organizaciju koda ...,
ali samo je pri aktiviranju JVM vidi kao GlavnaKlasa.main() i to je cela veza izmedju main() i klase.
Citat: Max Payne: ... ili nešto o organizaciji klasa, hijerarhiji, uopšte dakle o planiranju programa...
Moras da razumes objektno-orijentisani koncept, paradigmu ... To nisu samo teoretska naklapanja vec je sustinsko. Moras da razumes i klase, objekte, enkapsulaciju, nasledjivanje, polimorfizam, asocijacije, agregacije ...
Koliko ja vidim tebi je veoma blizak proceduralni nacin razmisljanja.
Sta ti znaci da hoces sve akcije da stavis u jednu klasu? Akcija je objekat kao i svaki drugi, s tim sto ima osobinu da reaguje na dogadjaj, zato sto se registrovao kao slusalac(listener) objektu koji taj dogadjaj generise. U tvom slucaju JButton dugme generise dogadjaj, a objekat klase Akcija se prijavljuje da "osluskuje" i nesto odradi kada se dogadjaj dogodi.
Dalje, koliko objekata ti prepoznajes u svom primeru? Imas objekat klase GlavnaKlasa koji je JFrame, srpski receno "prozor". Njegova osobina pored ostalog je da se pojavi na monitru. On ima (kompozicija) kao svoje delove neke druge objekte (Jpanel), koji pak ima JButton dugme.
A sta je Akcija ? Tvoj objekat klase Akcija je takodje prozor, koji pored svega ostalog se registruje da osluskuje kada dugme objavi da se dogodio "klik". Da li ti je neophodno da prozor (glavni !?) istovremeno bude i akcija?
I dalje da ne razglabam, moras celu pricu tako da shvatis, objekti medjusobno komuniciraju preko metoda, salju poruke ...Teorija cesto zna da bude suvoparna, dosadna, ali je ovde izuzetno vazno da shvatis pricu o objektima, sta je cija odgovornost ... Moras na neki nacin da pocnes da "razmisljas objektno".
[ anon315 @ 19.06.2006. 23:52 ] @
Tako je! 
[ Java Beograd @ 22.06.2006. 10:11 ] @
Ja lično mislim da, kad su u pitanju listeneri, najviše nesporazuma i lošeg koda, i loše prakse u startu izazivaju početnički primeri, (kojih ima u svim udžbenicima Jave) gde je na primer
Code:
public class MyApplet extends Applet implements ActionListener {
...
...
Button myButton = new Button("Click me");
myButton.addActionListener(this); // ( ruzno do zlaboga !)
....
}
I uvek se početnik zbuni kakav je to "this", ali brzo nauči da kad doda i actionPerformed(ActionEvent ae) sve lepo radi, i eto nama nevolje i špageti koda i "švajcarskog noža".
[ Max Payne @ 24.06.2006. 12:36 ] @
Dakle, drugovi programeri, hvala na pomoći, ali mi niko nije pomogao, osim što sam dobio par dobrih saveta za dalji rad. Malo mi je doduše čudno da neki koji su se ovde javljali imaju iskustva u programiranju u mnogim programskim jezicima, a ne mogu da reše nešto ovako prosto.
Kao što sam već rekao, ko je čitao, suština sveka ovoga i jeste da se razdvoji akcija u posebnu klasu, da ne bi ceo kod pisao u jednoj klasi, jer koliko ja znam, to bi bilo nešto kao proceduralno programiranje. Nije mi jasno zašto ste se svi zakačili za ove dve klase kao da su one same po sebi najvažnije? Otprilike, kao kad se igra neka partija šaha, počne otvaranje, pa sredina partije, i recimo negde u završnici nastane neka zanimljiva pozicija. I onda se ta pozicija, može videti u raznim časopisima i sl. , i ljudi se trude da provale novonastalu situaciju i izvuku neku suštinu za sledeću partiju, ali niko ne pomišlja da je ta pozicija pala s Marsa, nego je svima jasno da se nešto pre toga dešavalo, pa je došlo do ovde dokle je došlo. Isto je i sa ovim kodom. Ja sam zapao u poziciju koju nisam mogao da rešim, jer nemam dovoljno iskustva i kroz ove dve klase sam hteo da konkretno pokažem šta želim da uradim. Mogao sam ja ceo kod iz te dve klase da stavim u jednu klasu i sve bi radilo. Ali ja u mom programčiću, imam mnogo dugmića i tekst fildova i svakojakih čuda još sam zamislio tu.
Ali dobro, bitno je da smo mi nekako rešili problem, a sada ću ja i da vm kažem kako pa da znate svi:
prvo, klasa Akcija ne treba da nasleđuje GlavnuKlasu, nego samo implementira ActionListener. Konstruktor te klase prima objekat tipa JButton, i onda je moguće u GlavnojKlasi napisati ključnu rečenicu koju sam tražio:
dugme.addActionListener(a);
gde je a naravno objekat klase Akcija. Evo Celog koda:
Glavna klasa:
________________________________________
import javax.swing.*;
import java.awt.*;
public class GlavnaKlasa extends JFrame {
JPanel pGlavni = new JPanel(new BorderLayout());
JPanel pPrvi = new JPanel(new FlowLayout());
JButton dugme = new JButton("Biljana");
Akcija a;
public GlavnaKlasa() {
a = new Akcija(dugme);
dugme.addActionListener(a);
dugme.setActionCommand("Biljana");
pPrvi.add(dugme);
pGlavni.add(pPrvi);
setContentPane(pGlavni);
}
public static void main(String[] arg) {
JFrame.setDefaultLookAndFeelDecorated(false);
JFrame Win1 = new GlavnaKlasa();
Win1.setDefaultCloseOperation(EXIT_ON_CLOSE);
Win1.setSize(600, 350);
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize = Win1.getSize();
if (frameSize.height > screenSize.height) {
frameSize.height = screenSize.height;
}
if (frameSize.width > screenSize.width) {
frameSize.width = screenSize.width;
}
Win1.setLocation((screenSize.width - frameSize.width) / 2,
(screenSize.height - frameSize.height) / 2);
Win1.setVisible(true);
}
}
_______________________________________________________
Klasa Akcija:
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Akcija implements ActionListener {
JButton dugme;
public Akcija(JButton d) {
this.dugme = d;
}
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand() == "Biljana") {
System.out.println("radi");
}
}
__________________________________________________________
E, sad, naravno, ono što bi bilo bolje je i da postoji treća klasa, klasa dugme, gde će biti sav kod vezan za konkretno dugme. A u klasi akcija, sve akcije vezane za to dugme. A te dve klase bi se mogle povezati sa paternom MEDIATOR. I patern komand bi mogao takođe da se iskoristi.
Tako da, hvala svima još jednom, ali... šta da vam kažem...
[ logotet @ 24.06.2006. 14:17 ] @
Samo kratak osvrt. Prvo si rekao:
Citat: Max Payne: Ma hoću da izmenim, samo mi ne dirajte glavni metod :).
, a onda ipak vidis da mora da se nesto promeni, doduse ne u main() vec u GlavnojKlasi, ali mislim da sam ti prosli put objasnio svrhu main() metode.
Sada kazes da si sklonio nasledjivanje iz klase Akcija.
Sam naslov teme podrazumeva da nasledjivanja ima, ti si postavio pitanje kako da potklasa vidi dugme iz nadredjene klase. Svi koji su ti davali savete su te upozoravali na razne aspekte, ali si uporno branio neke osnovne postavke iz tvog problema. Nije korektno zamerati ljudima sto su se drzali pitanja iz naslova teme.
Na kraju, kazes da si resio, pokazujes kako i (ako je to ceo kod) ja te sada pitam:
"A cemu sluzi JButton dugme u klasi Akcija?"
Zar ne vidis da je nepotrebno ?
Onog trenutka kada kazes
Code: dugme.addActionListener(a)
dugme ZNA za akciju, i nepotrebno je da akcija ZNA za dugme!
To je ono neki autori nazivaju Class Responsibility i esencijalno je za razumevanje OO principa.
[ Max Payne @ 24.06.2006. 18:14 ] @
A, da, da, ok za JButton, nisam razmišljao, ostade mi to od raznih kombinacija koje sam pokušavao, pa sam bio sav srećan kad je proradilo. A upravu si i za naziv teme, malo sam tu zbunio ljude. Mada opet jasno da je moralo nešto da se promeni. Hvala na savetima pozdrav
[ anon315 @ 24.06.2006. 19:46 ] @
Citat:
Mada ja vise praktikujem stil gde se koristi tzv. bezimena klasa, npr:
Code:
JButton ok = new JButton("OK");
ok.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) { // Radi nesto }
});
Osim u slucaju da se osluskivac koristi na vise mesta, pa onda pises posebnu ugnjezdenu klasu...
No comment...
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|