After a superficial web search, I did not turn up a simple way (read cut and paste) to TAB over read-only components while navigating a container in Swing. JComboBox, JTextComponent and JTree all have an isEditable/setEditable(boolean) pair, however it has different meaning for each of them.
The case I am interested in JTextComponent. For text components, uneditable is equivalent to read-only: you can select the text from the component but cannot change it. The alternative is to disable the component, but then the text is not selectable for copying.
So, given a uneditable text component, what happens when I traverse through a form with the TAB key? Unfortunately, the JDK by default will move the focus (the caret) into the read-only text field even though you cannot type anything. Fixing the form to skip over read-only text fields is straight-forward but not directly documented:
public static void skipReadOnlyTextComponents(
final Container container) {
// Without this, JDK ignores policy
container.setFocusCycleRoot(true);
container.setFocusTraversalPolicy(new MyPolicy());
}
class MyPolicy extends LayoutFocusTraversalPolicy {
@Override
protected boolean accept(final Component c) {
return !isReadOnly(c) && super.accept(c);
}
private static boolean isReadOnly(
final Component c) {
if (c instanceof JTextComponent)
return !((JTextComponent) c).isEditable();
return false;
}
} In broader use, it is worthwhile to make an Editable interface for isEditable/setEditable and add that to the instanceof tests in isReadOnly.
No comments:
Post a Comment