2013-10-04 2 views
0

Я устанавливаю верификатор ввода в свои два текстовых поля, и я хочу, чтобы мои переключатели неактивны, пока не будут проверены два текстовых поля.Входной верификатор между текстовыми полями и переключателями

(Пользователь должен не может выбрать любого из радио-кнопки, пока текстовые поля не проверить.)

Как неактивный JRadioButton, пока JTextFields будет проверять?

Мой код:

public class AddUserDialog2 extends JDialog implements ActionListener { 
JButton cancelBtn, okBtn; 
JTextField fNameTf, lNameTf; 
JRadioButton maleRb, femaleRb; 
ButtonGroup group; 
JLabel fNameLbl, lNameLbl, genderLbl, fNameTemp, lNameTemp, tempBtn, temp3; 

public AddUserDialog2() { 
    add(createForm(), BorderLayout.CENTER); 
    setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
    pack(); 
    setVisible(true); 
} 

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

public JPanel createForm() { 
    JPanel panel = new JPanel(); 
    okBtn = new JButton("Ok"); 
    cancelBtn = new JButton("Cancel"); 
    tempBtn = new JLabel(); 
    fNameLbl = new JLabel("First Name"); 
    fNameTemp = new JLabel(); 
    lNameLbl = new JLabel("Last Name"); 
    lNameTemp = new JLabel(); 
    genderLbl = new JLabel("Gender"); 
    fNameTf = new JTextField(10); 
    fNameTf.setName("fntf"); 
    fNameTf.setInputVerifier(new MyVerifier()); 
    lNameTf = new JTextField(10); 
    lNameTf.setName("lntf"); 
    lNameTf.setInputVerifier(new MyVerifier()); 
    maleRb = new JRadioButton("Male"); 
    maleRb.setInputVerifier(new MyVerifier()); 
    femaleRb = new JRadioButton("Female"); 
    femaleRb.setInputVerifier(new MyVerifier()); 
    temp3 = new JLabel(); 
    group = new ButtonGroup(); 
    group.add(maleRb); 
    group.add(femaleRb); 
    maleRb.addActionListener(this); 
    femaleRb.addActionListener(this); 
    panel.add(fNameLbl); 
    panel.add(fNameTf); 
    panel.add(fNameTemp); 
    panel.add(lNameLbl); 
    panel.add(lNameTf); 
    panel.add(lNameTemp); 
    panel.add(genderLbl); 
    JPanel radioPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); 
    radioPanel.add(maleRb); 
    radioPanel.add(femaleRb); 
    panel.add(radioPanel); 
    panel.add(temp3); 
    panel.add(okBtn); 
    okBtn.addActionListener(this); 
    panel.add(cancelBtn); 
    cancelBtn.addActionListener(this); 
    panel.add(tempBtn); 

    panel.setLayout(new SpringLayout()); 
    SpringUtilities.makeCompactGrid(panel, 4, 3, 50, 10, 80, 60); 
    return panel; 
} 

@Override 
public void actionPerformed(ActionEvent e) { 
    // Be inactive until two text field verified. 
} 

public class MyVerifier extends InputVerifier { 

    @Override 
    public boolean verify(JComponent input) { 
     String name = input.getName(); 
     if (name.equals("fntf")) { 
      String text = ((JTextField) input).getText().trim(); 
      if (text.matches(".*\\d.*")) return false;  // Have Digit 
     } else if (name.equals("lntf")) { 
      String text = ((JTextField) input).getText(); 
      if (text.matches(".*\\d.*")) return false; 
     } 
     return true; 
    } 
} 
} 

Update

Стараюсь @omainegra решение и это исключение происходит:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
at Project.AddUserDialog2$MyVerifier.verify(AddUserDialog2.java:107) 
at javax.swing.InputVerifier.shouldYieldFocus(InputVerifier.java:132) 
at javax.swing.JComponent$1.acceptRequestFocus(JComponent.java:3589) 
at java.awt.Component.isRequestFocusAccepted(Component.java:7728) 
at java.awt.Component.requestFocusHelper(Component.java:7610) 
at java.awt.Component.requestFocusHelper(Component.java:7603) 
at java.awt.Component.requestFocus(Component.java:7411) 
at javax.swing.JComponent.requestFocus(JComponent.java:1476) 
at javax.swing.text.DefaultCaret.adjustFocus(DefaultCaret.java:530) 
at javax.swing.text.DefaultCaret.adjustCaretAndFocus(DefaultCaret.java:503) 
at javax.swing.text.DefaultCaret.mousePressed(DefaultCaret.java:492) 
at java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:280) 
at java.awt.Component.processMouseEvent(Component.java:6502) 
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321) 
at java.awt.Component.processEvent(Component.java:6270) 
at java.awt.Container.processEvent(Container.java:2229) 
at java.awt.Component.dispatchEventImpl(Component.java:4861) 
at java.awt.Container.dispatchEventImpl(Container.java:2287) 
at java.awt.Component.dispatchEvent(Component.java:4687) 
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832) 
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4489) 
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422) 
at java.awt.Container.dispatchEventImpl(Container.java:2273) 
at java.awt.Window.dispatchEventImpl(Window.java:2719) 
at java.awt.Component.dispatchEvent(Component.java:4687) 
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:723) 
at java.awt.EventQueue.access$200(EventQueue.java:103) 
at java.awt.EventQueue$3.run(EventQueue.java:682) 
at java.awt.EventQueue$3.run(EventQueue.java:680) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87) 
at java.awt.EventQueue$4.run(EventQueue.java:696) 
at java.awt.EventQueue$4.run(EventQueue.java:694) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
at java.awt.EventQueue.dispatchEvent(EventQueue.java:693) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242) 
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) 
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91) 
+0

@AndrewThompson Мой вопрос в том, что, как я могу это сделать ?! – Sajad

+0

@AndrewThompson Что вы имеете в виду о «редактировании вопроса в вопрос ..»? – Sajad

+0

@AndrewThompson Я знаю, как отредактировать сообщение, вы говорите, что редактируете название вопроса или тело? – Sajad

ответ

2

Из кода я предполагаю public class MyVerifier является внутренний класс AddUserDialog2 , Если это так, вы должны иметь возможность отключить JRadioButton внутри функции boolean verify(JComponent input) в начале и в конце. Это самое простое решение я могу думать:

public boolean verify(JComponent input) { 

     maleRb.setEnabled(false); 
     femaleRb.setEnabled(false); 

     String name = input.getName(); 
     if (name.equals("fntf")) { 
      String text = ((JTextField) input).getText().trim(); 
      if (text.matches(".*\\d.*")) return false;  // Have Digit 
     } else if (name.equals("lntf")) { 
      String text = ((JTextField) input).getText(); 
      if (text.matches(".*\\d.*")) return false; 
     } 

     maleRb.setEnabled(true); 
     femaleRb.setEnabled(true); 
     return true; 
    } 

Но делать это, я боюсь, что вы не будете перехватывать отключить эффект. В коде:

fNameTf.setName("fntf"); 
    fNameTf.setInputVerifier(new MyVerifier()); 
    lNameTf = new JTextField(10); 
    lNameTf.setName("lntf"); 
    lNameTf.setInputVerifier(new MyVerifier()); 
    maleRb = new JRadioButton("Male"); 
    maleRb.setInputVerifier(new MyVerifier()); 
    maleRb.setName("male"); 
    femaleRb = new JRadioButton("Female"); 
    femaleRb.setName("Female"); 
    femaleRb.setInputVerifier(new MyVerifier()); 

вам не нужно создавать 4 объектов для общего входного контроля. Просто создайте один и передайте его этим четырем входным объектам. Снова, когда вы передаете «мужчина» в JRadioButton, он устанавливает его текст, но не имя. поэтому вам нужно использовать maleRb.setName("male") и femaleRb.setName("female"), и ошибка исчезнет.

+0

Это работает, но когда вы хотите выбрать один из переключателей в неактивном режиме, возникает 'java.lang.NullPointerException'. – Sajad

+0

@Sajjad Опубликовать Stacktrace, чтобы мы могли увидеть, где произошла ошибка и в чем причина. – omainegra

+0

@Sajjad, я обновил ответ. Проверьте текущее изменение и не добавляйте верификатор ввода в JRadioButton. Думаю, это не понадобится. И если все же исключение преследует, plz выведет stacktrace как * @ omainegra *. – Sage

1

Я думаю, что лучше использовать привязка данных. Проверьте JGoodies Binding на http://www.jgoodies.com/freeware/libraries/binding/, но вы можете попробовать это.

Измените свой класс MyVerifier, добавив конструктор, который принимает и массив JComponent. Эти компоненты будут включены, если валидация верна, в противном случае отключено.

public class MyVerifier extends InputVerifier { 
    JComponent [] components; 

    public MyVerifier(){ 
    } 

    public MyVerifier(JComponent [] components){ 
     this.components = components; 
    } 

    private void enableComponents(){ 
     //enable dependent components 
     if (components != null){ 
      for (JComponent r: components){ 
       r.setEnabled(true); 
      } 
     } 
    } 

    private void disableComponents(){ 
     //disable dependent components 
     if (components != null){ 
      for (JComponent r: components){ 
       r.setEnabled(false); 
      } 
     } 
    } 

    @Override 
    public boolean verify(JComponent input) { 
     String name = input.getName(); 

     if (name == null) {     
      return false; 
     } 
     else if (name.equals("fntf")) { 
      String text = ((JTextField) input).getText().trim(); 
      if (text.matches(".*\\d.*")){ 

       //disable dependent components 
       disableComponents(); 

       return false; // Have Digit 
      }    
     } else if (name.equals("lntf")) { 
      String text = ((JTextField) input).getText(); 
      if (text.matches(".*\\d.*")){ 
       //disable dependent components 
       disableComponents(); 

       return false; 
      } 
     } 

     enableComponents(); 

     return true; 
    } 
} 

Затем построить свой валидатор передавая компоненты списка, которые вы хотите включить или отключить в зависимости от результата проверки.

fNameTf.setInputVerifier(new MyVerifier(new JComponent[]{maleRb, femaleRb})); 

Это будет работать не только для JRadioButton, но и для любого JComponent

+0

'java.lang.NullPointerException' возникают при вводе числа в первом текстовом поле. – Sajad

+0

@ Sajjad Я обновил код, попробуйте – omainegra

+0

Теперь это исключение происходит на 'r.setEnabled (true);' line. – Sajad