21 Востаннє редагувалося Lujok (03.11.2015 12:51:08)

Re: Зробити так щоб вводити лише англійські символи для назв колонок.

В головному класі :

((AbstractDocument) textColumnName.getDocument()).setDocumentFilter(new latynycaFilter (textColumnName ) ) ; 
public class latynycaFilter extends DocumentFilter{

    JTextField textColumnName ;
    Pattern p ;

    latynycaFilter( JTextField textColumnName){         // конструктор 
        this.textColumnName =   textColumnName;
        p = Pattern.compile("[^a-zA-Z]");  
    }

В медоді replace намагаюсь за допомогою  оператора if  else  вивести на консоль значення  m.matches())  , але виходить навпаки ніж я очікував . Коли вводю англійські символи то - false,  а коли інші - true .
Плюс як примусити в текстове поле заносити символи які відповідають ("[^a-zA-Z]") ?  Я намагався  textColumnName.setText(text))   ,  але отримав StackOverflowError .

  @Override
     public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException{

        Matcher m = p.matcher(text);  
        if( m.matches()){
            System.out.println(" m.matches() -  true  -"+ m.matches());         
        }else{
//          textColumnName.setText(text));// якщо розкоментувати то буде - StackOverflowError
            System.out.println(" m.matches() -  false " + m.matches()); 
        }
}

22 Востаннє редагувалося fed_lviv (03.11.2015 14:55:05)

Re: Зробити так щоб вводити лише англійські символи для назв колонок.

Можливо, не файно, описав, як робити. Зараз скину приклад.

package main;

import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.text.AbstractDocument;

public class MainFrame extends JFrame {
    private JTextField txt = new JTextField();

    public MainFrame() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        add(txt);
        ((AbstractDocument) txt.getDocument()).setDocumentFilter(new MyFilter("[^a-zA-Z]"));
        pack();
        setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new MainFrame();
            }
        });
    }
}

package main;

import javax.swing.text.DocumentFilter;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;

public class MyFilter extends javax.swing.text.DocumentFilter {
    private String regex;

    public MyFilter(String regex) {
        this.regex = regex;
    }

    @Override
    public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String text, AttributeSet attrs)
            throws BadLocationException {
        if (regex != null) {
            text = text.replaceAll(regex, "");
        }
        super.replace(fb, offset, length, text, attrs);
    }
}

А, ось тут робіть, як Вашій душі завгодно. text = text.replaceAll(regex, ""); Хочте залишайте, так, хочете, як quez пропонував, можна, як koala казав, можна і Pattern.

Подякували: Lujok1

23

Re: Зробити так щоб вводити лише англійські символи для назв колонок.

Lujok написав:

В медоді replace намагаюсь за допомогою  оператора if  else  вивести на консоль значення  m.matches())  , але виходить навпаки ніж я очікував . Коли вводю англійські символи то - false,  а коли інші - true .

Все правильно виходить. Це я просто не правильно Вам написав. Даний регулярний вираз пропускає все окрім латиниці. А я методом replaceAll замінюю, все ОКРІМ ЛАТИНИЦІ на ПУСТОТУ "".

Подякували: Lujok1

24 Востаннє редагувалося Lujok (05.11.2015 18:15:53)

Re: Зробити так щоб вводити лише англійські символи для назв колонок.

koala написав:

Вам, схоже, Character.UnicodeBlock потрібен.
https://docs.oracle.com/javase/8/docs/a … Block.html

Вешчь ). Дякую за інфу , пригодиться. Хоча для даної задачі краще буде як  quez пропонував , або fed_lviv .
В Character.UnicodeBlock крім букв алфавіту ще входять цифри, та різні символи (!"№;%%:::...та інш    ) що не підходить для назв колонок.

Користувач вводе символи в JTextField   textColumnName а потім натискає кнопку і в unicodeBlockActionListener  перевіряється які символи належать до конкретного unicodeBlockActionListener , а які ні . Залишаються тільки ті які належать :


class unicodeBlockActionListener implements ActionListener {
    JTextField textColumnName ;
    ArrayList<Character.UnicodeBlock>  english = new ArrayList<>();
       
    public unicodeBlockActionListener(JTextField textColumnName ) {
        this.textColumnName = textColumnName;
        english.add(Character.UnicodeBlock.BASIC_LATIN);
        english.add(Character.UnicodeBlock.LATIN_1_SUPPLEMENT);
        english.add(Character.UnicodeBlock.LATIN_EXTENDED_A);
        english.add(Character.UnicodeBlock.GENERAL_PUNCTUATION);
    }

    @Override
    public void actionPerformed(ActionEvent ae) {
        String str = textColumnName.getText();
        StringBuffer strBuffer = new StringBuffer();
            
        for (char currentChar : str.toCharArray())  
        {
            Character.UnicodeBlock unicodeBlock = Character.UnicodeBlock.of(currentChar);
            if (english.contains(unicodeBlock))
            {
                strBuffer.append(currentChar);
                textColumnName.setText(strBuffer.toString());
            }else{
                textColumnName.setText(strBuffer.toString());
            }
        }   
    }   
}