Why is my JTable always reported as empty using VoiceOver on OS X?

VoiceOver on OSX 10.10.4 (Yosemite), using JRE 1.7.0_75 and JRE 1.8.0_45, reports the following table as "empty."

package stackoverflow.examples.jtable;

import javax.swing.JFrame;
import javax.swing.JTable;
import javax.swing.SwingUtilities;

public class TableDemo extends JFrame
{
    private static final long serialVersionUID = 1L;

    public TableDemo()
    {
        super("Accessible JTable?");

        final String[] columnNames = 
            {
                "First Name",
                "Last Name",
                "Sport",
                "# of Years",
                "Vegetarian"
            };
        final Object[][] data = 
            {
                {"Kathy", "Smith", "Snowboarding", new Integer(5), new Boolean(false)},
                {"John", "Doe", "Rowing", new Integer(3), new Boolean(true)},
            };

        final JTable jTable = new JTable(data, columnNames);
        jTable.getAccessibleContext().setAccessibleName("data table");
        System.out.println("rows: " + jTable.getAccessibleContext().getAccessibleTable().getAccessibleRowCount());
        System.out.println("cols: " + jTable.getAccessibleContext().getAccessibleTable().getAccessibleColumnCount());
        System.out.println("java: " + System.getProperty("java.version"));
        jTable.setOpaque(true);
        setContentPane(jTable);
    }

    private static void createAndShowGUI() 
    {
        final TableDemo frame = new TableDemo();
        frame.pack();
        frame.setVisible(true);
    }

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

Besides VoiceOver saying the table is empty, everything else looks fine:

What am I missing?

Additional Information:

  • JRE 1.6.0_65, Apple JRE, . , Oracle JRE.
+4
2

, VoiceOver "" , , . ( Xcode) . , JTable , AXTable 10 AXStaticText ( ). AXTable > AXRow > AXCell > & hellip;, , AXTable Rows , JRE.

Windows 8.1 Pro Java 1.8.0_51, . , Windows SDK , . , JTable . Windows, .

, , JRE .

javax.accessibility.AccessibleRole , ROW , " ".

JTable , AccessibleJTable, AccessibleTableHeader, AccessibleJTableCell AccessibleJTableHeaderCell , Accessible.

AccessibleContext, , JTable . , , .

, . , src/macosx/native/sun/awt/JavaAccessibilityUtilities.m, , Java NSAccessibility * Role. , ROW_HEADER AXRow. , AXRow AXTable ROW_HEADER . , :

public static class MyJTable extends JTable {
    public MyJTable(TableModel tm) {
        super(tm);
    }

    @Override
    public MyAccessibleJTable getAccessibleContext() {
        if (accessibleContext == null) {
            accessibleContext = new MyAccessibleJTable();
        }
        return (MyAccessibleJTable)accessibleContext;
    }

    protected class MyAccessibleJTable extends AccessibleJTable {

        @Override
        public int getAccessibleChildrenCount() {
            if (MyJTable.this.getColumnCount() <= 0) {
                return 0;
            }
            return MyJTable.this.getRowCount();
        }

        @Override
        public Accessible getAccessibleChild(int i) {
            if (i < 0 || getAccessibleChildrenCount() <= i) {
                return null;
            }
            TableColumn firstColumn = getColumnModel().getColumn(0);
            TableCellRenderer renderer = firstColumn.getCellRenderer();
            if (renderer == null) {
                Class<?> columnClass = getColumnClass(0);
                renderer = getDefaultRenderer(columnClass);
            }
            Component component = renderer.getTableCellRendererComponent(MyJTable.this, null, false, false, i, 0);
            return new MyAccessibleRow(MyJTable.this, i, component);
        }
    }

    protected static class MyAccessibleRow extends AccessibleContext implements Accessible {
        private MyJTable table;
        private int row;
        private Component rendererComponent;

        protected MyAccessibleRow(MyJTable table, int row, Component renderComponent) {
            this.table = table;
            this.row = row;
            this.rendererComponent = rendererComponent;
        }

        @Override
        public AccessibleRole getAccessibleRole() {
            // ROW_HEADER is used because it maps to NSAccessibilityRowRole
            // on Mac.
            return AccessibleRole.ROW_HEADER;
        }

        @Override
        public Locale getLocale() {
            AccessibleContext ac = rendererComponent.getAccessibleContext();
            if (ac != null) {
                return ac.getLocale();
            } else {
                return null;
            }
        }

        @Override
        public int getAccessibleChildrenCount() {
            return 0; // TODO return the number of columns in this row
        }
        @Override
        public Accessible getAccessibleChild(int i) {
            return null; // TODO return a MyAccessibleJTableCell
        }
        @Override
        public int getAccessibleIndexInParent() {
            return row;
        }
        @Override
        public AccessibleStateSet getAccessibleStateSet() {
            return null; // TODO
        }
        @Override
        public AccessibleContext getAccessibleContext() {
            return this; // TODO
        }
        @Override
        public AccessibleComponent getAccessibleComponent() {
            return table.getAccessibleContext(); // TODO
        }
    }
}

:

Screenshot showing sample code running Accessibility Inspector

.. AXTable AXRow. VoiceOver - "" . , , AXCell AXTable - .

AccessibleContext, , . , , . , Firefox ( 39.0). Mac Firefox HTML. Firefox 41. . 744790 - [Mac] HTML- HTML VoiceOver .

Mac OS 10.10.4 Java 1.8.0_51.

: "" OpenJDK Bug JDK-7124284 [macosx] VoiceOver . Mac Swing, JDK 9.

- JavaFX TableView. TableView http://docs.oracle.com/javafx/2/ui_controls/table-view.htm , VoiceOver . JavaFX JEP 204, Java 8u40.

+3

Java Java 7 Java 8, Java .

Java, , , JAWS, NonVisual Desktop Access (NVDA), SuperNova, Window-Eyes .. . Windows. http://docs.oracle.com/javase/7/docs/technotes/guides/access/enable_and_test.html

OSX 10.10.4 (Yosemite), . .

0

All Articles