Merhaba arkadaşlar JTextFielde sadece sayı veya sadece cümle girilmesini nasıl sağlayabilirim JFormattedTextField ile değil normal JTextField'e

soruldu: 08 Haz '14, 07:05

HakanKav%C3%A7in's gravatar image

HakanKavçin
286182024
cevap kabul oranı: 37%

değiştirildi: 08 Haz '14, 08:52

CemIkta's gravatar image

CemIkta ♦
19.8k29125190


permanent link

cevaplandı: 09 Haz '14, 01:56

selcukoglu's gravatar image

selcukoglu
647111629
cevap kabul oranı: 16%

Bu tur isler icin en uygun component JFormattedTextField'dir. Ama herhangi bir sebepten dolayi JTextField kullanmak isterseniz ikinci ornekteki gibi yapilabilir.

JFormattedTextField ile sadece tamsayi icin bir tane custom component yazip her yerde kullanmak daha mantikli. Ben daha once bir tane yazmistim, gerekirse kucuk degisiklikler yapilabilir.


package com.devsniper.swing.ui.component;

import java.text.NumberFormat;
import java.text.ParseException;
import javax.swing.JFormattedTextField;
import javax.swing.JTextField;
import javax.swing.text.DefaultFormatterFactory;
import javax.swing.text.NumberFormatter;

/**
 * JFormattedTextField'den IntergerField olusturur.
 * Bosluk girilmesine izin vermez. Integer bosluk kabul etmedigi icin
 * bosluk oldugunda default sifir gosterir.
 * 
 * Genel kullanimi:
 * 
 *      JIntegerField itfCustomerId = new JIntegerTextField();
 * 
 *
 * TODO : Eger gruplama yapilacakca(her 3 haneden sonra nokta goster gibi) 
 * NumberFormat ve Formatter icin istenirse Locale verilebilir!
 *
 * @author Cem Ikta
 */
public class JIntegerField extends JFormattedTextField {

// gruplama icin
    private boolean groupingUsed; 
    private DefaultFormatterFactory formatterFactory;

/**
     * Gruplamada kullanilan gorupingUsed otomatik false verilir.
     */
    public JIntegerField() {
        super();
        groupingUsed = Boolean.FALSE;
        initComponents();
    }

/**
     * Gruplama genelde integer'de kullanilmiyacak.
     * JFormattedTextField genel yapisinda oldugu icin eklendi.
     * 
     * @param boolean groupingUsed sayi ayraci olacak mi
     */
    public JIntegerField(boolean groupingUsed) {
        super();
        this.groupingUsed = groupingUsed;
        initComponents();
    }

/**
     * JFormattedTextField ayarlari yapilir.
     */
    private void initComponents() {
        setFormatterFactory(createFormatterFactory());
        setValue(new Integer(0));
        setColumns(10);
        setHorizontalAlignment(JTextField.RIGHT);
    }

/**
     * Integer'e gore Formatter ayarlari yapilir.
     * 
     * @return formatterFactory Integer'e gore duzenlenmis Formatter
     */
    private AbstractFormatterFactory createFormatterFactory() {
        NumberFormat integerDisplayFormat = NumberFormat.getIntegerInstance();
        integerDisplayFormat.setGroupingUsed(groupingUsed);

NumberFormat integerEditFormat = NumberFormat.getNumberInstance();
        integerEditFormat.setGroupingUsed(groupingUsed);

NumberFormatter integerEditFormatter = new NumberFormatter(integerEditFormat) {
            // deger null ise sifir yapilir.
            @Override
            public Object stringToValue(String text) throws ParseException {
                if (text.equals("") || text == null) {
                    return 0;
                } else {
                    return super.stringToValue(text);
                }
            }

// deger null ise sifir yapilir.
            @Override
            public String valueToString(Object value) throws ParseException {
                if (value == null ||value.equals("")) {
                    return "0";
                } else {
                    return super.valueToString(value);
                }
            }
        };
        integerEditFormatter.setAllowsInvalid(false);

formatterFactory = new DefaultFormatterFactory(
                new NumberFormatter(integerDisplayFormat),
                new NumberFormatter(integerDisplayFormat),
                integerEditFormatter);

return formatterFactory;
    }

}

JTextField kullanmak isterseniz, regex ile istediginiz sarta uygun yapiyi kullanabilirsiniz.


package com.devsniper.swing.ui.component;

import javax.swing.JTextField;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;

/**
 * Sayi icermeyen string'e izin veren JTextField.
 *
 * Genel kullanimi:
 * 
 *      JTextFieldExt tfxName = new JTextFieldExt();
 * 
 *
 * @author Cem Ikta
 */
public class JTextFieldExt extends JTextField {

public JTextFieldExt() {
        super();
        this.setDocument(new PlainDocumentExt());
    }
}

/*
 * Max Length alan PlainDocument Class
 */
class PlainDocumentExt extends PlainDocument {

public PlainDocumentExt() {
        super();
    }

@Override
    public void insertString(int offset, String str, AttributeSet a) throws BadLocationException {
        // regex ile girilen karakteri kontrol eder, number icermiyorsa 
        // JTextFieldExt'e value olarak ekler
        if (str.matches("[a-zA-Z ]*")) {
            super.insertString(offset, str, a);
            System.out.println("string'e izin verildi");
        } else {
            System.out.println("number'a izin verilmedi");
        }
    }
}

Kolay gelsin.

permanent link

cevaplandı: 08 Haz '14, 08:51

CemIkta's gravatar image

CemIkta ♦
19.8k29125190
cevap kabul oranı: 36%

jTextField1 'ın KeyTyped event ini kullanıp bu event içindeki consume metodu ile bu sorununu çözebilirsin. Aşağıdaki kod örneği sana yardımcı olur ;)

private void jTextField1KeyTyped(java.awt.event.KeyEvent evt) {                                     
        char c = evt.getKeyChar();
        boolean uygunKarakterMi = false;

        if (Character.isDigit(c) || c == KeyEvent.VK_BACK_SPACE || c == KeyEvent.VK_DELETE) {
            uygunKarakterMi = true;
        }

        if (harfMi(c)) {
            uygunKarakterMi = true;
        }

        if (!uygunKarakterMi) {
            getToolkit().beep();
            evt.consume();
        }
    }

    private boolean harfMi(char c) {
        List<String> chars = new ArrayList<String>(asList("A", "B", "C", "Ç", "D", "E", "F", "G", "Ğ", "H", "I", "İ", "J", "K", "L", "M", "N", "O", "Ö", "P", "R", "S", "Ş", "T", "U", "Ü", "V", "Y", "Z",
                "a", "b", "c", "ç", "d", "e", "f", "g", "ğ", "h", "ı", "i", "j", "k", "l", "m", "n", "o", "ö", "p", "r", "s", "ş", "t", "u", "ü", "v", "y", "z"));
        if (chars.contains(String.valueOf(c))) {
            return true;
        }
        return false;
    }

İyi çalışmalar

permanent link

cevaplandı: 08 Haz '14, 08:47

M%C3%BCsl%C3%BCm%20%C3%96ZT%C3%9CRK's gravatar image

Müslüm ÖZTÜRK
10.5k103690
cevap kabul oranı: 27%

Cevabınız
toggle preview

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×79
×15
×3

Soruldu: 08 Haz '14, 07:05

Görüntüleme: 1,705 kez

Son güncelleme: 09 Haz '14, 01:56

powered by BitNami OSQA