2011-07-13 6 views
2

私は、JScrollPaneでJEditorPaneをラップした単純なSwingアプリケーションを持っています。JEditorPaneとJScrollPaneとアクセシビリティ

JAWSNVDAなどのスクリーンリーダーソフトウェアは正しく動作しません。

フォーカスがJEditorPaneに入力されると、JEditorPaneの内容の読み取りを継続することが予想される場合にのみ、アクセス可能な名前とその後に続く「text」が読み込まれ、その後停止します。

JEditorPaneをJScrollPaneにラップしないと、期待通りに動作します。

Monkeyを使用してアクセス可能なツリーを検査しようとしましたが、JScrollPaneでラップされたJEditorPaneとラップされていないJeditorPaneの間に関連する違いはありません。

アイデア?

これは、問題を示す簡単なサンプルです。フォーカスが最初のJEditorPaneに入ると、JAWSは "first editorpane - edit"を読み込みます。フォーカスが2番目のJEditorPaneに入ると、JAWSは「2番目のeditorpane-edit-bar」を読み込みます。

public final class SmallExample { 
    public static void main(String... aArgs){ 
    JFrame frame = new JFrame("Test Frame"); 

    JPanel panel = new JPanel(); 

    JEditorPane editorPane1 = new JEditorPane(); 
    editorPane1.setText("Foo"); 
    editorPane1.getAccessibleContext().setAccessibleName("first editorpane"); 
    editorPane1.getAccessibleContext().setAccessibleDescription(""); 

    JScrollPane scrollPane = new JScrollPane(editorPane1, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
    panel.add(scrollPane); 

    JEditorPane editorPane2 = new JEditorPane(); 
    panel.add(editorPane2); 
    editorPane2.setText("Bar"); 
    editorPane2.getAccessibleContext().setAccessibleName("second editorpane"); 
    editorPane2.getAccessibleContext().setAccessibleDescription("");  

    frame.getContentPane().add(panel);  

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.pack(); 
    frame.setVisible(true); 
    } 
} 

答えて

2

私は回避策を自分で見つけ:

I

  1. がJScrollPaneにとのJViewportをスキップするアクセスツリーを変更する場合
  2. JEditorPaneの
  3. からアクセスできるプロパティ変更イベントを送るのを避けます

それが動作します。

この作品(私はeditorPane1のための1つでeditorPane2ためAccessibleContextを交換し、私はオーバーライドするために必要なものを見つけるまで徐々に戻って方法を切り替えることで、回避策を見つけ、なぜ私はまだ非常にに任意の洞察力をいただければ幸いです)。ここで

は(それはもうそれほど簡単ではありません)実施例である:

public final class Example { 

    public static void main(String... aArgs){ 
    JFrame frame = new JFrame("Test Frame"); 

    final JPanel panel = new JPanel(){ 
     public AccessibleContext getAccessibleContext() { 
      if(accessibleContext==null){ 
       accessibleContext = new AccessibleContextWrapper(super.getAccessibleContext()){ 
        public Accessible getAccessibleChild(int i) { 
         Accessible accessibleChild = super.getAccessibleChild(i); 
         while(accessibleChild!=null && (accessibleChild instanceof JScrollPane || accessibleChild instanceof JViewport)){ 
          accessibleChild = accessibleChild.getAccessibleContext().getAccessibleChild(0); 
         } 
         return accessibleChild; 
        } 
       }; 
      } 
      return accessibleContext; 
     } 
    }; 

    final JEditorPane editorPane = new JEditorPane(){ 
     public AccessibleContext getSuperAccessibleContext() { 
      return super.getAccessibleContext(); 
     } 
     @Override 
     public AccessibleContext getAccessibleContext() { 
      return new AccessibleContextWrapper(super.getAccessibleContext()){ 
       public Accessible getAccessibleParent() { 
        Accessible parent = super.getAccessibleParent(); 
        while(parent!=null && (parent instanceof JScrollPane || parent instanceof JViewport)){ 
         parent = parent.getAccessibleContext().getAccessibleParent(); 
        } 
        return parent; 
       } 

       public int getAccessibleIndexInParent() { 
        int res = super.getAccessibleIndexInParent();       
        Accessible parent = super.getAccessibleParent(); 
        while(parent!=null && (parent instanceof JScrollPane || parent instanceof JViewport)){ 
         res = parent.getAccessibleContext().getAccessibleIndexInParent(); 
         parent = parent.getAccessibleContext().getAccessibleParent(); 
        } 
        return res; 
       } 

       public void addPropertyChangeListener(
         PropertyChangeListener listener) {     
       } 

       public void removePropertyChangeListener(
         PropertyChangeListener listener) {     
       }   
      }; 
     }  
    }; 
    editorPane.setText("Foo"); 
    editorPane.getAccessibleContext().setAccessibleName("first editorpane"); 
    editorPane.getAccessibleContext().setAccessibleDescription(""); 
    editorPane.getAccessibleContext(); 
    JScrollPane scrollPane = new JScrollPane(editorPane, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 

    panel.add(scrollPane); 

    frame.getContentPane().add(panel);  

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.pack(); 
    frame.setVisible(true); 
    } 

    public static class AccessibleContextWrapper extends AccessibleContext { 
    private final AccessibleContext inner; 

    public AccessibleContextWrapper(AccessibleContext inner) { 
     this.inner = inner; 
    } 

    public String getAccessibleName() { 
     return inner.getAccessibleName(); 
    } 

    public void setAccessibleName(String s) { 
     inner.setAccessibleName(s); 
    } 

    public String getAccessibleDescription() { 
     return inner.getAccessibleDescription(); 
    } 

    public void setAccessibleDescription(String s) { 
     inner.setAccessibleDescription(s); 
    } 

    public AccessibleRole getAccessibleRole() { 
     return inner.getAccessibleRole(); 
    } 

    public AccessibleStateSet getAccessibleStateSet() { 
     return inner.getAccessibleStateSet(); 
    } 

    public Accessible getAccessibleParent() { 
     return inner.getAccessibleParent(); 
    } 

    public void setAccessibleParent(Accessible a) { 
     inner.setAccessibleParent(a); 
    } 

    public int getAccessibleIndexInParent() { 
     return inner.getAccessibleIndexInParent(); 
    } 

    public int getAccessibleChildrenCount() { 
     return inner.getAccessibleChildrenCount(); 
    } 

    public Accessible getAccessibleChild(int i) { 
     return inner.getAccessibleChild(i); 
    } 

    public Locale getLocale() throws IllegalComponentStateException { 
     return inner.getLocale(); 
    } 

    public void addPropertyChangeListener(PropertyChangeListener listener) { 
     inner.addPropertyChangeListener(listener); 
    } 

    public void removePropertyChangeListener(PropertyChangeListener listener) { 
     inner.removePropertyChangeListener(listener); 
    } 

    public AccessibleAction getAccessibleAction() { 
     return inner.getAccessibleAction(); 
    } 

    public AccessibleComponent getAccessibleComponent() { 
     return inner.getAccessibleComponent(); 
    } 

    public AccessibleSelection getAccessibleSelection() { 
     return inner.getAccessibleSelection(); 
    } 

    public AccessibleText getAccessibleText() { 
     return inner.getAccessibleText(); 
    } 

    public AccessibleEditableText getAccessibleEditableText() { 
     return inner.getAccessibleEditableText(); 
    } 

    public AccessibleValue getAccessibleValue() { 
     return inner.getAccessibleValue(); 
    } 

    public AccessibleIcon[] getAccessibleIcon() { 
     return inner.getAccessibleIcon(); 
    } 

    public AccessibleRelationSet getAccessibleRelationSet() { 
     return inner.getAccessibleRelationSet(); 
    } 

    public AccessibleTable getAccessibleTable() { 
     return inner.getAccessibleTable(); 
    } 

    public void firePropertyChange(String propertyName, Object oldValue, 
      Object newValue) { 
     inner.firePropertyChange(propertyName, oldValue, newValue); 
    } 
    } 

} 
関連する問題