Pregunta

Estoy escribiendo una aplicación Java que tendrá un teclado numérico en pantalla disponible para retoque de entrada. entrada de llave normal también estará disponible, pero me gustaría el teclado allí para tabletas y tal. He hecho una clase que se extiende JPanel. Cuenta con 10 botones dispuestos en la configuración normal del teclado. Ahora estoy tratando de averiguar cómo hacer que actúe como un teclado regular.

Yo simplemente no saben cómo emitir KeyEvents. Esto es lo que he probado hasta ahora:

He intentado añadir un nuevo KeyListener. En el JPanel, cuando se pulsa un botón, el oyente de action llama un método que crea una nueva KeyEvent y lo envió a todos los KeyListeners que se agregaron a la JPanel. Sin embargo, ¿cuántas veces no importa añadí KeyListeners, el no parecía haber ninguna asociado con el panel.

Otra cosa que probé estaba pasando el objetivo JTextField al JPanel y establecer un objeto miembro a la JTextField. Pero cada vez que intento añadir texto a él, el objeto miembro es nulo. Es realmente desconcertante para mí.

Estoy esperando que alguien me podría apuntar en la dirección correcta con la forma de aplicar este teclado para que sea lo más modular es posible, de manera que puede ser utilizado dentro de varias pantallas diferentes.

Gracias de antemano!

Brent

¿Fue útil?

Solución

Usted no necesita la KeyListener puede asociar a sí mismo el efecto resultado de presionar un botón (no es una clave) en el JTextField.

Tal vez algo como:

New JButton button = new JButton(new KeyPressedAction(mTextField,"0"));

Donde

public class KeyPressedAction extends Action{
  JTextField tf;
  String num;
  public KeyPressedAction(JTextField textField,String num){
    this.tf = textField;
    this.num = num;
  }

  public void actionPerformed(ActionEvent e){
    textField.setText(textField.getText+num);
  }
}

Otros consejos

  

Estoy escribiendo una aplicación Java que   tendrá un teclado numérico de pantalla en   disponible para touch-entrada.

Así que supongo que cuando el botón está "tocado" un ActionEvent se generará. Entonces supongo que tendrá que añadir el carácter relacionado con el botón para un campo de texto. Si es así, entonces los siguientes ejemplos servirán para iniciar. No es necesario que KeyEvents generados, sólo responde a los ActionEvents:

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

public class ButtonCalculator extends JFrame implements ActionListener
{
    private JButton[] buttons;
    private JTextField display;

    public ButtonCalculator()
    {
        display = new JTextField();
        display.setEditable( false );
        display.setHorizontalAlignment(JTextField.RIGHT);

        JPanel buttonPanel = new JPanel();
        buttonPanel.setLayout( new GridLayout(0, 5) );
        buttons = new JButton[10];

        for (int i = 0; i < buttons.length; i++)
        {
            String text = String.valueOf(i);
            JButton button = new JButton( text );
            button.addActionListener( this );
            button.setMnemonic( text.charAt(0) );
            buttons[i] = button;
            buttonPanel.add( button );
        }

        getContentPane().add(display, BorderLayout.NORTH);
        getContentPane().add(buttonPanel, BorderLayout.SOUTH);
        setResizable( false );
    }

    public void actionPerformed(ActionEvent e)
    {
        JButton source = (JButton)e.getSource();
        display.replaceSelection( source.getActionCommand() );
    }

    public static void main(String[] args)
    {
        ButtonCalculator frame = new ButtonCalculator();
        frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible(true);
    }
}

Si esto no resuelve su problema, entonces usted debe buscar en clave enlaces en lugar de utilizar KeyEvents.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top