Sunteți pe pagina 1din 12

Programare grafică în Java (II) 165

Lucrare de laborator nr. 14


Programare grafică în Java (II)

1. Scopul lucrării

În această lucrare se realizează o aplicaţie în care se foloseşte


componenta JTextArea, se prezintă o modalitate de a afişa imagini şi
se exemplifică tratarea evenimentului de apăsarea unei taste.

2. Breviar teroretic

Mediul de execuţie Java este cel care detectează evenimentele


şi apelează în mod automat, la detectarea evenimentului respectiv,
metoda corespunzătoare de tratare a evenimentului (metodă scrisă de
programator în clasa de ascultare). În plus, Java impune numele
metodei de tratare a evenimentului, dar programatorul este cel care îi
dă codul.
Astfel, pentru tratarea evenimentului, click cu mouse-ul pe un
buton, numele impus de metoda de tratare este actionPerformed( ) .
Exemplu: Tratarea apăsării butonului “Exit”, se face în clasa de
ascultare a butonului, astfel:
class AscultaButonExit implements ActionListener
{
public void actionPerformed (actionEvent ev)
{
System.exit (0); // ceea ce scrie programatorul
}
}
Clasa AscultaButonExit, deoarece implementează interfaţa
ActionListener, trebuie să implementeze definiţiile tuturor metodelor
descrise de aceasta interfaţă. Interfaţa ActionListener declară doar o
singură metodă: metoda actionPerformed(), de aceea clasa
AscultaButonExit o va implementa în mod obligatoriu.
166 Programare grafică în Java (II)

Clasa de ascultare a evenimentului de apăsare a unei taste


extinde clasa KeyAdapter, prin definirea metodei keyPressed(), ce are
semnătura:
public void keyPressed(KeyEvent evt)
Adăugarea obiectului de ascultare pentru acest tip de eveniment se
face cu metoda addKeyListener() .

3. Probleme rezolvate

Problema 1
Să se scrie o aplicaţie în care se afişează o fereastră ce conţine
trei componente grafice: JTextArea pentru introducerea unui text pe
mai multe linii, JTextField pentru afişare şi un buton JButton care
atunci când se apasă determină afişarea în componenta JTextField a
numărului de linii tastate în componenta JTextArea.
Pentru a determina numărul de linii tastate în JTextArea se foloseşte
următoarea metodă din clasa JTextArea:
public int getLineCount();

import javax.swing.*;
import javax.swing.border.*;
import java.awt.*;//GridLayout, Container
import java.awt.event.*;//ActionListener, ActionEvent

class TestJTextArea
{
public static void main(String args[])
Programare grafică în Java (II) 167

{
Fereastra f = new Fereastra();
f.pack();
f.setLocationRelativeTo(null);//centrare. Dar dupa pack()
f.setVisible(true);
}
}

class Fereastra extends JFrame


{
private JTextField jtf;
private JTextArea jta;
public Fereastra()
{
setTitle("test JTextArea");
setDefaultCloseOperation(EXIT_ON_CLOSE);
jta=new JTextArea("",10,20);//10 linii, 20 de coloane
JPanel jtaP=new JPanel();
jtaP.setBorder(new TitledBorder(new EtchedBorder(),
"JTextArea"));
jtaP.add(jta);
jtf=new JTextField(10);
JPanel jtfP=new JPanel();
jtfP.setBorder(new TitledBorder(new EtchedBorder(), "nr. linii"));
jtfP.add(jtf);
JButton jb=new JButton("Calcul");
jb.addActionListener(new AscultaButoane());
JPanel jp=new JPanel();
jp.add(jtaP);
jp.add(jtfP);
jp.add(jb);
Container c=getContentPane();
c.add(jp,"South");
}

class AscultaButoane implements ActionListener


{
public void actionPerformed(ActionEvent ev)
{
int n=jta.getLineCount();
168 Programare grafică în Java (II)

jtf.setText(n+"");
}
}
}

Problema 2
Să se scrie o aplicaţie în care se afişează o fereastră ce conţine
trei componente grafice: JTextField pentru introducerea unui text,
JTextField pentru afişare şi un buton JButton pentru ieşirea din
program. Atunci când se apasă tasta ENTER în primul JTextField,
textul introdus acolo va fi copiat în al doilea JTextField, cu litere mari.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
class GraficCopiereText
{
public static void main(String args[])
{
Fereastra f=new Fereastra();
f.pack();//dimensiuni imagine optima
f.setLocationRelativeTo(null);//centrare. Dar dupa pack()
f.setVisible(true);
}
}

class Fereastra extends JFrame


{
private JTextField jtfDate,jtfAfisare;
private JButton jbExit;
//constructor
Programare grafică în Java (II) 169

public Fereastra()
{
this.setTitle("Copiere text");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//construieste componente:
jtfDate=new JTextField(30);
jtfDate.setEditable(true);
jtfDate.addKeyListener(new ClasaTasteListener());
JPanel jp1=new JPanel();
jp1.add(jtfDate);
jtfAfisare=new JTextField(30);
jtfAfisare.setEditable(false);
JPanel jp2=new JPanel();
jp2.add(jtfAfisare);
jbExit=new JButton("Exit");
JPanel jp3=new JPanel();
jp3.add(jbExit);
//Container intermediar:
JPanel jp=new JPanel();
jp.setLayout(new GridLayout(3,1));
jp.add(jp1);
jp.add(jp2);
jp.add(jp3);
ClasaButoaneListener bL=new ClasaButoaneListener();
jbExit.addActionListener(bL);
//Containerul final:
Container c=this.getContentPane();
c.add(jp,"South");
}

//inner class:
private class ClasaButoaneListener implements ActionListener
{
public void actionPerformed(ActionEvent ev)
{
System.exit(0);
}
}
170 Programare grafică în Java (II)

private class ClasaTasteListener extends KeyAdapter


{
public void keyPressed(KeyEvent evt)
{
// S-a tastat ENTER ?
if (evt.getKeyChar() == '\n') {
String text=jtfDate.getText();
jtfAfisare.setText(text.toUpperCase());
}
}
}
}//end class Fereastra

Problema 3
Se va realiza interfaţa grafică prezentată în continuare. În
aplicaţie se afişează pe rând câte o imagine. Numele imaginilor de
afişat sunt memorate în fişierul text imagini.txt, aflat în directorul
curent, câte un nume pe fiecare linie.
Exemplu de fişier imagini.txt:
mar.gif
minge.gif
bicicleta.gif
caine.gif
Imaginile sunt obiecte JLabel care au imagini pe ele, adăugate
cu metoda setIcon().
Fişierele imagine sunt de tipul .gif şi se găsesc de asemenea în
directorul curent.
Imaginile se afişează fie în ordinea din fişierul text, mergând
înainte, fie în ordine inversă, mergând înapoi, modul de afişare fiind
comandat prin două butoane.
Programare grafică în Java (II) 171

import java.io.*;
import javax.swing.*;
import java.awt.*;//GridLayout, Container
import java.awt.event.*;//ActionListener, ActionEvent

class AfisareImagini
{
public static void main(String args[])
{
JFrame f = new Fereastra();
f.pack();
f.setLocationRelativeTo(null);//centrare. Dar dupa pack()
f.setVisible(true);
}
}

class Fereastra extends JFrame


{
private JButton jbExit,jbBack,jbNext;
172 Programare grafică în Java (II)

private JTextField jtf;


private JLabel jl;
private String s[]=new String[1000];//dimensiune acoperitoare
private int nrTotalImagini;
private int indexImagineCrt=0;//prima imagine, va avea index=0

public Fereastra()
{
this.setTitle("Afisare imagini");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
/*
Structura fisier text:
mar.gif
caine.gif
pisica.gif
...
*/
//Citire informatii din fisierul text:
int n=0; //nr. de linii din fisier
FileReader fr=null;
BufferedReader bfr=null;
try{
fr=new FileReader("imagini.txt");
bfr=new BufferedReader(fr);
for(;;)
{
String linieCrt=bfr.readLine();
if (linieCrt==null) break;
else{
s[n]=linieCrt;
n++;
}
}
}catch (IOException e) {
System.exit(0);
}
nrTotalImagini=n;
jl=new JLabel("");
jl.setIcon(new ImageIcon(s[0]));//afisez prima imagine
JPanel jp1=new JPanel();
Programare grafică în Java (II) 173

jp1.add(jl);
jtf=new JTextField(40);
jtf.setEditable(false);
jtf.setText(s[0]);
JPanel jp2=new JPanel();
jp2.add(jtf);
AscultaButoane m=new AscultaButoane();
jbBack=new JButton("<-");
jbBack.addActionListener(m);
jbNext=new JButton("->");
jbNext.addActionListener(m);
JPanel jp3=new JPanel();
jp3.add(jbBack);
jp3.add(jbNext);
jbExit=new JButton("Exit");
jbExit.addActionListener(m);
JPanel jp4=new JPanel();
jp4.add(jbExit);
JPanel jpB=new JPanel();
jpB.setLayout(new GridLayout(3,1));
jpB.add(jp2);
jpB.add(jp3);
jpB.add(jp4);
JPanel jp=new JPanel();
jp.setLayout(new GridLayout(2,1) );
jp.add(jp1);
jp.add(jpB);
Container c=this.getContentPane( );
c.add(jp,"Center");
}

class AscultaButoane implements ActionListener


{
public void actionPerformed(ActionEvent ev)
{
Object sursa=ev.getSource();
if(sursa==jbExit)System.exit(0);
else if(sursa==jbNext)
{
if(indexImagineCrt==nrTotalImagini-1)return;//e deja ultima
174 Programare grafică în Java (II)

// imagine afisata, nu are unde merge mai departe!


indexImagineCrt++;
jl.setIcon(new ImageIcon(s[indexImagineCrt]));
jtf.setText(s[indexImagineCrt]);
}
else if(sursa==jbBack)
{
if(indexImagineCrt==0)return;//e deja prima imagine
// afisata, nu are unde merge inapoi!
indexImagineCrt--;
jl.setIcon(new ImageIcon(s[indexImagineCrt]));
jtf.setText(s[indexImagineCrt]);
}
}
}
}

3. Probleme propuse

Problema 1
Să se scrie o aplicaţie în care se implementează un test grilă
simplu. Întrebările testului sunt memorate într-un fişier text. Fiecare
întrebare are trei variante de răspuns, dintre care doar una este corectă.
Atât întrebarea cât şi fiecare variantă de răspuns ocupă un singur rând
în fişierul text. Întrebările sunt afişate pe rând, împreună cu variantele
de răspuns, în ordinea în care apar în fişier. Răspunsul dat de utilizator
este selectat printr-un buton radio. La ieşirea din aplicaţie (atunci când
se apasă butonul Exit) se afişează într-o fereastră numărul de
răspunsuri corecte şi numărul total de întrebări din fişier ( se va folosi
pentru afişare metoda statică showMessageDialog din clasa
JOptionPane ). În fişier, la fiecare întrebare, pe lângă cele 3 variante
de răspuns, este memorat şi numărul răspunsului corect la acea
întrebare (prima variantă de răspuns are numărul 0). Numărul de
întrebări din fişier este variabil.
Exemplu de fişier text:

Ce munti sunt in jud Arges?


a. Rodnei
b. Paring
Programare grafică în Java (II) 175

c. Fagaras
2
Orasul Lipova se gaseste in judetul:
a. Arad
b. Timisoara
c. Arges
0

Interfaţa grafică arată astfel:


176 Programare grafică în Java (II)

S-ar putea să vă placă și