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

AbstractButton.AccessibleAbstractButton.getIndexAtPoint - contradicts spec

XMLWordPrintable

      Specification for
      public int *getIndexAtPoint*(Point p) says:

      Given a point in local coordinates, return the zero-based index of the
      character under that Point. If the point is invalid, this method returns
      -1. Note: the AbstractButton must have a valid size (e.g. have been
      added to a parent container whose ancestor container is a valid
      top-level window) for this method to be able to return a meaningful value.

      But behaviour of this method for JButton and JLable seems to be strange.
      Run the following code on b86:
          public void test() {
              final JFrame f = new JFrame();
              final JButton but = new JButton();
              but.setText("<html><body><p>Test</p></body></html>");
              try {
                  SwingUtilities.invokeAndWait(new Runnable() {
                      public void run() {
                          f.setSize(300, 300);
                          f.setVisible(true);
                          f.getContentPane().add(but);
                  } } );
                              
                  AccessibleText c =
                      but.getAccessibleContext().getAccessibleText();
                  Point p;
                  for(int y = 0; y < 2; y++) {
                      for(int x = -5; x < 60; x++) {
                          p = new Point (x,y);
                          System.out.println("Point = " + p + "; " + c.getIndexAtPoint(p)) ;
                      }
                  }
              } catch (Exception e) {
                  //todo
              } finally {
                  f.dispose();
              }
          }
      --output----------------------------------------------
      Point = java.awt.Point[x=-5,y=0]; 1
      Point = java.awt.Point[x=-4,y=0]; 1
      Point = java.awt.Point[x=-3,y=0]; 1
      Point = java.awt.Point[x=-2,y=0]; 1
      Point = java.awt.Point[x=-1,y=0]; 1
      Point = java.awt.Point[x=0,y=0]; 1
      Point = java.awt.Point[x=1,y=0]; 1
      Point = java.awt.Point[x=2,y=0]; 1
      Point = java.awt.Point[x=3,y=0]; 1
      Point = java.awt.Point[x=4,y=0]; 2
      Point = java.awt.Point[x=5,y=0]; 2
      Point = java.awt.Point[x=6,y=0]; 2
      Point = java.awt.Point[x=7,y=0]; 2
      Point = java.awt.Point[x=8,y=0]; 2
      Point = java.awt.Point[x=9,y=0]; 2
      Point = java.awt.Point[x=10,y=0]; 2
      Point = java.awt.Point[x=11,y=0]; 3
      Point = java.awt.Point[x=12,y=0]; 3
      Point = java.awt.Point[x=13,y=0]; 3
      Point = java.awt.Point[x=14,y=0]; 3
      Point = java.awt.Point[x=15,y=0]; 3
      Point = java.awt.Point[x=16,y=0]; 3
      Point = java.awt.Point[x=17,y=0]; 3
      Point = java.awt.Point[x=18,y=0]; 4
      Point = java.awt.Point[x=19,y=0]; 4
      Point = java.awt.Point[x=20,y=0]; 4
      Point = java.awt.Point[x=21,y=0]; 4
      Point = java.awt.Point[x=22,y=0]; 4
      Point = java.awt.Point[x=23,y=0]; 4
      Point = java.awt.Point[x=24,y=0]; 4
      Point = java.awt.Point[x=25,y=0]; 5
      Point = java.awt.Point[x=26,y=0]; 5
      Point = java.awt.Point[x=27,y=0]; 5
      Point = java.awt.Point[x=28,y=0]; 5
      Point = java.awt.Point[x=29,y=0]; 5
      Point = java.awt.Point[x=30,y=0]; 5
      Point = java.awt.Point[x=31,y=0]; 5
      Point = java.awt.Point[x=32,y=0]; 5
      Point = java.awt.Point[x=33,y=0]; 5
      Point = java.awt.Point[x=34,y=0]; 5
      Point = java.awt.Point[x=35,y=0]; 5
      Point = java.awt.Point[x=36,y=0]; 5
      Point = java.awt.Point[x=37,y=0]; 5
      Point = java.awt.Point[x=38,y=0]; 5
      Point = java.awt.Point[x=39,y=0]; 5
      Point = java.awt.Point[x=40,y=0]; 5
      Point = java.awt.Point[x=41,y=0]; 5
      Point = java.awt.Point[x=42,y=0]; 5
      Point = java.awt.Point[x=43,y=0]; 5
      Point = java.awt.Point[x=44,y=0]; 5
      Point = java.awt.Point[x=45,y=0]; 5
      Point = java.awt.Point[x=46,y=0]; 5
      Point = java.awt.Point[x=47,y=0]; 5
      Point = java.awt.Point[x=48,y=0]; 5
      Point = java.awt.Point[x=49,y=0]; 5
      Point = java.awt.Point[x=50,y=0]; 5
      Point = java.awt.Point[x=51,y=0]; 5
      Point = java.awt.Point[x=52,y=0]; 5
      Point = java.awt.Point[x=53,y=0]; 5
      Point = java.awt.Point[x=54,y=0]; 5
      Point = java.awt.Point[x=55,y=0]; 5
      Point = java.awt.Point[x=56,y=0]; 5
      Point = java.awt.Point[x=57,y=0]; 5
      Point = java.awt.Point[x=58,y=0]; 5
      Point = java.awt.Point[x=59,y=0]; 5
      Point = java.awt.Point[x=-5,y=1]; 5
      Point = java.awt.Point[x=-4,y=1]; 5
      Point = java.awt.Point[x=-3,y=1]; 5
      Point = java.awt.Point[x=-2,y=1]; 5
      Point = java.awt.Point[x=-1,y=1]; 5
      Point = java.awt.Point[x=0,y=1]; 5
      Point = java.awt.Point[x=1,y=1]; 5
      Point = java.awt.Point[x=2,y=1]; 5
      Point = java.awt.Point[x=3,y=1]; 5
      Point = java.awt.Point[x=4,y=1]; 5
      Point = java.awt.Point[x=5,y=1]; 5
      Point = java.awt.Point[x=6,y=1]; 5
      Point = java.awt.Point[x=7,y=1]; 5
      Point = java.awt.Point[x=8,y=1]; 5
      Point = java.awt.Point[x=9,y=1]; 5
      Point = java.awt.Point[x=10,y=1]; 5
      Point = java.awt.Point[x=11,y=1]; 5
      Point = java.awt.Point[x=12,y=1]; 5
      Point = java.awt.Point[x=13,y=1]; 5
      Point = java.awt.Point[x=14,y=1]; 5
      Point = java.awt.Point[x=15,y=1]; 5
      Point = java.awt.Point[x=16,y=1]; 5
      Point = java.awt.Point[x=17,y=1]; 5
      Point = java.awt.Point[x=18,y=1]; 5
      Point = java.awt.Point[x=19,y=1]; 5
      Point = java.awt.Point[x=20,y=1]; 5
      Point = java.awt.Point[x=21,y=1]; 5
      Point = java.awt.Point[x=22,y=1]; 5
      Point = java.awt.Point[x=23,y=1]; 5
      Point = java.awt.Point[x=24,y=1]; 5
      Point = java.awt.Point[x=25,y=1]; 5
      Point = java.awt.Point[x=26,y=1]; 5
      Point = java.awt.Point[x=27,y=1]; 5
      Point = java.awt.Point[x=28,y=1]; 5
      Point = java.awt.Point[x=29,y=1]; 5
      Point = java.awt.Point[x=30,y=1]; 5
      Point = java.awt.Point[x=31,y=1]; 5
      Point = java.awt.Point[x=32,y=1]; 5
      Point = java.awt.Point[x=33,y=1]; 5
      Point = java.awt.Point[x=34,y=1]; 5
      Point = java.awt.Point[x=35,y=1]; 5
      Point = java.awt.Point[x=36,y=1]; 5
      Point = java.awt.Point[x=37,y=1]; 5
      Point = java.awt.Point[x=38,y=1]; 5
      Point = java.awt.Point[x=39,y=1]; 5
      Point = java.awt.Point[x=40,y=1]; 5
      Point = java.awt.Point[x=41,y=1]; 5
      Point = java.awt.Point[x=42,y=1]; 5
      Point = java.awt.Point[x=43,y=1]; 5
      Point = java.awt.Point[x=44,y=1]; 5
      Point = java.awt.Point[x=45,y=1]; 5
      Point = java.awt.Point[x=46,y=1]; 5
      Point = java.awt.Point[x=47,y=1]; 5
      Point = java.awt.Point[x=48,y=1]; 5
      Point = java.awt.Point[x=49,y=1]; 5
      Point = java.awt.Point[x=50,y=1]; 5
      Point = java.awt.Point[x=51,y=1]; 5
      Point = java.awt.Point[x=52,y=1]; 5
      Point = java.awt.Point[x=53,y=1]; 5
      Point = java.awt.Point[x=54,y=1]; 5
      Point = java.awt.Point[x=55,y=1]; 5
      Point = java.awt.Point[x=56,y=1]; 5
      Point = java.awt.Point[x=57,y=1]; 5
      Point = java.awt.Point[x=58,y=1]; 5
      Point = java.awt.Point[x=59,y=1]; 5

      If to run this test several times it is possible to get different results.

            abhiscxk Abhishek Kumar
            ynovozhi Yulia Novozhilova (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated:
              Imported:
              Indexed: