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 ?

[559 byte] By [kool_dude_gaurava] at [2007-10-3 10:30:21]
# 1
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()
Michael_Dunna at 2007-7-15 5:53:00 > top of Java-index,Desktop,Core GUI APIs...
# 2

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:

kool_dude_gaurava at 2007-7-15 5:53:00 > top of Java-index,Desktop,Core GUI APIs...
# 3
dude Do not forget to click on code button, it really makes hard to understand your code.
Prashant_SDNa at 2007-7-15 5:53:00 > top of Java-index,Desktop,Core GUI APIs...
# 4

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:

kool_dude_gaurava at 2007-7-15 5:53:00 > top of Java-index,Desktop,Core GUI APIs...
# 5

try this

SwingUtilities.invokeLater(new Runnable()

{

public void run()

{

// put your code here

Spinner.requestFocusInWindow();

}

});

Prashant_SDNa at 2007-7-15 5:53:00 > top of Java-index,Desktop,Core GUI APIs...
# 6

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];

}

}

kool_dude_gaurava at 2007-7-15 5:53:00 > top of Java-index,Desktop,Core GUI APIs...