VIII. Limbajul JAVA – Interfete grafice.Swing
1. Interfete grafice
Mod text: ecranul = o matrice de caractere
Mod grafic: ecranul = o matrice de puncte
GUI –Graphical User Interface
O interfata GUI contine widgets (elemente grafice de control)
Interactiunea se realizeaza prin mouse si tastatura
Interfetele se bazeaza pe conceptul de fereastra –o zona dreptunghiulara asociata pe monitor unei aplicatii
O interfata grafica se creaza de obicei cu sprijinul sitemului de operare (o componenta numita server grafic)
Limbajul Java pune la dispozitia programatorului doua biblioteci pentru realizarea unei interfete grafice:
java.AWT
javax.swing
2. Swing
Pachetul swing contine clase pentru gestionarea completa a unei interfete.
In figura de mai jos sunt expuse clasele corespondente cu cele din AWT
In figura de mai jos sunt prezentate clasele noi introduse de catre swing
3. Ferestre
Oricarei aplicatii grafice ii corespunde o fereastra principala (de tip FRAME) si una sau mai multe ferestre aditionale
In swing exista trei clase pentru gestionarea ferestrelor: Jframe, JWindow si JDialog
Clasa JFrame permite crearea unei ferestre de aplicatie SDI careare o bara de titlu, o margine, butoane de minimizare, maximizare si inchidere
Clasa JWindow permite crearea unei ferestre fara bara de titlu, meniu, butoane sistem etc.
Clasa JDialog permite crearea de ferestre de dialog
- Ferestrele de dialog sunt dependente de ferestrele parinte de tip Frame
- Pentru a crea ferestre de afisare a unor mesaje se poate utiliza direct o functie statica, fara a mai crea explicit un obiect tip dialog:
JOptionPane.showMessageDialog(frame, “Mesajul meu.");
- Pentru dialoguri standard exista clase specializate: JFileChooser si JColorChooser
Crearea unei ferestre principale:
public static void main(String args[]) { JFrame win = new JFrame(“Titlul ferestrei"); win.setSize(200, 200); win.show(); }
Pentru a accesa continutul unei ferestre se va folosi functia getContentPanel():
Container c = win.getContentPane();
4. Button.CheckBox
4.1 Butoane:
JButton button = new JButton("I'm a Swing button!"); button.setMnemonic('i');
4.2 CheckBox:
cb1 = new JCheckBox(“Optiune1"); cb1.setMnemonic(KeyEvent.VK_1); cb1.setSelected(true); JPanel checkPanel = new JPanel(); checkPanel.setLayout(new GridLayout(0, 1)); checkPanel.add(cb1);
4.3 RadioButton
// Create the radio buttons. JRadioButton birdButton = new JRadioButton(“Pasare”); birdButton.setMnemonic(KeyEvent.VK_B); birdButton.setActionCommand(“Pasare”); birdButton.setSelected(true); JRadioButton catButton = new JRadioButton(“Pisica”); catButton.setMnemonic(KeyEvent.VK_C); catButton.setActionCommand(“Pisica”); … // Group the radio buttons. ButtonGroup group = new ButtonGroup(); group.add(birdButton); group.add(catButton); … // Put the radio buttons in a column in a panel JPanel radioPanel = new JPanel(); radioPanel.setLayout(new GridLayout(0, 1)); radioPanel.add(birdButton); radioPanel.add(catButton);
4.4 ListBox, ComboBox
listModel = new DefaultListModel(); listModel.addElement(“Linie1"); … list = new JList(listModel); list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); list.setSelectedIndex(0); JScrollPane listScrollPane = new JScrollPane(list); -------- String[] culori = { "Alb", "Negru", "Rosu", "Verde", "Albastru" }; JComboBox listaCulori = new JComboBox(culori); listaCulori.setSelectedIndex(1);// selecteaza elementul 2 (Negru) listaCulori.setEditable(true);
4.5 Look and Feel
Specifica modul de desenare a interfetei
static String metalClassName = "javax.swing.plaf.metal.MetalLookAndFeel"; static String motifClassName = "com.sun.java.swing.plaf.motif.MotifLookAndFeel"; static String windowsClassName = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel"; JFrame frame = new JFrame(“Aplicatie Swing”); try { UIManager.setLookAndFeel(metalClassName); SwingUtilities.updateComponentTreeUI(frame); frame.pack(); } catch (Exception exc) { System.err.println(“Error setingLookAndFeel "); }
4.6 Gestionarea evenimentelor
Aplicatiile GUI sunt aplicatii orientate pe evenimente
In gestionarea evenimentelor intervin obiecte de tip Listener siEvent
Exceptie: pentru a trata evenimentul close pentru o fereastra tip JFrame:
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE);
Pentru a trata evenimente trebuie:
- Implementata o clasa derivata dintr-o clasa Listner
public class MyClass implements XXXListener { public void eveniment(XXXEvent e) { ...//tratarea evenimentului... }
- Inregistrata o instanta a clasei precedente pe post de listner pentru o componenta derivata din JComponent
oComponenta.addActionListener(instanceOfMyClass);
/** Listens to the button. */ class ListenerPtButon implements ActionListener { private int numClicks = 0; public void actionPerformed(ActionEvent e) { numClicks++; ((JButton)e.getSource()).setText(“Apasat: “ + numClicks); } } JButton butonulMeu = new JButton(“Apasa: 0”); butonulMeu. addActionListener(new ListenerPtButon()); /** Listens to the check boxes. */ class CheckBoxListener implements ItemListener { public void itemStateChanged(ItemEvent e) { JCheckBox butonSelectat = (JCheckBox)e.getSource(); String actionCommand = butonSelectat.getActionCommand(); if (actionCommand == “box1”) { // prelucreaza check box1 } else if (actionCommand == “box2”) { // prelucreaza check box2 } else … if (e.getStateChange() == ItemEvent.DESELECTED) // s-a deselectat } } /** Listens to the radio buttons. */ class RadioListener implements ActionListener { public void actionPerformed(ActionEvent e) { String actionCommand = e.getActionCommand(); System.out.println(“Selectat:”+actionCommand); if (actionCommand.equals(“radio1”)) // prelucreaza radio1 else if (actionCommand.equals(“radio2”)) // prelucreaza radio2 else … } }
4.7 Aranjarea componentelor
Layout Manages -pentru a aranja componente pe suprafata unui container
Stabileste pozitia si dimensiunea de afisare a componentelor
Exista implementati cinci manageri:
- BorderLayout
- BoxLayout
- FlowLayout
- GridBagLayout
- GridLayout
container.setLayout(layoutManager)
JPanel pane = new JPanel(); pane.setLayout(new BorderLayout());
Pentru BoxLayoutse pot stabili:
- limite pentru fiecare componenta prin setMinimumSize(), setPreferredSize() si setMaximumSize();
- alinieri prin pentru fiecare componenta prin setAlignmentX() si setAlignmentY()
Obs: metodele se aplica componentelor
Pentru a stabili spatii de dimensiune fixa intre componente se pot insera componente invizibile (create prin metoda statica a clasei
Box –createRigidArea(dimensiune)): container.add(componenta1); container.add(Box.createRigidArea( new Dimension(0, spatiuVertical))); container.add(componenta1); container.add(Box.createRigidArea( new Dimension(spatiuOrizontal, 0)));
Pentru a stabili spatii de dimensiune variabila intre componente se pot insera componente invizibile de tip Glue (create prin metode statice ale clasei Box -createHorizontalGlue() si createVericalGlue()):
- container.add(componenta1);
- container.add(Box.createHorizontalGlue());
- container.add(componenta1);
- container.add(Box.createVerticalGlue());
Pentru a stabili spatii (borduri) in jurul componetelor unui container se va folosi metoda setBorder a containerului:
container.setBorder( BorderFactory.createEmptyBorder(0, 10, 10, 10));
Metode statice pentru crearea bordurilor ale clasei BorderFactory :
- createEmptyBorder(),
- createLineBorder(), createEtchedBorder(),
- createRaisedBevelBorder(),
- createMatteBorder(),
- createTitledBorder()