2010-11-09 4 views
0

Je travaille sur un clavier sur java qui sera utilisé pour entrer des données dans deux JTextField (x & y). Et une fois que l'utilisateur clique sur "Entrée", il devrait évaluer la différence de x et y. Dois-je ajouter un tas d'actionListeners pour chaque bouton? Y a-t-il un moyen efficace de le faire? Jusqu'à présent sur mon code, j'ai tous les boutons dont j'ai besoin, mais au lieu d'utiliser mon clavier, je veux utiliser le clavier virtuel à la place pour entrer les chiffres (techniquement, une chaîne). Aucune suggestion?Comment créer un clavier simple sur Java pour entrer dans JTextFields efficacement?

import javax.swing.*; 
import java.awt.*; 

public class EmbeddedMain extends JFrame 
{ 

    public static void main (String[] args) 
     { 
     EmbeddedMain em = new EmbeddedMain(); 
     } 


    public EmbeddedMain() 
    { 
     setTitle("testing"); 
     setSize(450,350); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLocationRelativeTo(null); 
     setLayout(new GridLayout(4,5,3,3)); 

    JButton button1= new JButton("7"); 
    JButton button2= new JButton("8"); 
    JButton button3= new JButton("9"); 
    JButton button4= new JButton("4"); 
    JButton button5= new JButton("5"); 
    JButton button6= new JButton("6"); 
    JButton button7= new JButton("1"); 
    JButton button8= new JButton("2"); 
    JButton button9= new JButton("3"); 
    JButton button0= new JButton("0"); 
    JButton buttonR= new JButton("Reset"); 
    JButton buttonE= new JButton("Enter"); 

    JTextField x = new JTextField("  "); 
    JTextField y = new JTextField("  "); 
    JTextField CPP_entry = new JTextField(" "); 

    CPP_entry.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(" x-y:")); 
    add(CPP_entry); 
    add(buttonR); 
    add(button0); 
    add(buttonE); 

     setVisible(true); 


     } 

     } 

Répondre

0

Deux choses:

D'abord, vous pouvez utiliser un seul ActionListener, prenez soin d'ajouter à tous les boutons et vous pouvez faire quelque chose comme:

public void actionPerformed(ActionEvent e) 
    { 
    JButton currentButton = (JButton)e.getSource(); 
    int number = currentButton.getText().charAt(0) - '0'; 

    // do whatever with the number 
    } 

vous pouvez d'autre part utiliser KeyListener pour attraper les touches pressées pendant que votre clavier est mis au point, cet écouteur a trois méthodes: keyPressed(KeyEvent e), keyReleased(KeyEvent e) et keyTyped(KeyEvent e). Jetez un oeil à Oracle tutoriel here pour apprendre à les utiliser.

1

Je ferais un tableau de boutons comme celui-ci:

JButton[] buttonArray = new JButton[10]; 
for(int i = 0; i < buttonArray.length; i++) { 
    buttonArray[i] = new JButton(String.valueOf(i)); 
    buttonArray[i].addActionListener(yourActionListener); 
} 

et puis quand l'événement se déclenche pour vérifier son origine.

+0

Vous devez définir un ActionCommand 'setActionCommand()' –

0
import javax.swing.*; 
    import java.awt.event.*; 
    import java.awt.*; 

    public class EmbeddedMain extends JFrame implements ActionListener 
    { 
     private JTextField[] tfld = new JTextField[4];// x,y,z; 
     private String sigma = " "+(char)0x2211; 
     private String[] str = {"X=","Y=","Z=",sigma+"="}; 
     private String[] txt = { 
     "7",  "8", "9",  
     "4",  "5", "6",  
     "1",  "2", "3",  
     "Reset", "0", "Enter"}; 
     private JButton[] but = new JButton[12]; 

     public static void main (String[] args) 
     { 
     EmbeddedMain em = new EmbeddedMain(); 
     } 

     public EmbeddedMain() //constructor begins, method for embedded main class 
     { 
     setTitle("Subtraction"); 
     setSize(420,350); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLocationRelativeTo(null); 

     setLayout(new FlowLayout()); 
     JPanel copa = (JPanel)getContentPane(); 
     copa.setPreferredSize(dim(3*70+140+5*5, 4*70+5*5)); 
     copa.setBackground(new Color(100,255,100)); 

     for (int i = 0, j = 0, k = 1; i < but.length; i++, k++) { 
      but[i] = new JButton(txt[i]); 
      but[i].setPreferredSize(dim(70,70)); 
      but[i].setFont(new Font("default",0,18)); 
      but[i].setMargin(new Insets(0,0,0,0)); 
      but[i].addActionListener(this); 
      but[i].setName(""+i); 
      add(but[i]); 

      if (k%3 == 0) { 
       tfld[j] = new JTextField(str[j]); 
       tfld[j].setPreferredSize(dim(140,70)); 
       add(tfld[j++]); 
      } 
     } 
     pack(); 
     setVisible(true); 
     } 

     public void actionPerformed(ActionEvent e) 
     { 
     Object src = e.getSource(); 
     if (src instanceof JButton) { 
      JButton but = (JButton)src; 
      String nm = but.getName(); 
      int nr = Integer.parseInt(nm)/3; 
      String txt = but.getText(); 
      if (txt.equalsIgnoreCase("reset")) { 
       for (int j = 0; j < tfld.length; j++) 
        tfld[j].setText(str[j]); 
      } 

      else if (txt.equalsIgnoreCase("enter")) { 
      } 

      else 
       tfld[0].setText(tfld[0].getText() + txt); 
     } 
     } 

     public Dimension dim(int w, int h) { 
     return new Dimension(w,h); 
     } 
    } 
+0

ne pas utiliser setXXSize ** jamais ** [quelques raisons] (http://stackoverflow.com/a/7229519/203657) – kleopatra

Questions connexes