Page 1
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
Page 2
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
Page 3
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
Page 4
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
Page 5
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
Page 6
8/8/2019 Копия swing_slide
http://slidepdf.com/reader/full/-swingslide 6/42
Page 7
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
Page 8
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
Page 9
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
Page 10
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
Page 11
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
Page 12
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
Page 13
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
Page 14
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
Page 15
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
Page 16
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
Page 17
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
Page 18
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
Page 19
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
Page 20
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
Page 21
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
Page 22
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
Page 23
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
Page 24
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
Page 25
8/8/2019 Копия swing_slide
http://slidepdf.com/reader/full/-swingslide 25/42
Clasa JComboBox
Clasa JSpinner
25
Page 26
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
Page 27
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
Page 28
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
Page 29
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
Page 30
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
Page 31
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
Page 32
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
Page 33
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
Page 34
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
Page 35
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
Page 36
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
Page 37
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
Page 38
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
Page 39
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
Page 40
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
Page 41
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
Page 42
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