JSpinner Focus Issues
Hi,
I am working on this swing screen where i have multiple components like textboxes ,combos,and some spinners(JSpinners)
Problem is that i have lost the default focus traversal policy as some components were deleted and some added.
To reslove this i wrote a custom FocusTraversal policy which is woking fine .
Only issues is when i tab form a text box to a JSpinner cursor does not appear inside it .But if i tab again cursor moves inside next component.
(Jspinner is enabled)
Can some one suggest how to do that ?
the spinner is made up of a number of components.sounds like focus is going to the spinner, not the spinner editor.instead of adding the instance of JSpinner to the custom traversal, add this((JSpinner.DefaultEditor)spinner.getEditor()).getTextField()
This my Taversal Policy
public final class ArrayFocusTraversalPolicy extends FocusTraversalPolicy
{
List list;
private final Component[] order;
public ArrayFocusTraversalPolicy(Component[] order)
{
super();
this.order = order;
list = Arrays.asList(order);
}
public Component getFirstComponent(Container focusCycleRoot) {
return order[0];
}
public Component getLastComponent(Container focusCycleRoot) {
return order[order.length-1];
}
public Component getComponentAfter(Container focusCycleRoot,
Component aComponent) {
return recursiveGetComponentAfter(focusCycleRoot, aComponent, 0);
}
private Component recursiveGetComponentAfter(Container focusCycleRoot,
Component aComponent, int iterNo)
{
if(iterNo >= order.length)
{
return getDefaultComponent(focusCycleRoot);
}
int index = list.indexOf(aComponent);
Component nextComp = order[(index + 1) % order.length];
if (nextComp.isEnabled()){
return nextComp;
}else{
return recursiveGetComponentAfter(focusCycleRoot,nextComp, iterNo++);
}
}
public Component getComponentBefore(Container focusCycleRoot,
Component aComponent) {
return recursiveGetComponentBefore(focusCycleRoot, aComponent, 0);
}
private Component recursiveGetComponentBefore(Container focusCycleRoot,
Component aComponent, int iterNo)
{
if(iterNo >= order.length)
{
return getDefaultComponent(focusCycleRoot);
}
int index = list.indexOf(aComponent);
Component nextComp = order[(index - 1 + order.length) % order.length];
if (nextComp.isEnabled()){
return nextComp;
}else{
return recursiveGetComponentBefore(focusCycleRoot,nextComp, iterNo++);
}
}
public Component getDefaultComponent(Container focusCycleRoot) {
return order[0];
}
}
And in my frame i am using this function to set components
private void setFocusOrder()
{
final Component order[] =
new Component[] {dsaTypeCombo, startTimeCombo, startTimeSpinner, stopTimeCombo,((JSpinner.DefaultEditor)stopTimeSpinner.getEditor()).getTextField() ,
dsaVolField,dsaOffsetSpinner , riskSlider,dsaPegStyleCombo ,compReqCheckbox,sessionPercentField};
FocusTraversalPolicy policy = new ArrayFocusTraversalPolicy(order);
this.setFocusTraversalPolicy(policy);
this.setFocusCycleRoot(true);
}
But ity does not work:
dude Do not forget to click on code button, it really makes hard to understand your code.
Srry m a new user :
This my Taversal Policy
public final class ArrayFocusTraversalPolicy extends FocusTraversalPolicy
{
List list;
private final Component[] order;
public ArrayFocusTraversalPolicy(Component[] order)
{
super();
this.order = order;
list = Arrays.asList(order);
}
public Component getFirstComponent(Container focusCycleRoot) {
return order[0];
}
public Component getLastComponent(Container focusCycleRoot) {
return order[order.length-1];
}
public Component getComponentAfter(Container focusCycleRoot,
Component aComponent) {
return recursiveGetComponentAfter(focusCycleRoot, aComponent, 0);
}
private Component recursiveGetComponentAfter(Container focusCycleRoot,
Component aComponent, int iterNo)
{
if(iterNo >= order.length)
{
return getDefaultComponent(focusCycleRoot);
}
int index = list.indexOf(aComponent);
Component nextComp = order[(index + 1) % order.length];
if (nextComp.isEnabled()){
return nextComp;
}else{
return recursiveGetComponentAfter(focusCycleRoot,nextComp, iterNo++);
}
}
public Component getComponentBefore(Container focusCycleRoot,
Component aComponent) {
return recursiveGetComponentBefore(focusCycleRoot, aComponent, 0);
}
private Component recursiveGetComponentBefore(Container focusCycleRoot,
Component aComponent, int iterNo)
{
if(iterNo >= order.length)
{
return getDefaultComponent(focusCycleRoot);
}
int index = list.indexOf(aComponent);
Component nextComp = order[(index - 1 + order.length) % order.length];
if (nextComp.isEnabled()){
return nextComp;
}else{
return recursiveGetComponentBefore(focusCycleRoot,nextComp, iterNo++);
}
}
public Component getDefaultComponent(Container focusCycleRoot) {
return order[0];
}
}
And in my frame i am using this function to set components
private void setFocusOrder()
{
final Component order[] =
new Component[] {dsaTypeCombo, startTimeCombo, startTimeSpinner, stopTimeCombo,((JSpinner.DefaultEditor)stopTimeSpinner.getEditor()).getTextField() ,
dsaVolField,dsaOffsetSpinner , riskSlider,dsaPegStyleCombo ,compReqCheckbox,sessionPercentField};
FocusTraversalPolicy policy = new ArrayFocusTraversalPolicy(order);
this.setFocusTraversalPolicy(policy);
this.setFocusCycleRoot(true);
}
But ity does not work:
try this
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
// put your code here
Spinner.requestFocusInWindow();
}
});
Well i have solved this ugly messy thing :
Solution :
/*
public final class ArrayFocusTraversalPolicy extends FocusTraversalPolicy
{
List list;
private final Component[] order;
public ArrayFocusTraversalPolicy(Component[] order)
{
super();
this.order = order;
list = Arrays.asList(order);
}
public Component getFirstComponent(Container focusCycleRoot) {
return order[0];
}
public Component getLastComponent(Container focusCycleRoot) {
return order[order.length-1];
}
public Component getComponentAfter(Container focusCycleRoot,
Component aComponent) {
return recursiveGetComponentAfter(focusCycleRoot, aComponent, 0);
}
private Component recursiveGetComponentAfter(Container focusCycleRoot,
Component aComponent, int iterNo)
{
if(iterNo >= order.length)
{
return getDefaultComponent(focusCycleRoot);
}
int index =0;
if(aComponent.getParent().getParent() instanceof JSpinner)
index= list.indexOf((JSpinner)aComponent.getParent().getParent());
else
index= list.indexOf(aComponent);
Component nextComp = order[(index + 1) % order.length];
boolean isPanelThere = false;
boolean isPanelVisible = false;
if(nextComp.getParent() instanceof JPanel)
{
isPanelThere = true;
if(((JPanel)nextComp.getParent()).isVisible())
isPanelVisible = true;
}
if(!isPanelThere)
{
if (nextComp.isEnabled()){
{
if( nextComp instanceof TranslatedSpinner)
{
return ((TranslatedSpinner.DefaultEditor)((TranslatedSpinner)nextComp).getEditor()).getTextField();
}else
if(nextComp instanceof JSpinner )
{
return ((JSpinner.DefaultEditor)((JSpinner)nextComp).getEditor()).getTextField();
}
else
return nextComp;
}
}else{
return recursiveGetComponentAfter(focusCycleRoot,nextComp, iterNo++);
}
}
else
{
if (isPanelVisible && nextComp.isEnabled()){
{
if( nextComp instanceof TranslatedSpinner)
{
return ((TranslatedSpinner.DefaultEditor)((TranslatedSpinner)nextComp).getEditor()).getTextField();
}else
if(nextComp instanceof JSpinner )
{
return ((JSpinner.DefaultEditor)((JSpinner)nextComp).getEditor()).getTextField();
}
else
return nextComp;
}
}else{
return recursiveGetComponentAfter(focusCycleRoot,nextComp, iterNo++);
}
}
}
public Component getComponentBefore(Container focusCycleRoot,
Component aComponent) {
return recursiveGetComponentBefore(focusCycleRoot, aComponent, 0);
}
private Component recursiveGetComponentBefore(Container focusCycleRoot,
Component aComponent, int iterNo)
{
if(iterNo >= order.length)
{
return getDefaultComponent(focusCycleRoot);
}
int index =0;
if(aComponent.getParent().getParent() instanceof JSpinner)
index= list.indexOf((JSpinner)aComponent.getParent().getParent());
else
index= list.indexOf(aComponent);
Component nextComp = order[(index - 1 + order.length) % order.length];
boolean isPanelThere = false;
boolean isPanelVisible = false;
if(nextComp.getParent() instanceof JPanel)
{
isPanelThere = true;
if(((JPanel)nextComp.getParent()).isVisible())
isPanelVisible = true;
}
if(!isPanelThere)
{
if (nextComp.isEnabled()){
{
if( nextComp instanceof TranslatedSpinner)
{
return ((TranslatedSpinner.DefaultEditor)((TranslatedSpinner)nextComp).getEditor()).getTextField();
}else
if(nextComp instanceof JSpinner )
{
return ((JSpinner.DefaultEditor)((JSpinner)nextComp).getEditor()).getTextField();
}
else
return nextComp;
}
}else{
return recursiveGetComponentBefore(focusCycleRoot,nextComp, iterNo++);
}
}
else
{
if (isPanelVisible && nextComp.isEnabled()){
{
if( nextComp instanceof TranslatedSpinner)
{
return ((TranslatedSpinner.DefaultEditor)((TranslatedSpinner)nextComp).getEditor()).getTextField();
}else
if(nextComp instanceof JSpinner )
{
return ((JSpinner.DefaultEditor)((JSpinner)nextComp).getEditor()).getTextField();
}
else
return nextComp;
}
}else{
return recursiveGetComponentBefore(focusCycleRoot,nextComp, iterNo++);
}
}
}
public Component getDefaultComponent(Container focusCycleRoot) {
return order[0];
}
}
