LECON 317


Ce que vous pouvez voir en plus
Il faut être honnête, vous avez vu une bonne partie des objets graphiques proposés par Java. Il en reste bien d'autres, mais le fonctionnement de ceux-ci ne devraient pas vous poser trop de problèmes maintenant que vous êtes initiés à la programmation événementielle...

Je vous propose de faire un tour d'horizon de certains autres objets dont vous pourriez avoir besoin.
Ceux-ci seront accompagnés d'un code facile à comprendre ainsi que d'une brève description !

En avant pour le dernier chapitre de ce tuto Java !
Sommaire du chapitre :

  • D'autres conteneurs graphiques
  • D'autres objets graphiques
  • Enjoliver vos IHM

D'autres conteneurs graphiques

Voici quelques objets que vous pourrez trouver sur votre passage.

Le JWindow

Pour faire simple, c'est une JFrame mais sans les contours de fenêtre permettant de réduire, fermer ou agrandir ! Souvent utiliser pour faire des splash screen : la même chose que vous avez au lancement d'Eclipse...



Code source :

import java.awt.Color;

import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JWindow;
import javax.swing.border.BevelBorder;


public class Window extends JWindow{

                public static void main(String[] args){
                               Window wind = new Window();
                               wind.setVisible(true);
                }
               
                public Window(){
                              
                               setSize(220, 165);
                               setLocationRelativeTo(null);
                              
                               JPanel pan = new JPanel();
                               JLabel img = new JLabel(new ImageIcon("planète.jpeg"));
                               img.setVerticalAlignment(JLabel.CENTER);
                               img.setHorizontalAlignment(JLabel.CENTER);
                              
                               pan.setBorder(BorderFactory.createLineBorder(Color.blue));
                               pan.add(img);
                               getContentPane().add(pan);
                }
}


Le JDesktopPane combiné à des JInternalFrame

Ces deux objets sont très souvent associés et permettent de faire des applications multi-fenêtres !


Code source :

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JInternalFrame;


public class Bureau extends JFrame{

                private static int nbreFenetre = 0;
                private JDesktopPane desktop = new JDesktopPane();
                private static int xy = 10;
               
                public Bureau(){
                               this.setSize(400, 300);
                               this.setLocationRelativeTo(null);
                               this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                               JButton ajouter = new JButton("Ajouter une fenêtre interne");
                               ajouter.addActionListener(new ActionListener(){
                                               public void actionPerformed(ActionEvent event){
                                                               ++nbreFenetre;
                                                               xy += 2;
                                                               desktop.add(new MiniFenetre(nbreFenetre), nbreFenetre);
                                               }
                               });

                               this.getContentPane().add(desktop, BorderLayout.CENTER);
                               this.getContentPane().add(ajouter, BorderLayout.SOUTH);
                                                              
                }
               
                class MiniFenetre extends JInternalFrame{
                              
                              
                              
                               public MiniFenetre(int nbre){
                                               this.setTitle("Fenetre N°"+nbre);
                                               this.setClosable(true);
                                               this.setResizable(true);
                                               this.setSize(150, 80);
                                               this.setLocation(xy, xy);
                                               this.setVisible(true);
                               }                             
                }
               
                public static void main(String[] args){
                               Bureau bureau = new Bureau();
                               bureau.setVisible(true);
                }
               
}

D'autres objets graphiques

Voici un objet sympa mais quelque peu limité par la façon dont il gère son contenu HTML !

Le JEditorPane

Il permet de réaliser des textes riches avec mise en page.
Il y a aussi le JTextPane qui vous permet de faire un mini-éditeur de texte très facilement (enfin, tout est relatif...).



Code source de cette fenêtre :

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.text.html.HTMLEditorKit;


public class Fenetre extends JFrame {

                private JEditorPane editorPane, apercu;
                private JTabbedPane onglet = new JTabbedPane();
               
                public Fenetre(){
                              
                               this.setSize(600, 400);
                               this.setTitle("Conteneur éditable");
                               this.setLocationRelativeTo(null);
                               this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                                                              
                               editorPane = new JEditorPane();
                               editorPane.setText("<HTML>\n<HEAD></HEAD>\n<BODY>\n\n</BODY>\n</HTML>");
                              
                               apercu = new JEditorPane();
                               apercu.setEditable(false);
                              
                               onglet.addTab("Editeur HTML", new JScrollPane(editorPane));
                               onglet.addTab("Aperçu", new JScrollPane(apercu));
                               onglet.addChangeListener(new ChangeListener(){

                                               public void stateChanged(ChangeEvent e) {
                                                              
                                                               FileWriter fw = null;
                                                              
                                                               try {
                                                                              fw = new FileWriter(new File("tmp/tmp.html"));
                                                                              fw.write(editorPane.getText());
                                                                              fw.close();
                                                               } catch (FileNotFoundException e1) {
                                                                              // TODO Auto-generated catch block
                                                                              e1.printStackTrace();
                                                               } catch (IOException e1) {
                                                                              // TODO Auto-generated catch block
                                                                              e1.printStackTrace();
                                                               }
                                                               //*
                                                               try {
                                                                              File file = new File("tmp/tmp.html");
                                                                              apercu.setEditorKit(new HTMLEditorKit());                                                                      
                                                                              apercu.setPage(file.toURL());
                                                                                                                                                            
                                                               } catch (IOException e1) {
                                                                              // TODO Auto-generated catch block
                                                                              e1.printStackTrace();
                                                               }
                                                              
                                               }                                                            
                               });
                              
                               this.getContentPane().add(onglet, BorderLayout.CENTER);
                               this.setVisible(true);
                }
               
                public static void main(String[] args){
                               Fenetre fen = new Fenetre();
                }
               
}


Le JSlider

Celui-ci est un outil qui vous permet d'utiliser un système de mesure pour une application : re-dimensionner une image, choisir le tempo d'un morceau de musique, l'opacité d'une couleur...


Code source :

import java.awt.BorderLayout;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;


public class Slide extends JFrame{

                private JLabel label = new JLabel("Valeur actuelle : 30");
               
                public Slide(){
                               this.setSize(250, 150);
                               this.setTitle("Slider");
                               this.setLocationRelativeTo(null);
                               this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                              
                               JSlider slide = new JSlider();
               
                               slide.setMaximum(100);
                               slide.setMinimum(0);
                               slide.setValue(30);
                               slide.setPaintTicks(true);
                               slide.setPaintLabels(true);
                               slide.setMinorTickSpacing(10);
                               slide.setMajorTickSpacing(20);
                               slide.addChangeListener(new ChangeListener(){
                                               public void stateChanged(ChangeEvent event){
                                                               label.setText("Valeur actuelle : " + ((JSlider)event.getSource()).getValue());
                                               }
                               });
                              
                               this.getContentPane().add(slide, BorderLayout.CENTER);
                               this.getContentPane().add(label, BorderLayout.SOUTH);
                              
                }
               
                public static void main(String[] args){
                               Slide slide = new Slide();
                               slide.setVisible(true);
                }
               
}



La JProgessBar

Elle vous permet de réaliser une barre de progression pour des traitements longs.





Code source :


import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JProgressBar;

public class Progress extends JFrame{

                private Thread t;
                private JProgressBar bar;
                private JButton launch ;
               
                public Progress(){
                              
                               this.setSize(300, 80);
                               this.setTitle("*** JProgressBar ***");
                               this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                               this.setLocationRelativeTo(null);
                              
                              
                               t = new Thread(new Traitement());
                               bar  = new JProgressBar();
                               bar.setMaximum(500);
                               bar .setMinimum(0);
                               bar.setStringPainted(true);
                              
                               this.getContentPane().add(bar, BorderLayout.CENTER);
                              
                               launch = new JButton("Lancer");
                               launch.addActionListener(new ActionListener(){
                                               public void actionPerformed(ActionEvent event){
                                                               t = new Thread(new Traitement());
                                                               t.start();
                                                              
                                               }
                               });                          
                               this.getContentPane().add(launch, BorderLayout.SOUTH);                      
                               t.start();                             
                               this.setVisible(true);                    
                }
               
                class Traitement implements Runnable{
               
                               public void run(){
                                               launch.setEnabled(false);
                                              
                                               for(int val = 0; val <= 500; val++){
                                                               bar.setValue(val);
                                                               try {
                                                                              t.sleep(10);
                                                               } catch (InterruptedException e) {
                                                                               // TODO Auto-generated catch block
                                                                              e.printStackTrace();
                                                               }
                                               }
                                               launch.setEnabled(true);
                               }             
                }
               
                public static void main(String[] args){
                               Progress p = new Progress();
                }
               
}

La modification des valeurs de cet objet doit se faire dans un thread, sinon vous aurez la barre vide, un temps d'attente puis la barre remplie, mais sans défilement des valeurs !

Enjoliver vos IHM

Nous n'avons pas beaucoup abordé ce point tout au long du tuto, mais je vous laisse découvrir les joyeusetés qu'offre Java en la matière... C'est encore en cherchant les infos dont on a besoin qu'on les retient le mieux !

Voici comment ajouter des bordures à vos composants :


Code source :

import java.awt.Color;
import java.awt.Dimension;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.BevelBorder;
import javax.swing.border.Border;
import javax.swing.border.EtchedBorder;


public class BorderDemo extends JFrame{

                private String[] list = {    "Bevel Border",
                                                                                                                             "Etched Border",
                                                                                                                             "Line Border",
                                                                                                                             "Matted Border",
                                                                                                                             "Raised Bevel Border",
                                                                                                                             "Title Border",
                                                                                                                             "Compound Border"
                                                                                                              };
               
                private Border[] listBorder = {   BorderFactory.createBevelBorder(BevelBorder.LOWERED, Color.black, Color.red),
                                                                                                                                             BorderFactory.createEtchedBorder(Color.BLUE, Color.GRAY),
                                                                                                                                             BorderFactory.createLineBorder(Color.green),
                                                                                                                                             BorderFactory.createMatteBorder(5, 2, 5, 2, Color.MAGENTA),
                                                                                                                                             BorderFactory.createRaisedBevelBorder(),
                                                                                                                                             BorderFactory.createTitledBorder("Titre"),
                                                                                                                                             BorderFactory.createCompoundBorder(
                                                                                                                                                                             BorderFactory.createBevelBorder(BevelBorder.LOWERED, Color.black, Color.blue),
                                                                                                                                                                            BorderFactory.createMatteBorder(5, 2, 5, 2, Color.MAGENTA)
                                                                                                                                                             )
                                                                                                                             };
               
                public BorderDemo(){
                              
                               this.setTitle("Les bordures font la fête !");
                               this.setLocationRelativeTo(null);
                               this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                               this.setSize(550, 200);
                              
                               JPanel pan = new JPanel();
                               for(int i = 0; i < list.length; i++){
                                              
                                               JLabel lib = new JLabel(list[i]);
                                               lib.setPreferredSize(new Dimension(150, 50));
                                               lib.setBorder(listBorder[i]);
                                               lib.setAlignmentX(JLabel.CENTER);
                                               lib.setHorizontalAlignment(JLabel.CENTER);
                                               pan.add(lib);
                               }
                              
                               this.getContentPane().add(pan);
                }
               
               
               
                public static void main(String[] args){
                               BorderDemo demo = new BorderDemo();
                               demo.setVisible(true);
                }
               
}

Cadeau du chef pour ceux pour auront installé la version 1.6 du JDK



Jouer sur l'opacité de vos composants :
Code source :

import java.awt.BorderLayout;
import java.lang.reflect.Method;

import javax.swing.JFrame;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

import com.sun.awt.AWTUtilities;


public class OpacityWindow extends JFrame{

                private JSlider slide = new JSlider();
                              
                public OpacityWindow(){
               
                               this.setTitle("Transparence !");
                               this.setLocationRelativeTo(null);
                                this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                               this.setSize(300, 150);
                              
                               slide.setMaximum(100);
                               slide.setMinimum(0);
                               slide.setValue(100);
                               slide.setPaintTicks(true);
                               slide.setPaintLabels(true);
                               slide.setMinorTickSpacing(10);
                               slide.setMajorTickSpacing(20);
                               slide.addChangeListener(new Changed(this));

                              
                               this.getContentPane().add(slide, BorderLayout.CENTER);
                               this.setVisible(true);
                               AWTUtilities.setWindowOpacity(this, ((float) slide.getValue()) / 100.0f);
                }
               
               
                public class Changed implements ChangeListener{
                               private JFrame frame;
                               public Changed(JFrame frame){this.frame = frame;}
                               public void stateChanged(ChangeEvent event){
                                               AWTUtilities.setWindowOpacity(this.frame, ((float) slide.getValue()) / 100.0f);
                               }
                }
               
               
                public static void main(String[] args){
                               OpacityWindow ow = new OpacityWindow();
                }
}


Si vous voulez en savoir plus, il y a un article très complet sur le sujet à cette adresse !
J'espère que ce dernier chapitre vous a plu !
Vous avez encore du temps pour apprendre tout ça, ne vous découragez pas.

Voilà : la partie événementielle est terminée... Bonne continuation à tous les ZérOs qui sont arrivés jusqu'ici et qui ont réussi à suivre mon tuto !


0 comments to "LECON 317"

Post a Comment

Powered by Blogger.

About This Blog

Aller au debut de la page