INTERFACES GRAPHIQUES EN JAVA - DEUXIEME PARTIE

Point de départ

Nous démarrons le TP à partir du code étudié dans le TP 3, permettant d'afficher une fenêtre.

Pour rappel, la classe contenant la méthode main() :

public class Test {
  public static void main(String[] args) {
    Fenetre fen = new Fenetre();
  }
}

La classe Fenetre :

import javax.swing.JFrame;
public class Fenetre extends JFrame {
  public Fenetre(){
    this.setTitle("Première fenêtre");
    this.setSize(400, 200);
    this.setLocationRelativeTo(null);                
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    this.setContentPane(new Panneau());
    this.setVisible(true);
  }
}

Et la classe Panneau :

import javax.swing.JPanel;
import java.awt.Color;
public class Panneau extends JPanel {
  public Panneau() {
    setBackground(Color.GREEN); //Définition de la couleur de fond
  }
}

Ajouter des boutons

Placer des boutons sur le panneau

Tester le code ci-dessous. Il faut importer la classe JButton, présente dans le package javax.swing. La classe Panneau est donc modifiée. Dans le code ci-dessous, les objets bouton1 et bouton2 sont créés à partir de cette classe. Ils sont ensuite insérés dans le panneau à l'aide de la fonction add().

import javax.swing.JPanel;
import javax.swing.JButton;
import java.awt.Color;
public class Panneau extends JPanel {
  JButton bouton1;
  JButton bouton2;
  public Panneau() {
    bouton1 = new JButton("Mon bouton 1");
    bouton2 = new JButton("Mon bouton 2");
    setBackground(Color.GREEN); //Définition de la couleur de fond
    add(bouton1);
    add(bouton2);
  }
}

Agir sur les boutons

Tester le code ci-dessous. Il faut importer les classes ActionEvent et ActionListener, présentes dans le package java.awt.event. La classe Panneau est modifiée pour prendre en compte les actions sur les boutons.

import javax.swing.JPanel;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Panneau extends JPanel implements ActionListener {
  JButton bouton1;
  JButton bouton2;
  public Panneau() {
    bouton1 = new JButton("Mon bouton 1");
    bouton2 = new JButton("Mon bouton 2");
    setBackground(Color.GREEN); //Définition de la couleur de fond
    add(bouton1);
    add(bouton2);
    bouton1.addActionListener(this);
    bouton2.addActionListener(this);
  }
  public void actionPerformed(ActionEvent e) {
    if (e.getSource() == bouton1) { System.out.println("Vous avez cliqué sur le bouton 1!"); }
    if (e.getSource() == bouton2) {
      JOptionPane.showConfirmDialog(null,
      "Vous avez cliqué sur le bouton 2!", "TEST", JOptionPane.PLAIN_MESSAGE); 
    }
  }
}

La méthode showConfirmDialog() de cette classe prend quatre paramètres :

Dessiner avec les boutons

Tester le code ci-dessous. On retrouve la classe Graphics, présente dans le package java.awt. On distingue deux fonctions, l'une pour dessiner un rond rouge, et l'autre pour dessiner une carré bleu. La variable dessin et la fonction repaint() nous permet de changer de dessin en cliquant sur les boutons.

import javax.swing.JPanel;
import javax.swing.JButton;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Panneau extends JPanel implements ActionListener {
  String dessin;
  JButton bouton1;
  JButton bouton2;
  public Panneau() {
    dessin="rouge";
    bouton1 = new JButton("Mon bouton 1");
    bouton2 = new JButton("Mon bouton 2");
    setBackground(Color.GREEN); //Définition de la couleur de fond
    add(bouton1);
    add(bouton2);
      bouton1.addActionListener(this);
      bouton2.addActionListener(this);
  }
  public void actionPerformed(ActionEvent e) {
    if (e.getSource() == bouton1) {
      dessin="rouge";
      this.repaint();
  }
    if (e.getSource() == bouton2) {
      dessin="bleu";
      this.repaint();
    }
  }
  public void rondrouge(Graphics g) {
    g.setColor(Color.RED);  
    g.fillOval(90, 60, 80, 80);
  }
  public void carrebleu(Graphics g) {
    g.setColor(Color.BLUE);  
    g.fillRect(230, 60, 80, 80);
  }
  public void paintComponent(Graphics g) {
    super.paintComponent(g);
    if ( dessin.equals("rouge") ) rondrouge(g);
    if ( dessin.equals("bleu") ) carrebleu(g);
  }
}

Des boutons, des champs textuels et des textes

Insérer les éléments de contrôles graphiques

Tester le code ci-dessous. Nous avons vu comment placer des boutons. De la même manière, nous pouvons placer des champs textuels et des textes. Ces éléments proviennent des classes JTextField et JList, présentes dans le package javax.swing. L'exemple proposé est celui d'une calculatrice basique.

La classe Panneau devient :

import javax.swing.*;
import java.awt.Color;
public class Panneau extends JPanel {
  JLabel label1;
  JTextField entree1;
  JLabel label2;
  JTextField entree2;
  JLabel label3;
  JTextField resultat;
  JButton lancer;
  public Panneau() {
    label1 = new JLabel("Nombre 1 :");
    entree1 = new JTextField(10);
    label2 = new JLabel("Nombre 2 :");
    entree2 = new JTextField(10);
    label3 = new JLabel("Somme :");
    resultat = new JTextField(10);
    lancer = new JButton("Ajouter");
    setBackground(Color.GREEN); //Définition de la couleur de fond
    add(label1);
    add(entree1);
    add(label2);
    add(entree2);
    add(label3);
    add(resultat);
    add(lancer);
  }
}

Utiliser les éléments de contrôles graphiques

Compléter le code ci-dessus afin que cette calculatrice basique fonctionne.

Pour récupérer la valeur entrée par l'utilisateur dans un champ textuel, entree1 par exemple :

String texte1=entree1.getText();

Pour insérer la valeur "123" dans le champ textuel resultat :

resultat.setText("123");

Pour convertir une chaîne de caractères en un nombre :

double un_nombre = Double.parseDouble(un_texte);

Pour convertir un nombre en une chaîne de caractères :

String un_texte = Double.toString(un_nombre);

Positionner les éléments de contrôles graphiques

Il existe plusieurs solutions pour le faire :

Il existe de nombreux gestionnaires de placement, en voici quelques-uns :

Positionnement absolu

Tester le positionnement absolu. Après avoir annulé le gestionnaire de placement, les composants sont positionnés un à un.

setLayout(null);
label1.setBounds(10, 10, 100, 20);
entree1.setBounds(90, 10, 100, 20);
label2.setBounds(230, 10, 100, 20);
entree2.setBounds(310, 10, 100, 20);
lancer.setBounds(50, 40, 100, 20);
label3.setBounds(170, 40, 100, 20);
resultat.setBounds(240, 40, 100, 20);

Gestionnaire de placement GridLayout

Tester le gestionnaire GridLayout. Après avoir importé la classe GridLayout présente dans le package java.awt, on ajoute les lignes ci-dessous. Ici, la grille comporte quatre lignes et deux colonnes (il reste une cellule vide).

GridLayout disposition = new GridLayout(4,2);
setLayout(disposition);

Application

Etude préliminaire

Rechercher, sur internet, une solution pour évaluer une expression en Java. Proposer un premier programme demandant d'entrer un calcul et donnant son résultat.

Veuillez entrer votre calcul : 3*4-5
Résultat du calcul : 7

En modifiant ce premier programme, écrire un deuxième programme demandant d'entrer :

Le programme retournera ensuite le résultat du calcul effectué.

Veuillez entrer votre fonction. f(x) = : 3*x-5
Entrez la valeur de la variable. x = : 4
Résultat du calcul : 7

On pourra utiliser la méthode replace() pour remplacer la variable x par sa valeur.

Exemple d'utilisation de la méthode replace() :

String texte = "lang=gb";
String nouveau_texte = texte.replace('gb', 'fr');

Travail demandé

Réalisez un traceur de courbes explicites planes en coordonnées cartésiennes.

Le programme doit demander d'entrer :

Le clic sur le bouton TRACER permet d'obtenir la courbe demandée.