Копия swing_slide

42
Swing JFC (Java Foundation Classes) Componentele Swing Asem˘ an˘ ari ¸ si deosebiri cu A WT Folosirea ferestrelor Ferestre interne Arhitectura modelului Swing Folosirea modelelor Tratarea evenimentelor Folosirea componentelor Containere Desenarea Look and Feel 1

Transcript of Копия swing_slide

8/8/2019 Копия swing_slide

http://slidepdf.com/reader/full/-swingslide 1/42

Swing

• JFC (Java Foundation Classes)

• Componentele Swing

Asemanari si deosebiri cu AWT• Folosirea ferestrelor

• Ferestre interne

• Arhitectura modelului Swing

• Folosirea modelelor• Tratarea evenimentelor

• Folosirea componentelor

• Containere

• Desenarea• Look and Feel

1

8/8/2019 Копия swing_slide

http://slidepdf.com/reader/full/-swingslide 2/42

JFC (Java Foundation Classes)

• Componente Swing

• Look-and-Feel

• Accessibility API

• Java 2D API

• Drag-and-Drop

• Internationalizare

2

8/8/2019 Копия swing_slide

http://slidepdf.com/reader/full/-swingslide 3/42

Swing API

javax.accessibility javax.swing.plaf

javax.swing.text.html javax.swing

javax.swing.plaf.basic javax.swing.text.parser

javax.swing.border javax.swing.plaf.metal

javax.swing.text.rtf javax.swing.colorchooser

javax.swing.plaf.multi javax.swing.treejavax.swing.event javax.swing.table

javax.swing.undo javax.swing.filechooser

javax.swing.text

Cel mai important: javax.swing

3

8/8/2019 Копия swing_slide

http://slidepdf.com/reader/full/-swingslide 4/42

Componentele Swing

• Componente atomice

JLabel, JButton, JCheckBox, JRadioButton,

JToggleButton, JScrollBar, JSlider, JProgressBar,

JSeparator

• Componente complexe

JTable, JTree, JComboBox, JSpinner, JList,

JFileChooser, JColorChooser, JOptionPane

• Componente pentru editare de text

JTextField, JFormattedTextField, JPasswordField,

JTextArea, JEditorPane, JTextPane

• Meniuri

JMenuBar, JMenu, JPopupMenu, JMenuItem,

JCheckboxMenuItem, JRadioButtonMenuItem

• Containere intermediare

JPanel, JScrollPane, JSplitPane, JTabbedPane,

JDesktopPane, JToolBar

• Containere de nivel ınaltJFrame, JDialog, JWindow, JInternalFrame,

JApplet

4

8/8/2019 Копия swing_slide

http://slidepdf.com/reader/full/-swingslide 5/42

Asemanari si deosebiri cu AWT

Tehnologia Swing extinde AWT.

import javax.swing.*;

import java.awt.*; //Font, Color, ...

import java.awt.event.*;

Conventia ”J”java.awt.Button - javax.swing.JButton

java.awt.Label - javax.swing.JLabel,etc.

Noi gestionari de pozitionare: BoxLayout

si SpringLayout

Folosirea HTML

JButton simplu = new JButton("Text simplu");

JButton html = new JButton("<html><u>Text</u> <i>formatat</i></html>");

5

8/8/2019 Копия swing_slide

http://slidepdf.com/reader/full/-swingslide 6/42

8/8/2019 Копия swing_slide

http://slidepdf.com/reader/full/-swingslide 7/42

Folosirea ferestrelor

Frame f = new Frame();

f.setLayout(new FlowLayout());

f.add(new Button("OK"));

JFrame jf = new JFrame();

jf.getContentPane().setLayout(new FlowLayout());

jf.getContentPane().add(new JButton("OK"));

jf.setDefaultCloseOperation(

WindowConstants.HIDE_ON_CLOSE);

WindowConstants.DO_NOTHING_ON_CLOSEJFrame.EXIT_ON_CLOSE

7

8/8/2019 Копия swing_slide

http://slidepdf.com/reader/full/-swingslide 8/42

Ferestre interne

Aplicatiile pot fi ımpartite ın:

• SDI (Single Document Interface)

• MDI (Multiple Document Interface)

Clase:JInternalFrameDesktopPane - container

8

8/8/2019 Копия swing_slide

http://slidepdf.com/reader/full/-swingslide 9/42

Listing 2: Folosirea ferestrelor interneimport j a v a x . s w i n g . * ;

import j a v a . a w t . * ;

class F e r e a s t r a P r i n c i p a l a extends J Fr am e {

public F e r e as t r a Pr i n c i pa l a ( S t r i ng t i tl u ) {

super ( t i t l u ) ;

s e t Si z e ( 30 0 , 2 0 0) ;

s e t D e f a u l t C l o s e O p e r a t i o n ( J F r a m e . E X I T _ O N _ C L O S E ) ;

F e r e as t r a In t e r na f i n1 = ne w F e r e a s t r a I n t e r n a ( ) ;

f i n 1 . s e t V i s i b l e ( true ) ;

F e r e as t r a In t e r na f i n2 = ne w F e r e a s t r a I n t e r n a ( ) ;

f i n 2 . s e t V i s i b l e ( true ) ;

J D e s kt o p P an e d e s kt o p = ne w J D e s k t o p P a n e ( ) ;

d e s k t o p . a d d ( f i n 1 ) ;

d e s k t o p . a d d ( f i n 2 ) ;

s e t C o n t e n t P a n e ( d e s k t o p ) ;

f i n 2 . m o v e T o F r o n t ( ) ;

}

}

class F e r e a s t r a I n t e r n a extends J I n t er n a l Fr a m e {

s t at i c i n t n = 0; / / nr . d e f er e st re i nt e rn es t at i c f i na l i n t x = 3 0 , y = 3 0 ;

public F e r e as t r a In t e r na ( ) {

super ( " D oc u me n t # " + ( ++ n ) ,

true , / / r e s i z a b l e

true , / / c l o s a b l e

true , / / m a x i m i z a b l e

true ) ; / / i c o n i f i a b l e

s e t L oc a t io n ( x * n , y * n ) ;

s e t S i z e ( new D i m en s i on ( 2 0 0 , 1 0 0) ) ;

}

}

p u bl i c c l as s T e s t In t e r na l F r am e {p u bl i c s t a ti c v o id m a in ( S t r i ng a r gs [ ] ) {

new F e r e as t r a Pr i n c i pa l a ( " T e st f e r es t r e i n t er n e " ) . s ho w ( ) ;

}

}

9

8/8/2019 Копия swing_slide

http://slidepdf.com/reader/full/-swingslide 10/42

Clasa JComponent

JComponent este superclasa tuturorcomponentelor Swing, mai putin JFrame,JDialog, JApplet.JComponent extinde clasa Container.

Facilitati:

• ToolTips - setToolTip

• Chenare - setBorder

• Suport pentru plasare si di-mensionare - setPreferredSize,

...

• Controlul opacitatii - setOpaque

Asocierea de actiuni tastelor• Double-Buffering

10

8/8/2019 Копия swing_slide

http://slidepdf.com/reader/full/-swingslide 11/42

Listing 3: Facilitati oferite de clasa JComponentimport j a v a x . s w i n g . * ;

import j a v a x . s w i n g . b o r d e r . * ;

import j a v a . a w t . * ;

import j a v a . a w t . e v e n t . * ;

class F e r e a s t r a extends J Fr a me {

public F e r ea s t ra ( S t r i n g t i tl u ) {

super ( t i t l u ) ;

g e t C o n t e n t P a n e ( ) . s e t L a y o u t ( ne w F l o w L a y o u t ( ) ) ;

s e t D e f a u l t C l o s e O p e r a t i o n ( J F r a m e . E X I T _ O N _ C L O S E ) ;

/ / F o l os i r ea c h e na r e lo r  

B o r d e r l o w er e d , r a i s e d ;

T i t le d B o rd e r t i tl e ;

l o w er e d = B o r d er F a ct o r y . c r e a t e L ow e r e d Be v e l B or d e r ( ) ;

r a is e d = B o r d er F a c to r y . c r e a t e R ai s e d B ev e l B or d e r ( ) ;

t i tl e = B o r de r F a ct o r y . c r e a t eT i t l e dB o r d e r ( " B o rd e rs " ) ;

final J Pa ne l p an el = ne w J P a n e l ( ) ;

p a n e l . s e t P r e f e r r e d S i z e ( ne w D i m e n s i o n ( 4 0 0 , 2 0 0 ) ) ;

p a n e l . s e t B a c k g r o u n d ( C o l o r . b l u e ) ;

p a n e l . s e t B o r d e r ( t i t l e ) ;

g e t C o n t e n t P a n e ( ) . a d d ( p a n e l ) ;

J La b el l ab el 1 = new J L a b e l ( " L o w e r e d " ) ;

l a b e l 1 . s e t B o r d e r ( l o w e r e d ) ;

p a n e l . a d d ( l a b e l 1 ) ;

J La b el l ab el 2 = new J L a b e l ( " R a i s e d " ) ;

l a b e l 2 . s e t B o r d e r ( r a i s e d ) ;

p a n e l . a d d ( l a b e l 2 ) ;

/ / C o n tr o l ul o p a ci t a ti i

J B ut t on b tn 1 = ne w J B u t t o n ( " O p a q u e " ) ;

b t n 1 . s e t O p a q u e ( true ) ; / / i m p li c i t

p a n e l . a d d ( b t n 1 ) ;

J B ut t on b tn 2 = ne w J B u t t o n ( " T r a n s p a r e n t " ) ;

b t n 2 . s e t O p a q u e ( false ) ;

p a n e l . a d d ( b t n 2 ) ;

/ / T o o lT i p s

11

8/8/2019 Копия swing_slide

http://slidepdf.com/reader/full/-swingslide 12/42

l a b e l 1 . s e t T o o l T i p T e x t ( " E t i c h e t a c o b o r a t a " ) ;

l a b e l 2 . s e t T o o l T i p T e x t ( " E t i c h e t a r i d i c a t a " ) ;

b t n1 . s e t T o o l Ti p T e xt ( " B u t o n o p ac " ) ;

/ / T ex tu l p oa te f i H TM L

b t n2 . s e t T o o l Ti p T e xt ( " < h tm l > < b > A p a s at i < f o nt c o lo r = r ed > F 2

< / fon t > " +

" c a n d b u t on u l a re < u > f oc u su l < / u > " );

/ / A s o ci e r ea u n or a c t iu n i ( K e y B i nd i n gs )

/ * A p as a re a t as t ei F 2 c an d f o cu su l e st e p e b u to nu l a l

doilea 

v a d e te r mi n a s c hi m ba r ea c u lo ri i p a ne l ul u i * /  

b t n 2 . g e t I n p u t M a p ( ) . p u t ( K e y S t r o k e . g e t K e y S t r o k e ( " F 2 " ) ,

" s c h i m b a C u l o a r e " ) ;

b t n 2 . g e t A c t i o n M a p ( ) . p u t ( " s c h i m b a C u l o a r e " , ne wA b s t ra c t A ct i o n ( ) {

private C ol or c ol or = C ol or . r ed ;

p u bl i c v o id a c t i on P e r fo r m e d ( A c t io n E v en t e ) {

p a n e l . s e t B a c k g r o u n d ( c o l o r ) ;

c ol or = ( c o lo r = = C ol or . r ed ? C ol or . b l ue : C ol or . r ed )

;

}

}) ;

p a c k ( ) ;

}

}

p u bl i c c l as s T e s t JC o m p on e n t {

p u bl i c s t a ti c v o id m a in ( S t r i ng a r gs [ ] ) {

new F e r e a s t r a ( " F a c i l i t a t i J C o m p o n en t " ) . s h o w ( ) ;

}

}

12

8/8/2019 Копия swing_slide

http://slidepdf.com/reader/full/-swingslide 13/42

Arhitectura modelului Swing

MVC (model-view-controller).

• Modelul  - datele aplicatiei.

• Prezentarea  - reprezentare vizuala

• Controlul  - transformarea actiunilorın evenimente

Arhitectura cu model separa-bilModel + (Prezentare, Control)

13

8/8/2019 Копия swing_slide

http://slidepdf.com/reader/full/-swingslide 14/42

Folosirea modelelor

Model Componenta

ButtonModel JButton, JToggleButton, JCheckBox

JRadioButton, JMenu, JMenuItem,

JCheckBoxMenuItem,

JRadioButtomMenuItem

JComboBox ComboBoxModel

BoundedRangeModel JProgressBar, JScrollBarm, JSlid

JTabbedPane SingleSelectionModel

ListModel JList

ListSelectionModel JList

JTable TableModel

JTable TableColumnModel

JTree TreeModelJTree TreeSelectionModel

Document JEditorPane, JTextPane, JTextArea

JTextField, JPasswordField

Crearea unui model = implementareainterfetei

JList - ListModelDefaultListModel, AbstractListModel

14

8/8/2019 Копия swing_slide

http://slidepdf.com/reader/full/-swingslide 15/42

Listing 4: Folosirea mai multor modele pentru o componentaimport j a v a x . s w i n g . * ;

import j a v a x . s w i n g . b o r d e r . * ;

import j a v a . a w t . * ;

import j a v a . a w t . e v e n t . * ;

class F e r e a s t r a extends JFrame i m p l e m e n t s A c t i on L i s te n e r {

S tr in g d at a1 [ ] = { " r os u " , " g a lb en " , " a l ba s tr u " };

S tr in g d at a2 [ ] = { " r ed " , " y e ll ow " , " b lu e " };

in t t i pM o de l = 1 ;

J L is t l s t ;

L i s tM o d el m o de l 1 , m o d el 2 ;

public F e r ea s t ra ( S t r i n g t i tl u ) {

super ( t i t l u ) ;

s e t D e f a u l t C l o s e O p e r a t i o n ( J F r a m e . E X I T _ O N _ C L O S E ) ;

// L is ta i ni ti al a n u a re n ic i u n m od el

l st = ne w J L i s t ( ) ;

g e t C o n t e n t P a n e ( ) . a d d ( l s t , B o r d e r L a y o ut . C E N T E R ) ;

/ / L a a pa s ar a b u to n ul u i s c hi mb a m m od e lu l

J B ut t on b tn = ne w J B u t t o n ( " S c h i m b a m o d e l u l " ) ;

g e t C o n t e n t P a n e ( ) . a d d ( b t n , B o r d e r L a y o ut . S O U T H ) ;

b t n . a d d A c t i o n L i s t e n e r ( this ) ;

/ / C r ea m o b i ec t e le c o r e sp u n z at o a r e c e lo r d o ua m o de l e

  m o d e l 1 = new M o d e l 1 ( ) ;

  m o d e l 2 = new M o d e l 2 ( ) ;

l s t . s e t M o d e l ( m o d e l 1 ) ;

p a c k ( ) ;

}

p u bl i c v o id a c t i on P e r fo r m e d ( A c t io n E v en t e ) {

if ( t ip Mo de l = = 1) {

l s t . s e t M o d e l ( m o d e l 2 ) ;

t i pM o de l = 2 ;

}else {

l s t . s e t M o d e l ( m o d e l 1 ) ;

t i pM o de l = 1 ;

}

}

15

8/8/2019 Копия swing_slide

http://slidepdf.com/reader/full/-swingslide 16/42

/ / C l a se l e c o r e sp u n z at o a r e c e lo r d o ua m o d el e

class Model1 extends A b s t ra c t L is t M o de l {

p u bl i c i n t g e t Si z e ( ) {

return d a t a 1 . l e n g t h ;

}

public O b je c t g e t E le m e n tA t ( in t i nd ex ) {

return d a t a 1 [ i n d e x ] ;

}

}

class Model2 extends A b s t ra c t L is t M o de l {

p u bl i c i n t g e t Si z e ( ) {

return d a t a 2 . l e n g t h ;

}public O b je c t g e t E le m e n tA t ( in t i nd ex ) {

return d a t a 2 [ i n d e x ] ;

}

}

}

p u bl i c c l as s T e s tM o d el {

p u bl i c s t a ti c v o id m a in ( S t r i ng a r gs [ ] ) {

new F e r ea s t ra ( " T e s t M o de l " ) . s h ow ( ) ;

}

}

16

8/8/2019 Копия swing_slide

http://slidepdf.com/reader/full/-swingslide 17/42

Tratarea evenimentelor

1. Informativ (lightweight)ChangeListener - ChangeEvent

Modele: BoundedRangeModel, ButtonModesi SingleSelectionModel

JSlider slider = new JSlider();

BoundedRangeModel model = slider.getModel();

  model.addChangeListener(new ChangeListener() {

public void stateChanged(ChangeEvent e) {

// Sursa este de tip BoundedRangeModel

BoundedRangeModel m =

(BoundedRangeModel)e.getSource();

// Trebuie sa interogam sursa asupra schimbari

System.out.println(

"Schimbare model: " + m.getValue());

}

});

17

8/8/2019 Копия swing_slide

http://slidepdf.com/reader/full/-swingslide 18/42

2. Consistent(statefull)Model Tip Eveniment

ListModel ListDataEvent

ListSelectionModel ListSelectionEvent

ComboBoxModel ListDataEvent

TreeModel TreeModelEvent

TreeSelectionModel TreeSelectionEvent

TableModel TableModelEventTableColumnModel TableColumnModelEvent

Document DocumentEvent

Document UndoableEditEvent

String culori[] = {"rosu", "galben", "albastru");

JList list = new JList(culori);

ListSelectionModel sModel = list.getSelectionModel()

sModel.addListSelectionListener(new ListSelectionListener() {

public void valueChanged(ListSelectionEvent e) {

// Schimbarea este continuta in eveniment

if (!e.getValueIsAdjusting()) {

System.out.println("Selectie curenta: " +

e.getFirstIndex());

}}

});

18

8/8/2019 Копия swing_slide

http://slidepdf.com/reader/full/-swingslide 19/42

Folosirea componentelor

Componente atomice

• Etichete: JLabel

• Butoane simple sau cu doua stari:JButton, JCheckBox, JRadioButton,

JToggleButton;

• Componente pentru progres si deru-lare: JSlider, JProgressBar, JScroll

• Separatori: JSeparator

19

8/8/2019 Копия swing_slide

http://slidepdf.com/reader/full/-swingslide 20/42

Componente editare de text

Facilitati: undo si redo, tratarea eveni-mentelor generate de cursor (caret), etc.

Arhitectura JTextComponent:

• Model - Document

• Reprezentare

• ’Controller’ - editor kit 

20

8/8/2019 Копия swing_slide

http://slidepdf.com/reader/full/-swingslide 21/42

Tratarea evenimentelor

• ActionEventActionListener

- actionPerformed

• CaretEventCaretListener

- caretUpdate

• DocumentEventDocumentListener

– insertUpdate

– removeUpdate

– changedUpdate

• PropertyChangeEvent

PropertyChangeListener- propertyChange

21

8/8/2019 Копия swing_slide

http://slidepdf.com/reader/full/-swingslide 22/42

Componente pentru selectare

Clasa JList

Initializarea

Object elemente[] = {"Unu", new Integer(2)};

JList lista = new JList(elemente);

DefaultListModel model = new DefaultListModel();

 model.addElement("Unu");

  model.addElement(new Integer(2));

JList lista = new JList(model);

ModelLista model = new ModelLista();

JList lista = new JList(model);

22

8/8/2019 Копия swing_slide

http://slidepdf.com/reader/full/-swingslide 23/42

Tratarea evenimentelor

class Test implements ListSelectionListener {

...

public Test() {

...

// Stabilim modul de selectie

list.setSelectionMode(

ListSelectionModel.SINGLE_SELECTION);// sau SINGLE_INTERVAL_SELECTION

// MULTIPLE_INTERVAL_SELECTION

// Adaugam un ascultator

ListSelectionModel model = list.getSelectionModel

 model.addListSelectionListener(this);

...}

public void valueChanged(ListSelectionEvent e) {

if (e.getValueIsAdjusting()) return;

int index = list.getSelectedIndex();

...

}}

23

8/8/2019 Копия swing_slide

http://slidepdf.com/reader/full/-swingslide 24/42

Obiecte de tip Renderer

Un renderer este responsabil cu afisareaarticolelor unei componente.

class MyCellRenderer extends JLabel

implements ListCellRenderer {

public MyCellRenderer() {

setOpaque(true);

}

public Component getListCellRendererComponent(

JList list, Object value, int index,

boolean isSelected, boolean cellHasFocus) {

setText(value.toString());setBackground(isSelected ?

Color.red : Color.white);

setForeground(isSelected ?

Color.white : Color.black);

return this;

}

}...

list.setCellRenderer(new MyCellRenderer());

24

8/8/2019 Копия swing_slide

http://slidepdf.com/reader/full/-swingslide 25/42

Clasa JComboBox

Clasa JSpinner

25

8/8/2019 Копия swing_slide

http://slidepdf.com/reader/full/-swingslide 26/42

Tabele

Initializarea

String[] coloane = {"Nume", "Varsta", "Student"};

Object[][] elemente = {

{"Ionescu", new Integer(20), Boolean.TRUE},

{"Popescu", new Integer(80), Boolean.FALSE}};JTable tabel = new JTable(elemente, coloane);

26

8/8/2019 Копия swing_slide

http://slidepdf.com/reader/full/-swingslide 27/42

Folosirea unui model

ModelTabel model = new ModelTabel();

JTable tabel = new JTable(model);

...

class ModelTabel extends AbstractTableModel {

String[] coloane = {"Nume", "Varsta", "Student"}

Object[][] elemente = {

{"Ionescu", new Integer(20), Boolean.TRUE},{"Popescu", new Integer(80), Boolean.FALSE}};

public int getColumnCount() {return coloane.lengt

public int getRowCount() {return elemente.length

public Object getValueAt(int row, int col) {

return elemente[row][col];

}public String getColumnName(int col) {

return coloane[col];

}

public boolean isCellEditable(int row, int col) {

// Doar numele este editabil

return (col == 0);

}}

27

8/8/2019 Копия swing_slide

http://slidepdf.com/reader/full/-swingslide 28/42

Tratarea evenimentelor

1. Generate de editarea celulelor

public class Listener implements TableModelListener {

public void tableChanged(TableModelEvent e) {

// Aflam celula care a fost modificata

int row = e.getFirstRow();

int col = e.getColumn();TableModel model = (TableModel)e.getSource();

Object data = model.getValueAt(row, col);

...

}

}

...

tabel.getModel().addTableModelListener(new Listener

28

8/8/2019 Копия swing_slide

http://slidepdf.com/reader/full/-swingslide 29/42

2. Generate de selectarea lini-ilor

class Listener implements ListSelectionListener {

public void valueChanged(ListSelectionEvent e) {

if (e.getValueIsAdjusting()) return;

ListSelectionModel model =

(ListSelectionModel)e.getSource();

if (model.isSelectionEmpty()) {

// Nu este nici o linie selectata

...

} else {

int index = model.getMinSelectionIndex();

// Linia cu numarul index este prima selectata

...

}

}

}

...

tabel.setSelectionMode(

ListSelectionModel.SINGLE_SELECTION);

ListSelectionModel model = tabel.getSelectionMode

 model.addListSelectionListener(new Listener());

29

8/8/2019 Копия swing_slide

http://slidepdf.com/reader/full/-swingslide 30/42

Folosirea unui renderer

public class MyRenderer extends JLabel

implements TableCellRenderer {

public Component getTableCellRendererComponent(...

...

return this;

}

}

Folosirea unui editorpublic class MyEditor

extends AbstractCellEditor

implements TableCellEditor {

public Object getCellEditorValue() {// Returneaza valoarea editata

...

}

public Component

getTableCellEditorComponent(...) {

// Returneaza componenta de tip editor

...}

}

30

8/8/2019 Копия swing_slide

http://slidepdf.com/reader/full/-swingslide 31/42

Arbori

String text = "<html><b>Radacina</b></html>";

DefaultMutableTreeNode root =

new DefaultMutableTreeNode(text);

DefaultMutableTreeNode numere =

new DefaultMutableTreeNode("Numere");

DefaultMutableTreeNode siruri =

new DefaultMutableTreeNode("Siruri");for(int i=0; i<3; i++) {

numere.add(

new DefaultMutableTreeNode(new Integer(i)));

siruri.add(

new DefaultMutableTreeNode("Sirul " + i));

}

root.add(numere);root.add(siruri);

JTree tree = new JTree(root);

31

8/8/2019 Копия swing_slide

http://slidepdf.com/reader/full/-swingslide 32/42

Tratarea evenimentelor

class Listener implements TreeSelectionListener {

public void valueChanged(TreeSelectionEvent e) {

// Obtinem nodul selectat

DefaultMutableTreeNode node =

(DefaultMutableTreeNode)

tree.getLastSelectedPathComponent();

if (node == null) return;

// Obtinem informatia din nod

Object nodeInfo = node.getUserObject();

...

}

}

...// Stabilim modul de selectie

tree.getSelectionModel().setSelectionMode(

TreeSelectionModel.SINGLE_TREE_SELECTION);

// Adaugam un ascultator

tree.addTreeSelectionListener(new Listener());

32

8/8/2019 Копия swing_slide

http://slidepdf.com/reader/full/-swingslide 33/42

Personalizarea nodurilor

TreeCellRenderer

• setRootVisible

setShowsRootHandles• putClientProperty

tree.putClientProperty("JTree.lineStyle", "Angled

// sau "Horizontal", "None"

• Specificarea unei iconite

ImageIcon leaf = createImageIcon("img/leaf.gif"

ImageIcon open = createImageIcon("img/open.gif"

ImageIcon closed = createImageIcon("img/closed.

DefaultTreeCellRenderer renderer =

new DefaultTreeCellRenderer();

renderer.setLeafIcon(leaf);

renderer.setOpenIcon(open);

renderer.setClosedIcon(closed);

tree.setCellRenderer(renderer);

33

8/8/2019 Копия swing_slide

http://slidepdf.com/reader/full/-swingslide 34/42

Containere

1. Containere de nivel ınalt - JFrame,JDialog, JApplet

2. Containere intermediare

– JPanel

– JScrollPane

– JTabbedPane

– JSplitPane

– JLayeredPane– JDesktopPane

– JRootPane

34

8/8/2019 Копия swing_slide

http://slidepdf.com/reader/full/-swingslide 35/42

JPanel

Permite gruparea componentelor.

JPanel p = new JPanel(new BorderLayout());

/* Preferabil, deoarece nu mai este construit si

un obiect de tip FlowLayout (implicit)*/

p.add(new JLabel("Hello"));

p.add(new JButton("OK"));

...

35

8/8/2019 Копия swing_slide

http://slidepdf.com/reader/full/-swingslide 36/42

JScrollPane

Ofera suport pentru derulare

String elemente[] = new String[100];

for(int i=0; i<100; i++)

elemente[i] = "Elementul " + i;

JList lista = new JList(elemente);

JScrollPane sp = new JScrollPane(lista);

frame.getContentPane().add(sp);

36

8/8/2019 Копия swing_slide

http://slidepdf.com/reader/full/-swingslide 37/42

JTabbedPane

Permite suprapunerea mai multorcontainere.

JTabbedPane tabbedPane = new JTabbedPane();

ImageIcon icon = new ImageIcon("smiley.gif");

JComponent panel1 = new JPanel();

panel1.setOpaque(true);

panel1.add(new JLabel("Hello"));

tabbedPane.addTab("Tab 1", icon, panel1,

"Aici avem o eticheta");

tabbedPane.setMnemonicAt(0, KeyEvent.VK_1);

JComponent panel2 = new JPanel();

...

37

8/8/2019 Копия swing_slide

http://slidepdf.com/reader/full/-swingslide 38/42

JSplitPane

Ofera suport pentru separarea com-ponentelor.

JList list;

JPanel panel;

JTextArea text;

...

JSplitPane sp1 = new JSplitPane(

JSplitPane.HORIZONTAL_SPLIT, list, panel);

JSplitPane sp2 = new JSplitPane(

JSplitPane.VERTICAL_SPLIT, sp1, text);

frame.getContentPane().add(sp2);

38

8/8/2019 Копия swing_slide

http://slidepdf.com/reader/full/-swingslide 39/42

Dialoguri - Clasa JDialog

• JOptionPane

JOptionPane.showMessageDialog(frame,

"Eroare de sistem !", "Eroare",

JOptionPane.ERROR_MESSAGE);

JOptionPane.showConfirmDialog(frame,

"Doriti inchiderea aplicatiei ? ", "Intreba

JOptionPane.YES_NO_OPTION,

JOptionPane.QUESTION_MESSAGE);

• JFileChooser

• JColorChooser

• ProgressMonitor

39

8/8/2019 Копия swing_slide

http://slidepdf.com/reader/full/-swingslide 40/42

Desenarea

Metoda paint e responsabila cu:

• paintComponent

• paintBorder

• paintChildern

• ”double-buffering”

Afisarea imaginilor

ImageIcon img = new ImageIcon("smiley.gif");

JLabel label = new JLabel(img);

TransparentaPermite crearea de componente care nuau forma rectangulara.

40

8/8/2019 Копия swing_slide

http://slidepdf.com/reader/full/-swingslide 41/42

Dimensiunile componentelorInsets insets = getInsets();

int currentWidth = getWidth() -

insets.left - insets.right;

int currentHeight = getHeight() -

insets.top - insets.bottom;

Contexte graficepublic void paintComponent(Graphics g) {

Graphics2D g2d = (Graphics2D)g;

// Desenam apoi cu g2d

// g este refolosit !!

// 1. Revenirea la starea initialag2d.translate(x, y); // modificam contexul

...

g2d.translate(-x, -y); // revenim la starea initial

// 2. Folosirea unei copii

Graphics2D g2d = (Graphics2D)g.create();

g2d.translate(x, y);...

g2d.dispose();

41

8/8/2019 Копия swing_slide

http://slidepdf.com/reader/full/-swingslide 42/42

Look and Feel

• javax.swing.plaf.metal.MetalLookAndFeel

• com.sun.java.swing.plaf.windows.WindowsLookAndFee

• com.sun.java.swing.plaf.mac.MacLookAndFeel

com.sun.java.swing.plaf.motif.MotifLookAndFeel• com.sun.java.swing.plaf.gtk.GTKLookAndFeel

UIManager.setLookAndFeel(

"com.sun.java.swing.plaf.motif.MotifLookAndFeel");

SwingUtilities.updateComponentTreeUI(f);

f.pack();

java -Dswing.defaultlaf=

com.sun.java.swing.plaf.gtk.GTKLookAndFeel App

// In lib/swing.properties

# Swing properties

swing.defaultlaf=

com.sun.java.swing.plaf.windows.WindowsLookAndFeel