România
Roportal.ro

probleme in JAVA

Început de pegas, Sâm 10 ian 2009 · 12 răspunsuri · 6.468 vizualizări

pegas7 mesaje#1

se da codul principal(cel al lui darie) : http://www.programare.org/viewtopic.php?t=4307

Eu trebuie ca in functiile ascultatoare de butoane "rom" , "eng" sa memorez o data booleana care sa ma ajute apoi la crearea butoanelor in limba engleza sau romana si nu pot face asta pentru ca functia returneaza void si nu gasesc cale de ocolire.

In ascultatorul "okbut' deasemeni sa memorez indicele <i> ca sa pot sti al catelea pin a fost introdus astfel stiind si ce user "s-a logat" .

So Help :)

astan155 mesaje#2

Listener-ii sunt clase interne care au acces la membrii claselor externe in care au fost declarati.

Metoda care trateaza evenimentul nici nu are de ce sa intoarca altceva decat void.

Iti dau un exemplu simplist mai jos.

Codul foloseste 2 butoane pentru a implementa un counter. Valoarea counter-ului este afisata folosind un label.

//Counter.java

import java.awt.Dimension;

import java.awt.Toolkit;

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.JPanel;

public class Counter extends JFrame {

private int m_countValue = 0;

public Counter() {

setTitle("Counter Demo");

setSize(300, 200);

Dimension size = getToolkit().getScreenSize();

setLocation((size.width - getWidth()) / 2, (size.height - getHeight()) / 2);

setDefaultCloseOperation(EXIT_ON_CLOSE);

JPanel panel = new JPanel();

getContentPane().add(panel);

panel.setLayout(null);

final JLabel label = new JLabel((new Integer(m_countValue)).toString());

label.setBounds(50, 30, 50, 15);

JButton increment = new JButton("+");

increment.setBounds(50, 60, 80, 30);

increment.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent event) {

label.setText((new Integer(++m_countValue)).toString());

}

});

JButton decrement = new JButton("-");

decrement.setBounds(150, 60, 80, 30);

decrement.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent event) {

label.setText((new Integer(--m_countValue)).toString());

}

});

panel.add(label);

panel.add(increment);

panel.add(decrement);

}

public static void main(String [] args) {

Counter counter = new Counter();

counter.setVisible(true);

}

}

// end Counter.java

Ce te intereseaza pe tine este aici:

increment.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent event) {

label.setText((new Integer(++m_countValue)).toString());

}

});

Adica, methoda actionPerformed a butonului increment acceseaza m_countValue, care e un membru al clasei Counter.

Atentie, codul pe care l-am postat este pur demonstrativ si simplificat. Tu, intr-o aplicatie reala, vei folosi de exemplu layout-uri, nu vei pozitiona controalele in mod absolut, asa cum am facut eu mai sus.

In privinta codului din link-ul pe care l-ai prezentat, sper ca e doar o varianta intermediara, pentru ca nu se face asa ceea ce doresti tu. Tu doresti de fapt sa ai suport pentru internationalizare in aplicatia ta, si asta de face folosind Resource Bundles, nu cum faci tu acolo.

Editat Dum 11 ian 2009 04:29

pegas7 mesaje#3
astan a scris:
In privinta codului din link-ul pe care l-ai prezentat, sper ca e doar o varianta intermediara, pentru ca nu se face asa ceea ce doresti tu. Tu doresti de fapt sa ai suport pentru internationalizare in aplicatia ta, si asta de face folosind Resource Bundles, nu cum faci tu acolo.

Este un proiect sa pot sa intru in examen(anul 2 facultate). Scuze dar nu inteleg ce vrei sa spui prin internationalizare si nu am nici o cunostinta despre Resource Bundle. Daca n-as fi fost asa Student poate m-as fi documentat mai din timp :roll:

astan155 mesaje#4

Se cheama ca un program are suport pentru internationalizare si localizare daca poate suporta mai multe limbi si se poate adapta la diverse caracteristici regionale (de exemplu abrevierea folosita pentru moneda nationala - currency, formatul datei, caracterul folosit ca si delimitator zecimal, etc).

Cel mai cunoscut utilitar ce faciliteaza implementarea suportului pentru internationalizare e GNU gettext (s-ar putea sa fi auzit de el, e foarte uzitat de catre programatorii C/C++ pe platforme Unix)

Tu ceea ce vrei de fapt este ca aplicatia ta sa fie disponibila in 2 versiuni: romana si engleza. Ideea in spatele suportului de internationalizare este sa modifici codul minimal pentru a oferi suport multilingv pentru o aplicatie.

Java ofera suport pentru internationalizare folosind clasele Locale si ResourceBundle.

Uite aici un exemplu: http://www.irt.org/articles/js179/index.htm

Tu folosesti interfata Mesaje pentru a tine 2 array-uri cu mesaje: unul in limba romana, altul in engleza.

De fapt, dupa ce o sa citesti articolul recomandat, o sa vezi ca de fapt mesajele se tin in fisiere properties, nu in fisiere java.

Suport pentru internationalizare nu se adauga impanzind codul cu blocuri if/else de genul:

if (romana)

{

creeaza control cu text in romana

}

else

{

creeaza control cu text in engleza

}

Asta pentru ca adaugarea de suport pentru o noua limba trebuie facut in asa fel incat sa impacteze codul deja scris in mod minimal

Inteleg ca esti student. Dar, daca nu ai timp sa inveti lucrurile elementare acum, nu vei avea niciodata

Inca o observatie: designul OO al aplicatiei nu e inca finisat. De exemplu, mixezi codul de prezentare (GUI), crearea de controale, etc cu logica aplicatiei (de ex. verificarea parolei).

Aparent nu urmezi modelul MVC, nu ai decuplat corect partea de prezentare de partea de model. In fine, nu stiu daca realizezi asta, iti trebuie ceva experienta in design software ca sa iti fie evident.

Codul asta;

for(int i = 0; i < possiblePasswords.length; i++)

if(Arrays.equals(possiblePasswords, input))

result = true;

if(result)

JOptionPane.showMessageDialog(fer,"pin misto",

"Succes",JOptionPane.INFORMATION_MESSAGE);

else

JOptionPane.showMessageDialog(fer,"pin naspa",

"bad luck",JOptionPane.INFORMATION_MESSAGE);

panou3.setVisible(false);

panou4.setVisible(true);

}

};

nu prea are ce cauta in clasa responsabila cu crearea controalelor. Altfel, codul responsabil cu implementarea logicii de verificare a parolei este cuplat cu codul responsabil pentru partea de afisare.

Editat Dum 11 ian 2009 23:40

pegas7 mesaje#5

multumesc pentru informatie si scuzami indrazneala dar inafara de surse de aprofundare a materiei nu mi-ai rezolvat cu nimic problema.. Salut :P :o:

pegas7 mesaje#6
pegas a scris:
multumesc pentru informatie si scuzami indrazneala dar inafara de surse de aprofundare a materiei nu mi-ai rezolvat cu nimic problema.. Salut ;) ;)

Scratch that(asa se scrie parca). Sa zicem ca am gasit rostul la acea internationalizare dar acum tot mai am juma din problema de rezolvat(okbut). Multam pentru hintul cu limbile :o: :P

astan155 mesaje#7

Detaliaza care este restul problemei.

Am spus in primul post ca din metoda actionPerformed listener-ului nu trebuie intors nimic. Ca acolo ai acces la membrii clasei externe, deoarece listenerii rom si eng sunt clase interne in Banco.

Adica, poti adauga un membru boolean in clasa externa Banco, care va memora daca tu doresti varianta in engleza sau romana. Valoarea acestui membru o poti seta din metodele actionPerformed a listenerilor rom si eng.

De asemenea, tot in clasa Banco, mai introduci un memru care sa tina minte index-ul in lista cu posibile parole, corespunzand pinilor, in cazul unei verificari corecte a parlei. Sa zicem ca il denumim pinIndex. Acest membru va fi setat din metoda actionPerformed a listener-ului okbut, in momentul in care se parcurge si se verifica array-ul cu parole.

class Banco {

.....

int pinIndex = -1;

.....

okbut = new ActionListener(){

....

public void actionPerformed(ActionEvent ae){

for(int i = 0; i < possiblePasswords.length; i++)

if(Arrays.equals(possiblePasswords, input))

{

result = true;

pinIndex = i;

break;

}

...

}

}

Pe urma, in cod, verifici daca pinIndex e diferit de -1. Daca e, inseamna ca ai avut un match pentru o parola. Vezi sa si resetezi valoarea membrului pinIndex la -1 cand ai terminat de prelucrat si vrei sa verifici o noua parola.

Editat Mie 14 ian 2009 11:22

pegas7 mesaje#8

In okbut = new ActionListener trebuie sa retin I-ul din acel for pentru ca mi-am structurat in asa fel proiectul incat pin-ul de indice I sa corespunda clientului de indice I si soldului de indice I si asa mai departe.

Am pus int pinIndex in declaratiile initiale(unde sunt si panou1,2,3 si bla bla) si pinIndex = i; dupa result=true;

Eroare : "cannot find symbol " in dreptul liniei pinIndex = i;

Am incercat tot felul de pozitionari...nu vrea neam :| ..

astan155 mesaje#9

Am modificat codul.

Membrul boolean roSele din clasa Banco va fi setat pe true in momentul in care se da click pe butonul ro.

Butonul ro are atasat listener-ul rom. In momenul cand se da click pe butonul ro, se apeleaza metoda actionPerformed() a listenerul-ui rom.

Codul modificat este:

rom = new ActionListener(){

public void actionPerformed(ActionEvent ae){

panou2.setVisible(false);

panou3.setVisible(true);

roSele = true;

JOptionPane.showMessageDialog(fer,"Selectat limba romana","Selectie limba",JOptionPane.INFORMATION_MESSAGE);

// panou4.setVisible(true);

}

};

Am adaugat:

roSele = true;

si un mesaj care anunta ca s-a trecut la limba romana.

Similar, in metoda actionPerformed() a listenerului eng (apelat cand dau click pe butonul engl), se seteaza membrul roSele la false si se da un mesaj ca s-a trecut la limba engleza.

Codul este:

eng = new ActionListener(){

public void actionPerformed(ActionEvent ae){

panou2.setVisible(false);

panou3.setVisible(true);

roSele = false;

JOptionPane.showMessageDialog(fer,"Selectat limba engleza","Selectie limba",JOptionPane.INFORMATION_MESSAGE);

// panou4.setVisible(true);

}

};

Am adaugat in clasa Banco un nou membru, de tip int, numit pinIndex, care va tine index-ul pinului daca sa introdus o parola corecta.

pinIndex e initializat la valoarea -1 si ramane la aceasta valoare daca parola nu e corecta.

pinIndex va fi setat in metoda actionPerformed() a listener-ului okbut, apelata cand se da click pe butonul okButton.

Noua implementare a listener-ului este (modificari in bold):

okbut = new ActionListener(){

......

for(int i = 0; i < possiblePasswords.length; i++)

if(Arrays.equals(possiblePasswords, input)) {

result = true;

pinIndex = i;

JOptionPane.showMessageDialog(fer,"Selectat pin " + i,"Parola corecta",JOptionPane.INFORMATION_MESSAGE);

break;

}

.....

}

Codul complet al clasei Banco e mai jos. Celelalte fisiere, in afara de Banco.java nu au fost modificate.

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

import java.util.Arrays;

public class Banco extends JFrame implements Mesaje{

private Component panou1,panou2,panou3,panou4,panou5;

private ActionListener cgres ,ccor;

private ActionListener rom,eng ;

private ActionListener alHelp;

private ActionListener alClose;

private ActionListener alAbout , okbut , cons;

private JPasswordField cPIN;

private static Banco fer ;

private JPanel panouaux ;

public boolean roSele;

private int pinIndex = -1;

public Banco() {

super("Bancomat");

setSize(1024, 725);

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

Container cp=getContentPane();

createListeners();

createMenu();

panou1=createComp();

cp.add(panou1, BorderLayout.SOUTH);

panou3=verifPIN();

cp.add(panou3,BorderLayout.CENTER);

panou3.setVisible(false);

panou4= alegeOp();

cp.add(panou4,BorderLayout.EAST);

panou4.setVisible(false);

panou2=selectLang();

// panou5=primfc();

panou2.setVisible(false);

// panou5.setVisible(true);

cp.add(panou2,BorderLayout.WEST) ;

setLookFeel();

setVisible(true);

}

private void setLookFeel(){

try {

//UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

SwingUtilities.updateComponentTreeUI(this);

} catch (Exception e) {System.out.println("Look & Feel error"); }

}

public void createListeners(){

alClose = new ActionListener() {

public void actionPerformed(ActionEvent ae) {

setVisible(false);

dispose();

System.exit(0);

}

};

alHelp = new ActionListener() {

public void actionPerformed(ActionEvent ae) {

JOptionPane.showMessageDialog(fer,"Apasati Butoanele Azi !","Ce help ma ?",JOptionPane.INFORMATION_MESSAGE);

}

};

alAbout = new ActionListener() {

public void actionPerformed(ActionEvent ae) {

JOptionPane.showMessageDialog(fer,"Enciu Adrian ; Talpau Mihaela ; Gheorghe Ionel","Autori",JOptionPane.INFORMATION_MESSAGE);

}

};

cgres = new ActionListener(){

public void actionPerformed(ActionEvent ae) {

JOptionPane.showMessageDialog(fer,"Card neacceptat (Card not accepted)","Error",JOptionPane.INFORMATION_MESSAGE);

}

};

ccor = new ActionListener(){

public void actionPerformed(ActionEvent ae) {

panou1.setVisible(false) ;

panou2.setVisible(true);

}

};

rom = new ActionListener(){

public void actionPerformed(ActionEvent ae){

panou2.setVisible(false);

panou3.setVisible(true);

roSele = true;

JOptionPane.showMessageDialog(fer,"Selectat limba romana","Selectie limba",JOptionPane.INFORMATION_MESSAGE);

// panou4.setVisible(true);

}

};

eng = new ActionListener(){

public void actionPerformed(ActionEvent ae){

panou2.setVisible(false);

panou3.setVisible(true);

roSele = false;

JOptionPane.showMessageDialog(fer,"Selectat limba engleza","Selectie limba",JOptionPane.INFORMATION_MESSAGE);

// panou4.setVisible(true);

}

};

okbut = new ActionListener(){

public void actionPerformed(ActionEvent ae){

char[][] possiblePasswords = new char[][] {

pin[0].toCharArray(),

pin[1].toCharArray(),

pin[2].toCharArray(),

pin[3].toCharArray(),

pin[4].toCharArray(),

pin[5].toCharArray(),

pin[6].toCharArray(),

pin[7].toCharArray(),

pin[8].toCharArray(),

pin[9].toCharArray(),

pin[10].toCharArray(),

pin[11].toCharArray()

};

char[] p1=cPIN.getPassword();

char[] input = p1;

boolean result = false;

for(int i = 0; i < possiblePasswords.length; i++)

if(Arrays.equals(possiblePasswords, input)) {

result = true;

pinIndex = i;

JOptionPane.showMessageDialog(fer,"Selectat pin " + i,"Parola corecta",JOptionPane.INFORMATION_MESSAGE);

break;

}

if(result)

JOptionPane.showMessageDialog(fer,"pin misto",

"Succes",JOptionPane.INFORMATION_MESSAGE);

else

JOptionPane.showMessageDialog(fer,"pin naspa",

"bad luck",JOptionPane.INFORMATION_MESSAGE);

panou3.setVisible(false);

panou4.setVisible(true);

}

};

cons = new ActionListener(){

public void actionPerformed(ActionEvent ae){

panou4.setVisible(false);

}

};

};

public void createMenu() {

JMenuBar menuBar = new JMenuBar(); //bara de meniu

JMenu menuFile = new JMenu("File"); //meniul File

menuFile.setMnemonic(java.awt.event.KeyEvent.VK_F);

JMenu menuHelp = new JMenu("Help"); //meniul Help

menuHelp.setMnemonic(java.awt.event.KeyEvent.VK_E);

//itemi in meniul File

JMenuItem itemClose = new JMenuItem("Close");

//seteaza o combinatie de taste pentru activarea item-ului fara a intra in meniu

itemClose.addActionListener(alClose);

//itemi in meniul Help

JMenuItem helpItem = new JMenuItem("Help");

JMenuItem aboutItem = new JMenuItem("About");

helpItem.setMnemonic(java.awt.event.KeyEvent.VK_H);

aboutItem.setMnemonic(java.awt.event.KeyEvent.VK_A);

menuHelp.add(helpItem);

menuHelp.add(aboutItem);

helpItem.setAccelerator(KeyStroke.getKeyStroke('H', Event.CTRL_MASK, false));

helpItem.addActionListener(alHelp);

aboutItem.addActionListener(alAbout);

itemClose.setMnemonic(java.awt.event.KeyEvent.VK_C);

itemClose.setAccelerator(KeyStroke.getKeyStroke('C',Event.CTRL_MASK, false));

menuFile.add(itemClose);

itemClose.addActionListener(alClose);

menuBar.add(menuFile);

menuBar.add(menuHelp);

this.setJMenuBar(menuBar);

}

public Component createComp(){

Box b1=Box.createHorizontalBox();

JPanel panoul = new JPanel(new FlowLayout(FlowLayout.RIGHT));

JPanel cardAcc= new JPanel(new FlowLayout()) ;

cardAcc.add(new JLabel("Tipuri de card acceptate : "));

cardAcc.add(new JLabel("Visa , Mastercard , Maestro "));

panoul.add(cardAcc);

JButton but1=new JButton("Visa");

but1.addActionListener(ccor);

b1.add(but1);

b1.add(Box.createHorizontalStrut(10));

JButton but2=new JButton("Mastercard");

but2.addActionListener(ccor);

b1.add(but2) ;

b1.add(Box.createHorizontalStrut(10));

JButton but3=new JButton("Maestro");

but3.addActionListener(ccor);

b1.add(but3);

b1.add(Box.createHorizontalStrut(10));

JButton but4=new JButton("American");

but4.addActionListener(cgres);

b1.add(but4);

b1.add(Box.createHorizontalStrut(10));

panoul.add(b1);

return panoul ;

}

public Component selectLang(){

Box b2=Box.createVerticalBox();

b2.add(Box.createVerticalStrut(300));

JButton ro=new JButton("-> Romana ");

ro.addActionListener(rom);

b2.add(ro);

b2.add(Box.createVerticalStrut(20));

JButton engl=new JButton("-> English ");

engl.addActionListener(eng);

b2.add(engl);

b2.add(Box.createVerticalStrut(300));

return b2 ;

}

public Component verifPIN(){

Box b3=Box.createVerticalBox();

b3.add(Box.createHorizontalStrut(280));

b3.add(Box.createVerticalStrut(300));

panouaux=new JPanel() ;

panouaux.add(new JLabel(" PIN "));

cPIN= new JPasswordField(4);

panouaux.add(cPIN);

JButton okButton = new JButton("OK");

okButton.addActionListener(okbut);

panouaux.add(okButton);

b3.add(panouaux);

b3.add(Box.createVerticalStrut(300));

return b3 ;

}

public Component alegeOp(){

Box b4=Box.createVerticalBox();

b4.add(Box.createVerticalStrut(278));

if(roSele){

JButton consult=new JButton(mesRo[1]);

b4.add(consult);

consult.addActionListener(cons);}

else {

JButton consult=new JButton(mesEn[1]);

b4.add(consult);

consult.addActionListener(cons);

}

b4.add(Box.createVerticalStrut(30));

if(roSele){

JButton retrag=new JButton(mesRo[2]);

b4.add(retrag);}

else {

JButton retrag=new JButton(mesEn[2]);

b4.add(retrag);

}

b4.add(Box.createVerticalStrut(30));

if(roSele){

JButton plati=new JButton(mesRo[3]);

b4.add(plati);}

else {

JButton plati=new JButton(mesEn[3]);

b4.add(plati);

}

b4.add(Box.createVerticalStrut(200));

return b4 ;

}

/* public Component primfc(){

Box b5=Box.createVerticalBox();

JButton ro=new JButton("-> Romdsaassadsada ");

// b5.add(ro);

b5.add(Box.createVerticalStrut(10));

JButton engl=new JButton("-> Enasdasdasdasish ");

// b5.add(engl);

return b5 ;

} */

public static void main(String args[]){

fer=new Banco();

}

}

pegas7 mesaje#10

Codul functioneaza dar trebuia sa rulezi(sau poate ai facuto si nu ai vazut) . Ideea care e . In interiorul ascultatorului pot sa fac schimbari si sa-i dau lui roSele si/sau pinIndex valori diferite insa ele inafara functiei nu se pastreaza. De asta am eu nevoie . Am mentionat ca trebuie sa folosesc aceste date pe tot parcursul executiei. Am pus codul si am rulat . Mergea fara indoiala insa butoanele tot intro singur limba raman infiderent de ce apas , adica roSele declarat intial ramane false (sigur se modifica in interiorul functiei... dar atat). Cat despre pinIndex nu are rost sa mai mentionez pentru ca ar fi fost acelasi rezultat.

Scuze daca va enervez sau va cauzez migrene si chestii :jester:

← Înapoi la Programare