#1 Le 29/10/2012, à 12:51
- yayals
créer un sorte de clavier numerique en JAVA.
Bonjour,
Je me suis lancé depuis peut dans les interfaces graphiques en JAVA (jusque la je ne faisait que des programmes en mode console). J'essaye de développer un petit logiciel pour calculer le PGCD de deux nombres et la je rencontre un petit problème: je ne trouve pas comment faire pour créer une sorte de clavier numérique pour entrer des nombres. Pour l'instant j'ai fais ceci:
Class Main:
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Fenetre fen = new Fenetre();
}
}
Class Fenetre:
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.JLabel;
import javax.swing.JPanel;
public class Fenetre extends JFrame implements ActionListener {
private JButton bouton = new JButton("a++");
private JButton bouton2 = new JButton("b++");
private JButton bouton3 = new JButton("PGCD");
private JPanel container = new JPanel();
private JLabel label = new JLabel("a = 0, b = 0");
int a = 0;
int b = 0;
public Fenetre(){
this.setTitle("Test");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
this.setVisible(true);
this.setSize(300, 100);
container.setLayout(new BorderLayout());
bouton.addActionListener(this);
bouton2.addActionListener(this);
bouton3.addActionListener(this);
JPanel south = new JPanel();
south.add(bouton);
south.add(bouton2);
south.add(bouton3);
container.add(south, BorderLayout.SOUTH);
container.add(label, BorderLayout.NORTH);
this.setContentPane(container);
}
public void actionPerformed(ActionEvent arg0){
if(arg0.getSource() == bouton){
a++;
label.setText("a = "+a+", b = "+b);
}
if(arg0.getSource() == bouton2){
b++;
label.setText("a = "+a+", b = "+b);
}
if(arg0.getSource() == bouton3){
int d;
do{
if(a < b){
int a2 = a;
int b2 = b;
a = b2;
b = a2;
}
d = a - b;
a = b;
b = d;
}while(d != 0);
label.setText("Le PGCD est : "+a);
}
}
}
Si vous essayez vous remarquez sans doute qu'il ne faut pas avoir de trop grands nombre a calculer.
Aidez-moi svp
Merci d'avance
ACER aspire 5740g: Ubuntu 14.04
Hors ligne
#2 Le 29/10/2012, à 13:08
- louis94
Re : créer un sorte de clavier numerique en JAVA.
Bonjour,
Tu peux utiliser deux GridLayout pour placer tes boutons (un « pavé » pour a et un pour b), et quand l'un d'eux est cliqué, faire a = a * 10 + n, où n est le chiffre du bouton cliqué.
Sinon, tu peux aussi utiliser des JTextField ou des JSpinner pour permettre à l'utilisateur d'entrer des valeurs (attention aux exceptions lors du décodage avec les JTextField).
Louis
Hors ligne
#3 Le 29/10/2012, à 18:43
- yayals
Re : créer un sorte de clavier numerique en JAVA.
le JTextField me convient bien mais je ne trouve pas comment faire pour que ma saisie soi obligatoirement un nombre
ACER aspire 5740g: Ubuntu 14.04
Hors ligne
#4 Le 29/10/2012, à 23:11
- louis94
Re : créer un sorte de clavier numerique en JAVA.
Pour imposer à la saisie d'être numérique, il y a deux possibilités :
Tu essaye d'évaluer la valeur en utilisant Integer.parseInt() et tu traites l'exception en cas de valeur non numérique (par exemple en avertissant l'utilisateur que sa saisie est invalide, ou en modifiant la couleur du champ invalide pour 2s) ;
Tu utilises un JFormattedTextField avec un java.text.DecimalFormat.
Louis
Hors ligne
#5 Le 29/10/2012, à 23:18
- yayals
Re : créer un sorte de clavier numerique en JAVA.
Sinon j'arrive bien a utiliser un JTextField. J;arrive aussi a en extraire la chaîne de caractère qui en sort. J'aimerais savoir comment convertir une variable String en int.
j'avais fais ceci:
int a;
try {
Integer a = Integer.parseInt(input1.getText());
} catch (NumberFormatException f) {
System.out.println("La variable String ne contenait pas que des entiers.");
}
Mais la variable qui en sortait était égale a 0. Une idée ?
Dernière modification par yayals (Le 29/10/2012, à 23:22)
ACER aspire 5740g: Ubuntu 14.04
Hors ligne
#6 Le 29/10/2012, à 23:21
- louis94
Re : créer un sorte de clavier numerique en JAVA.
Il ne faut pas de « Integer » devant le a dans le bloc try, sinon Java va créer une nouvelle variable (aussi nommée a) qui sera disponible uniquement dans le bloc.
Hors ligne
#7 Le 29/10/2012, à 23:25
- yayals
Re : créer un sorte de clavier numerique en JAVA.
Genial !
j'ai enlevé le "Integer" et tout fonctionne. je termine le programme et je poste le résultat ICI.
ACER aspire 5740g: Ubuntu 14.04
Hors ligne
#8 Le 29/10/2012, à 23:50
- yayals
Re : créer un sorte de clavier numerique en JAVA.
Voila
Class Main:
public class Main {
public static void main(String[] args) {
Fenetre fen = new Fenetre();
}
}
Class Fenetre:
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class Fenetre extends JFrame implements ActionListener {
private JButton entrer1 = new JButton("Entrer");
private JButton entrer2 = new JButton("Entrer");
private JButton PGCD = new JButton("PGCD");
private JPanel container = new JPanel();
private JLabel label1 = new JLabel("Variable a: 0");
private JLabel label2 = new JLabel("Variable b: 0");
private JLabel labelPG = new JLabel("PGCD: 0");
private JTextField input1 = new JTextField();
private JTextField input2 = new JTextField();
int a;
int b2;
int b;
public Fenetre(){
this.setSize(300, 200);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
this.setVisible(true);
container.setLayout(new GridLayout(4, 3, 5, 5));
container.add(input1);
container.add(input2);
container.add(entrer1);
container.add(entrer2);
container.add(label1);
container.add(label2);
container.add(PGCD);
container.add(labelPG);
entrer1.addActionListener(this);
entrer2.addActionListener(this);
PGCD.addActionListener(this);
this.setContentPane(container);
}
public void actionPerformed(ActionEvent e) {
if(e.getSource() == entrer1){
label1.setText("Variable a: "+(input1.getText() == null ? "" : input1.getText()));
try {
a = Integer.parseInt(input1.getText());
} catch (NumberFormatException f) {
System.out.println("La variable String ne contenait pas que des entiers.");
}
}
if(e.getSource() == entrer2){
label2.setText("Variable b: "+(input2.getText() == null ? "" : input2.getText()));
try {
b2 = Integer.parseInt(input2.getText());
} catch (NumberFormatException f) {
System.out.println("La variable String ne contenait pas que des entiers.");
}
}
if(e.getSource() == PGCD){
b = b2;
int r = 0;
int resultat = 0;
int compteur= 0;
do{
if(compteur >= 1){
a = b;
b = r;
}
resultat = a / b;
r = a - resultat * b;
System.out.println(a+"\t"+b+"\t"+r);
compteur ++;
}while(r != 0);
}
labelPG.setText("PGCD: "+b);
}
}
Merci de m'avoir aidé
ACER aspire 5740g: Ubuntu 14.04
Hors ligne
#9 Le 30/10/2012, à 00:23
- louis94
Re : créer un sorte de clavier numerique en JAVA.
Voici tes tous premiers rapports de bogue... :-)
En entrant du texte dans un des champs et en cliquant sur le « Enter » correspondant, on a droit à un magnifique « Variable a: texte » ;
Les champs acceptent des valeurs négatives ;
Le PGCD de 12343513123 et de 2134356 est... parfois 2134356, parfois 6, parfois 12, j'ai aussi eu 4, alors qu'un des deux est impair !
La fenêtre n'a pas de taille minimum.
Perso je n'aurais utilisé qu'un seul bouton, avec lecture des données dans les champs et calcul en une seule fonction. Ça fait deux de moins, c'est plus simple à coder et à utiliser.
Je suis conscient que le but n'est pas de faire un programme parfait, mais je ne peux pas m'empêcher...
Louis
Hors ligne
#10 Le 30/10/2012, à 10:28
- yayals
Re : créer un sorte de clavier numerique en JAVA.
deuxième version (j'ai aussi ajouté de la couleur):
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class Fenetre extends JFrame implements ActionListener {
private JButton entrer1 = new JButton("Entrer");
private JButton entrer2 = new JButton("Entrer");
private JButton PGCD = new JButton("PGCD");
private JPanel container = new JPanel();
private JLabel label1 = new JLabel("Variable a: 0");
private JLabel label2 = new JLabel("Variable b: 0");
private JLabel labelPG = new JLabel("PGCD: 0");
private JTextField input1 = new JTextField();
private JTextField input2 = new JTextField();
int a;
int b2;
int b;
public Fenetre(){
this.setSize(300, 200);
this.setResizable(false);
this.setTitle("Calcul pgcd");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
this.setVisible(true);
container.setBackground(Color.ORANGE);
container.setLayout(new GridLayout(4, 3, 5, 5));
container.add(input1);
container.add(input2);
container.add(entrer1);
container.add(entrer2);
container.add(label1);
label1.setForeground(Color.BLACK);
container.add(label2);
label2.setForeground(Color.BLACK);
container.add(PGCD);
container.add(labelPG);
labelPG.setForeground(Color.BLACK);
entrer1.addActionListener(this);
entrer2.addActionListener(this);
PGCD.addActionListener(this);
this.setContentPane(container);
}
public void actionPerformed(ActionEvent e) {
if(e.getSource() == entrer1){
label1.setText("Variable a: "+(input1.getText() == null ? "" : input1.getText()));
try {
a = Integer.parseInt(input1.getText());
} catch (NumberFormatException f) {
label1.setText(input1.getText()+" n'est pas un entier");
}
}
if(e.getSource() == entrer2){
label2.setText("Variable b: "+(input2.getText() == null ? "" : input2.getText()));
try {
b2 = Integer.parseInt(input2.getText());
} catch (NumberFormatException f) {
label2.setText(input2.getText()+" n'est pas un entier");
}
}
if(e.getSource() == PGCD){
b = b2;
int r = 0;
int resultat = 0;
int compteur= 0;
do{
if(compteur >= 1){
a = b;
b = r;
}
resultat = a / b;
r = a - resultat * b;
System.out.println(a+"\t"+b+"\t"+r);
compteur ++;
}while(r != 0);
}
labelPG.setText("PGCD: "+b);
}
}
En entrant du texte dans un des champs et en cliquant sur le « Enter » correspondant, on a droit à un magnifique « Variable a: texte » ;
j'ai ajouté une jolie exception
Les champs acceptent des valeurs négatives
pourquoi ne pourrais-t-on pas calculer le PGCD de valeurs négatives (peut-être que je me trompe) ?
Le PGCD de 12343513123 et de 2134356 est... parfois 2134356, parfois 6, parfois 12, j'ai aussi eu 4, alors qu'un des deux est impair !
pour l'instant il me donne la même exception que quand on ne rentre pas des entiers. Je vais creuser un peut plus.
La fenêtre n'a pas de taille minimum.
j'ai désactiver le redimensionnement de la fenêtre.
Perso je n'aurais utilisé qu'un seul bouton, avec lecture des données dans les champs et calcul en une seule fonction. Ça fait deux de moins, c'est plus simple à coder et à utiliser.
je ne sais pas. J'ai tendance a préférer avec un bouton pour chaque fonction.
Je suis conscient que le but n'est pas de faire un programme parfait, mais je ne peux pas m'empêcher...
C'est mon premier rapports de bogue donc je suis content
ACER aspire 5740g: Ubuntu 14.04
Hors ligne
#11 Le 30/10/2012, à 10:51
- louis94
Re : créer un sorte de clavier numerique en JAVA.
Bonjour,
Depuis que je ne peux plus redimensionner la fenêtre, j'ai « AERRETYYTR n'est... »... Une alternative serait de donner une taille minimum à la fenêtre en utilisant
this.setMinimumSize(new Dimension(300, 200));
pourquoi ne pourrais-t-on pas calculer le PGCD de valeurs négatives (peut-être que je me trompe) ?
Tu as raison.
pour l'instant il me donne la même exception que quand on ne rentre pas des entiers. Je vais creuser un peut plus.
Moi j'ai compris... C'est parce que les nombres que je t'ai donné sont > 2147483647, qui est la valeur maximale d'un int (j'ai pas fait exprès). En utilisant des long et Long.parseLong(), tu auras sans doute un résultat correct.
Encore un : quand j'essaye de calculer le PGCD de 0 et de 0 (qui n'existe pas) :
Exception in thread "AWT-EventQueue-0" java.lang.ArithmeticException: / by zero
at Fenetre.actionPerformed(Main.java:79)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
...
(Le PGCD de 0 et de n != 0 est n, comme le fait très bien remarquer ton programme, du moins tant que le 0 est à gauche...)
Ah oui : les
labelX.setForeground(Color.BLACK);
sont inutiles (c'est noir à la base) et peuvent poser problème si ton programme tourne avec un thème sombre (noir sur noir, ça se voit mal).
Louis
PS : Voilà qui pourrait d'intéresser : https://fr.wikipedia.org/wiki/Algorithme_d%27Euclide
Hors ligne
#12 Le 30/10/2012, à 12:02
- yayals
Re : créer un sorte de clavier numerique en JAVA.
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class Fenetre extends JFrame implements ActionListener {
private JButton entrer1 = new JButton("Entrer");
private JButton entrer2 = new JButton("Entrer");
private JButton PGCD = new JButton("PGCD");
private JPanel container = new JPanel();
private JLabel label1 = new JLabel("Variable a: 0");
private JLabel label2 = new JLabel("Variable b: 0");
private JLabel labelPG = new JLabel("PGCD: 0");
private JTextField input1 = new JTextField();
private JTextField input2 = new JTextField();
long a;
long b2;
long b;
public Fenetre(){
this.setSize(300, 200);
this.setMinimumSize(new Dimension(300, 200));
this.setTitle("Calcul pgcd");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);
this.setVisible(true);
container.setBackground(Color.ORANGE);
container.setLayout(new GridLayout(4, 3, 5, 5));
container.add(input1);
container.add(input2);
container.add(entrer1);
container.add(entrer2);
container.add(label1);
container.add(label2);
container.add(PGCD);
container.add(labelPG);
entrer1.addActionListener(this);
entrer2.addActionListener(this);
PGCD.addActionListener(this);
this.setContentPane(container);
}
public void actionPerformed(ActionEvent e) {
if(e.getSource() == entrer1){
label1.setText("Variable a: "+(input1.getText() == null ? "" : input1.getText()));
try {
a = Long.parseLong(input1.getText());
if(a == 0){
label1.setText("0 ne pocede aucun diviseur");
}
} catch (NumberFormatException f) {
label1.setText(input1.getText()+" n'est pas un entier");
}
}
if(e.getSource() == entrer2){
label2.setText("Variable b: "+(input2.getText() == null ? "" : input2.getText()));
try {
b2 = Long.parseLong(input2.getText());
if(b2 == 0)
label2.setText("0 ne pocede aucun diviseur");
} catch (NumberFormatException f) {
label2.setText(input2.getText()+" n'est pas un entier");
}
}
if(e.getSource() == PGCD){
b = b2;
long r = 0;
long resultat = 0;
int compteur= 0;
do{
if(compteur >= 1){
a = b;
b = r;
}
resultat = a / b;
r = a - resultat * b;
System.out.println(a+"\t"+b+"\t"+r);
compteur ++;
}while(r != 0);
}
labelPG.setText("PGCD: "+b);
}
}
Voila
pour les couleurs avant a la place du orange j'avais mis du bleu. comme les label ne sont pas vraiment noir (et que je suis daltonien) j'avais vraiment du mal pour lire. Mais avec le orange c'est bon.
pour les variable je les ai passé en long donc c'est bon.
Pour les 0 j'ai mis une condition (pas une exception) qui demande de ne pas taper de 0.
J'ai aussi mis une taille minimum a la place de l'interdiction de redimensionner la fenêtre. Tu as raison on ne pouvait pas tout voir.
ACER aspire 5740g: Ubuntu 14.04
Hors ligne
#13 Le 30/10/2012, à 12:21
- louis94
Re : créer un sorte de clavier numerique en JAVA.
Wikipédia est toujours très utile quand on fait des maths... Cas de 0 pour le PGCD.
Je vois que tu calcules le reste de la division en deux lignes. On peut le faire d'un seul coup : reste = a % b.
Sinon ton programme est bien :-)
Louis
Hors ligne