Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-4531346

REGRESSION: InputVerifiers behavior in 1.4 not compatible with 1.3

XMLWordPrintable



      Name: jl125535 Date: 11/26/2001


      java version "1.4.0-beta3"
      Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.0-beta3-b84)
      Java HotSpot(TM) Client VM (build 1.4.0-beta3-b84, mixed mode)

      The behavior of InputVerifier in 1.4 is not fully compatible with 1.3
      Both of the behaviors below were verified in Windows 2000 and Solaris 8.

      A) In 1.4 the InputVerifier is executed every time a user clicks with the mouse
      in the JTextField - even if the TexfField already has keyboard focus. In 1.3
      this only occurs once.

      B) If the shouldYieldFocus()-method of a InputVerifer shows a dialog when the
      user has entered a incorrect value the application enters a closed loop.
      * Showing the dialog causes the InputVerifier to execute
      * This pops up the dialog
      * Showing the dialog causes the InputVerifier to execute
      ....forever.
      In 1.3 showing the dialog would not start the InputVerifier.


      When running the attached code, A is exemplified just by clicking with the
      mouse several times in the field with the text "No Popup". Note that the
      shouldYieldFocus() executes each time. Also note that navigating to the field
      by using tab does not cause the shouldYieldFocus() to execute (which is correct)

      Leaving the field named "With popup" by using TAB exemplifies the closed loop
      described as B. This also occurs if any other field has focus and you click
      with the mouse in the field.


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

      public class InputVerifierTest extends JFrame implements ActionListener {

          InputVerifierTest() {
              JDesktopPane desktop = new JDesktopPane();
              Container contentPane = getContentPane();
              contentPane.add(desktop,BorderLayout.CENTER);
              desktop.add(createFrame("A"));
              desktop.add(createFrame("B"));
              JPanel top = new JPanel();
              top.setLayout(new BorderLayout());
              top.addFocusListener(new MyFocusListener("Top"));
          }
          
          private JInternalFrame createFrame(String name) {
              JInternalFrame internalFrame = new JInternalFrame
      (name,true,true,true,true);
              internalFrame.setVisible(true);
              internalFrame.setSize(200,300);
              internalFrame.addFocusListener(new MyFocusListener("internalFrame " +
      name));
              try {
                  internalFrame.setSelected(true);
              } catch( java.beans.PropertyVetoException pe) {
                  //HIDEME
              }
              internalFrame.getContentPane().setLayout(new BorderLayout());
              
              JPanel panel = new JPanel();
              
              internalFrame.getContentPane().add(panel,BorderLayout.CENTER);
              
              JTextField textField = new JTextField("Without verifier",10);
              textField.addFocusListener(new MyFocusListener(name+ ":textField"));
              panel.add(textField);

              JTextField textField1 = new JTextField("With popup");
              textField1.setInputVerifier(new MyVerifier(true));
              textField1.addFocusListener(new MyFocusListener(name+ ":textField1"));
              panel.add(textField1);
              
              JTextField textField2 = new JTextField("No Popup");
              textField2.setInputVerifier(new MyVerifier(false));
              textField2.addFocusListener(new MyFocusListener(name+ ":textField2"));
              panel.add(textField2);
                      
              panel.addFocusListener(new MyFocusListener(name+ ":panel"));
              
              internalFrame.getContentPane().add(new JLabel("java.version = " +
      System.getProperty("java.version")),BorderLayout.SOUTH);
              
              JButton button = new JButton();
                  
              button.setText("Save");
              button.addActionListener(this);
              button.addFocusListener(new MyFocusListener(name+ ":Save"));
              panel.add(button);
              
              return internalFrame;
          }
          
          public void actionPerformed(ActionEvent e) {
              System.out.println("'Saving'");
          }
          
          public static void main(String arg []) {
              InputVerifierTest test = new InputVerifierTest();
              
              test.setSize(500,500);
              test.setVisible(true);
          }

          class MyVerifier extends InputVerifier {
              private boolean popup = false;
              public MyVerifier(boolean popup) {
                  this.popup = popup;
              }
              
              public boolean shouldYieldFocus(JComponent input) {
                  boolean status ;
                  
                  System.out.println("shouldYieldFocus BEGIN");
                  status = verify(input);
                  System.out.println("You wrote ='" + ((JTextField) input).getText()
      +"'");
                  
                  if (status == false ) {
                      if (popup) {
                          JOptionPane.showMessageDialog(null, "Only the text 'Jan' is
      allowed","Error" , JOptionPane.ERROR_MESSAGE);
                      }
                      System.out.println("Only the text 'Jan' is allowed");
                  } else {
                      System.out.println("Correct");
                  }
                  System.out.println("shouldYieldFocus END");
                  return status ;
              }
              
              public boolean verify(JComponent input) {
                  JTextField tf = (JTextField) input;
                  boolean status = "Jan".equals(tf.getText());
                  System.out.println("Verify() returns = " + status);
                  return status;
              }
          }
              
          class MyFocusListener implements FocusListener {
              private String name ;
              MyFocusListener(String name) {
                  this.name = name ;
              }
              public void focusGained(FocusEvent e) {
                  System.out.println("Focus gained on " + name);
              }
              
              public void focusLost(FocusEvent e) {
                  System.out.println("Focus lost on " + name);
              }
          }
      }

      Release Regression From : 1.3.1
      The above release value was the last known release where this
      bug was knwon to work. Since then there has been a regression.

      (Review ID: 135461)
      ======================================================================

            joutwatesunw Joshua Outwater (Inactive)
            jleesunw Jon Lee (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

              Created:
              Updated:
              Resolved:
              Imported:
              Indexed: