Java KeyListener

0

Witam,
Mam problem z KeyListenerem. Robię klasę dziedziczącą od JTextField, która pozwala na wpisywanie tylko liczb. Problem w tym, że AWT najpierw wysyła zdarzenie do KeyListenera, a dopiero potem do JTextFielda i przez to można wpisać 1 literę.

import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import javax.swing.JTextField;

public class JNumberField extends JTextField implements KeyListener {
    public JNumberField(){
        addKeyListener(this);
    }

    public double getValue(){
        return Double.parseDouble(getText());
    }

    public void keyPressed(KeyEvent e){
        setText(getText().replaceAll("\\D", ""));
    }
    public void keyReleased(KeyEvent e){}
    public void keyTyped(KeyEvent e){}
}
0

Witam,
Kiedyś wklejałem ten kod na forum pewnie i Tobie się przyda.
W tym przykładzie nie tylko możesz wpisać liczby od 0 do 9, ale również nie pozwala wkleić coś innego niż liczby.

import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
/*
 * @author Piotr
 */
public class Main {
    Main() {
        initComp();
    }
    private void initComp() {
        JFrame frame = new JFrame();
        JPanel panel = new JPanel();
        JTextField text = new JTextField("");
        text.setPreferredSize(new Dimension(200,30));
        text.addKeyListener(new KeyAdapter() {
            @Override
            public void keyTyped(KeyEvent e) {
                textKeyTyped(e);
            }
            @Override
            public void keyPressed(KeyEvent e) {
                textKeyPressed(e);
            }
        });
        panel.add(text);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(panel);
        frame.setSize(250, 150);
        frame.setVisible(true);
    }
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                Main te = new Main();
            }
        });
    }
    private boolean czyLiczba(char z){
        if (z >= '0' && z <= '9')
         return true;
        return false;
    }
    private void textKeyTyped(KeyEvent e) {
    if (!czyLiczba(e.getKeyChar()))
        e.consume();
    }
    private void textKeyPressed(KeyEvent e) {
        if (e.isControlDown() && e.getKeyCode() == KeyEvent.VK_V)
        {
            Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();
            String schowek = "";
            try {
                schowek = (String) clip.getData(DataFlavor.stringFlavor);
            } catch (UnsupportedFlavorException ex) {
                System.out.println("To nie jest string");
            }
            catch (IOException ex) {
                System.out.println("Błąd");
            }
            for (int i = 0; i < schowek.length(); i++)
                if (!czyLiczba(schowek.charAt(i))){
                    System.out.println(schowek.charAt(i));
                    e.consume();
                    break;
                }
        }
    }
}

Pozdrawiam.

0

Dzięki
Trochę przerobiłem, wkleję, może się komuś przyda ;)

import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import javax.swing.JTextField;

public class JNumberField extends JTextField implements KeyListener {
    public JNumberField(){
        addKeyListener(this);
    }

    public double getValue(){
        return Double.parseDouble(getText());
    }

    private boolean isNumber(char c){
        if((c >= '0' && c <= '9' ) || c == '.' || c == ',' || c == '-' || c == '+') return true;

        return false;
    }

    public void keyPressed(KeyEvent e){
        if(e.isControlDown() && e.getKeyCode() == KeyEvent.VK_V){
            String clip = "";
            try {
                clip = (String)Toolkit.getDefaultToolkit().getSystemClipboard().getData(DataFlavor.stringFlavor);
            } catch(Exception ex){}

            for(int i = 0; i < clip.length(); i++)
                if(!isNumber(clip.charAt(i))){
                    e.consume();
                    break;
                }
        }
    }

    public void keyReleased(KeyEvent e){}
    public void keyTyped(KeyEvent e){
        if(!isNumber(e.getKeyChar())){
            e.consume();
        } else if(e.getKeyChar() == ','){
            e.setKeyChar('.');
        } if(e.getKeyChar() == '.'){
            if(getText().contains(".")) e.consume();
        } else if(e.getKeyChar() == '-' || e.getKeyChar() == '+'){
            if(!(getCaretPosition() == 0)) e.consume();
            else if(getText().contains("+") || getText().contains("-")) e.consume();
        }
    }
}
0

Dorób do swojej klasy jeszcze maski np żeby w pole można było wpisać tylko nn-nnn (kod pocztowy), datę w formie rrrr-mm-dd lub odwrotnie dd-mm-rrrr, godzinę ggss lub gg:mm, lub inne podobne możliwe do zdefiniowania przez programistę maski. Wtedy Twoja klasa będzie fajniejsza.

1 użytkowników online, w tym zalogowanych: 0, gości: 1