Comment les numéros d'entrée dans JtextFields utilisant le même ensemble de boutons?
-
30-09-2019 - |
Question
Je construis simple calculatrice modifiée Soustraction seule où z = x - y. J'ai créé 3 textfields: x, y, et z. L'entrée de la volonté de l'utilisateur de la valeur à l'aide du clavier (touches) J'ai conçu pour x et y.
Juste en regardant le code ci-dessous, il y a deux questions tout de suite.
1) Le x textfield accepte un seul chiffre. (Je veux d'accepter jusqu'à 3 chiffres). Toutes les suggestions sur la façon dont je peux modifier la déclaration d'autre si à intégrer cette?
2) Quand je suis fait avec x textfield, je veux le faire avec la même chose avec l'y textfield. Mais les boutons sont strictement attribués au x textfield. Il serait inefficace de faire un plus clavier juste pour y textfield. Alors, comment puis-je passer entre x et champ texte y. Y at-il un code où si l'utilisateur a le curseur sur le champ de texte x, le clavier est réservé pour ce champ de texte x et si l'utilisateur change au y textfield, le clavier peut être utilisé pour l'y alors.
3) Et une fois que l'utilisateur hits entrer, son une opération simple, z = x - y. Ce qui devrait être facile à mettre en œuvre. dire convertir les chaînes en nombres entiers, etc., et effectuer la différence.
Merci à vous tous à l'avance!
import javax.swing.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.event.*;
import java.awt.*;
import java.applet.*;
public class EmbeddedMain extends JFrame
{
private JTextField x,y,z;
private JButton button1, button2, button3, button4, button5, button6, button7, button8, button9, button0, buttonR, buttonE;
public static void main (String[] args)
{
EmbeddedMain em = new EmbeddedMain();
}
public EmbeddedMain() //constructor begins, method for embedded main class
{
setTitle("Subtraction");
setSize(450,350);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setLayout(new GridLayout(4,5,3,3));
setVisible(true);
button1= new JButton("7");
button2= new JButton("8");
button3= new JButton("9");
button4= new JButton("4");
button5= new JButton("5");
button6= new JButton("6");
button7= new JButton("1");
button8= new JButton("2");
button9= new JButton("3");
button0= new JButton("0");
buttonR= new JButton("Reset");
buttonE= new JButton("Enter");
x = new JTextField(" ");
y = new JTextField(" ");
z = new JTextField(" ");
z.setEditable(false);
add(button1);
add(button2);
add(button3);
add(new JLabel(" x:"));
add(x);
add(button4);
add(button5);
add(button6);
add(new JLabel(" y:"));
add(y);
add(button7);
add(button8);
add(button9);
add(new JLabel(" z:"));
add(z);
add(buttonR);
add(button0);
add(buttonE);
thehandler handler = new thehandler();
button1.addActionListener(handler);
button2.addActionListener(handler);
button3.addActionListener(handler);
button4.addActionListener(handler);
button5.addActionListener(handler);
button6.addActionListener(handler);
button7.addActionListener(handler);
button8.addActionListener(handler);
button9.addActionListener(handler);
button0.addActionListener(handler);
buttonR.addActionListener(handler);
buttonE.addActionListener(handler);
}
//building class inside class
private class thehandler implements ActionListener{
public void actionPerformed(ActionEvent event){
if(event.getSource()== button1)
x.setText("7");
else if (event.getSource()== button2)
x.setText("8");
else if (event.getSource()== button3)
x.setText("9");
else if (event.getSource()== button4)
x.setText("4");
else if (event.getSource()== button5)
x.setText("5");
else if (event.getSource()== button6)
x.setText("6");
else if (event.getSource()== button7)
x.setText("1");
else if (event.getSource()== button8)
x.setText("2");
else if (event.getSource()== button9)
x.setText("3");
else if (event.getSource()== button0)
x.setText("0");
else if (event.getSource()== buttonR)
x.setText(" ");
}
}
}
La solution
Vous pouvez ajouter un MouseListener
aux champs de texte afin de savoir quand l'utilisateur est passé de x à y et vice versa:
private JTextField selected;
selected = x;
x.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
selected = x;
}
});
y.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
selected = y;
}
});
Pour la soustraction, convertir le texte présent en x et y à ints et soustrayez. Vous pouvez factoriser votre actionPerformed
à:
public void actionPerformed(ActionEvent event) {
String s = selected.getText();
if (event.getSource() == buttonR) {
x.setText("");
y.setText("");
z.setText("");
} else if (event.getSource() == buttonE) {
int result = Integer.parseInt(x.getText()) - Integer.parseInt(y.getText());
z.setText(String.valueOf(result));
} else {
String command = event.getActionCommand();
selected.setText(s + command);
}
}
Autres conseils
Cela semble devoir donc je ne vais pas vous donner des détails, de toute façon
- au lieu que l'utilisation
setText
vous devez d'abordgetText
et concaténer alors le nombre déjà présent avec le nouveau chiffre - vous pouvez utiliser une variable au début de votre
actionPerformed
et basculer entre deux champs de texte avec une valeur booléenne par exemple. Par exemple.JTextField cur = first ? x : y
- il suffit de lire la documentation des classes de
Integer
ouString
et vous trouverez ce que vous avez besoin (toString
,valueOf
,parse
)
Par la façon dont je vous a également répondu hier et je vous suggère de ne pas utiliser un si / chaîne d'autre pour chaque bouton puisque vous savez qui est le numéro qui est affiché .. par exemple:
((JButton)e.getSource()).getText() == "1"
cela signifie que vous perdez beaucoup de lignes de code ..