954,518 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?
Have something to say? Contribute New Article Reply to this Article

jComboBox getSelectedIndex

Just had a quick question about my code. Seems like a very simple solution, perhaps I'm just too sleepy to think straight.

What I am wanting to do is if a certain index is selected in my combobox i want certain textfields to display which is apparent by the code:

private void jComboBox1ActionPerformed(java.awt.event.ActionEvent evt) {                                           
    if (jComboBox1.getSelectedIndex == 0) {
        aTextField.setVisible(true);     
    }
    else if (jComboBox1.getSelectedIndex == 1) {
        aTextField.setVisible(true);
        bTextField.setVisible(true);
    }
    else if (jComboBox1.getSelectedIndex == 2) {
        aTextField.setVisible(true);
        bTextField.setVisible(true);
        cTextField.setVisible(true);
    }
    else if (jComboBox1.getSelectedIndex == 3) {
        aTextField.setVisible(true);
        bTextField.setVisible(true);
        cTextField.setVisible(true);
        dTextField.setVisible(true);
    }
    else if (jComboBox1.getSelectedIndex == 4) {
        aTextField.setVisible(true);
        bTextField.setVisible(true);
        cTextField.setVisible(true);
        dTextField.setVisible(true);
        eTextField.setVisible(true);
    }
    else if (jComboBox1.getSelectedIndex == 5) {
        aTextField.setVisible(true);
        bTextField.setVisible(true);
        cTextField.setVisible(true);
        dTextField.setVisible(true);
        eTextField.setVisible(true);
        fTextField.setVisible(true);
    }
    else if (jComboBox1.getSelectedIndex == 6) {
        aTextField.setVisible(true);
        bTextField.setVisible(true);
        cTextField.setVisible(true);
        dTextField.setVisible(true);
        eTextField.setVisible(true);
        fTextField.setVisible(true);
        gTextField.setVisible(true);
    }
    else if (jComboBox1.getSelectedIndex == 7) {
        aTextField.setVisible(true);
        bTextField.setVisible(true);
        cTextField.setVisible(true);
        dTextField.setVisible(true);
        eTextField.setVisible(true);
        fTextField.setVisible(true);
        gTextField.setVisible(true);
        hTextField.setVisible(true);
    }
    else if (jComboBox1.getSelectedIndex == 8) {
        aTextField.setVisible(true);
        bTextField.setVisible(true);
        cTextField.setVisible(true);
        dTextField.setVisible(true);
        eTextField.setVisible(true);
        fTextField.setVisible(true);
        gTextField.setVisible(true);
        hTextField.setVisible(true);
        iTextField.setVisible(true);
    }
    else (jComboBox1.getSelectedIndex == 9) {
        aTextField.setVisible(true);
        bTextField.setVisible(true);
        cTextField.setVisible(true);
        dTextField.setVisible(true);
        eTextField.setVisible(true);
        fTextField.setVisible(true);
        gTextField.setVisible(true);
        hTextField.setVisible(true);
        iTextField.setVisible(true);
        jTextField.setVisible(true);
    }
}


Perhaps I'm just not paying attention close enough, but shouldn't that code work?

KirkPatrick
Junior Poster
162 posts since Apr 2009
Reputation Points: 38
Solved Threads: 8
 

If your code is an ActionL:istener, you're probably listening for the wrong event to see if the selection has changed. You probably need an ItemListener.

JamesCherrill
Posting Genius
Moderator
6,371 posts since Apr 2008
Reputation Points: 2,130
Solved Threads: 1,073
 

There is no condition on an "else" clause, so this isn't valid syntax

else (jComboBox1.getSelectedIndex == 9)


.

The bigger question is why not use a switch or even better yet, an array of text fields so you don't have so much manually repetitive code.

Ezzaral
Posting Genius
Moderator
15,986 posts since May 2007
Reputation Points: 3,250
Solved Threads: 847
 
If your code is an ActionL:istener, you're probably listening for the wrong event to see if the selection has changed. You probably need an ItemListener.

I went ahead and tried it for my itemListener with the same luck. This may be a solution to a question later in the situation, but for right now its some sort of syntax error. (its supposed to be .getSelectedIndex(int) but that didn't work which is why I tried .getSelectedIndex == 0)

I apologize as I thought I mentioned that it is a syntax error, and that it doesn't actually compile. I thought I had typed that, but looking back on my post, I didn't.There is no condition on an "else" clause, so this isn't valid syntax

Indeed, was typing on a whim. That part has been fixed now.The bigger question is why not use a switch or even better yet, an array of text fields so you don't have so much manually repetitive code.

I was typing it quickly to have an example as it seemed like a logical way to do it. Also if I'm not mistaken a switch statement would be nearly as many lines of code. As for an array of text fields, all in all it would still be just about as many lines of code but it would look cleaner to do it that way.

I'm not sure why I'm off on this one. I think I'm aiming a bit too much toward javascript instead of java

KirkPatrick
Junior Poster
162 posts since Apr 2009
Reputation Points: 38
Solved Threads: 8
 
As for an array of text fields, all in all it would still be just about as many lines of code but it would look cleaner to do it that way.

Well, I would say this is a few less lines

for (int i=0; i<jComboBox1.getSelectedIndex(); i++) {
    textFields[i].setVisible(true);
}


A fall-through switch is more hard-coding than I would prefer, but still far fewer than that if-else block (which could really be just a series of if() statements to eliminate the repetitive statements.)

switch (jComboBox1.getSelectedIndex()){
    case 2:
        cTextField.setVisible(true);
        // fall through
    case 1:
        bTextField.setVisible(true);
        // fall through
    case 0:
        aTextField.setVisible(true);
}
Ezzaral
Posting Genius
Moderator
15,986 posts since May 2007
Reputation Points: 3,250
Solved Threads: 847
 

Oh wow, I was thinking of it in a completely different way for the array and for the switch statement. I retract my previous statement :) as you have proven me wrong. Thanks for showing me that, could come in handy.

Any suggestions as to why its saying I can't set it up with my .getSelectedIndex() ?

KirkPatrick
Junior Poster
162 posts since Apr 2009
Reputation Points: 38
Solved Threads: 8
 
Any suggestions as to why its saying I can't set it up with my .getSelectedIndex() ?


The only problems I really saw with the if() block code you posted up above was the lack of parenthesis for the "getSelectedIndex" method calls and the condition statement on the else portion, which I mentioned previously. If neither of those are the problem, you'll need to post the exact error message and stack trace.

Ezzaral
Posting Genius
Moderator
15,986 posts since May 2007
Reputation Points: 3,250
Solved Threads: 847
 

I added that parenthesis and still had the same problem, no worries I just went ahead and used the method you showed me. Thanks againfor the help

KirkPatrick
Junior Poster
162 posts since Apr 2009
Reputation Points: 38
Solved Threads: 8
 

Just making a post to note that I unchecked it from being solved (sorry for double post)

I just now got to implementing the switch statement and its not working either :/

Here is what I've done...

I set all my textfields to visibility false and then put in the switch statement in both the ActionPerformed and ItemStateChange and for some reason it just keeps my textsfields set to false.

It compiles and everything fine, just doesn't perform the action.

Oh and just an update as to my original question of the syntax not working (in my first post) it was because my syntax, just a stupid mistake. This fixes the error for the first one, however like the switch statement has no effect when something is selected in the combobox

if (jComboBox1.getSelectedIndex() == 0) {
        aTextField.setVisible(true);     
    }


Any ideas?

KirkPatrick
Junior Poster
162 posts since Apr 2009
Reputation Points: 38
Solved Threads: 8
 

Are you certain that you have added the listeners to the jComboBox1 control? You would need to post the full code to track it down further.

Ezzaral
Posting Genius
Moderator
15,986 posts since May 2007
Reputation Points: 3,250
Solved Threads: 847
 

Well I'm using netbeans ide so I figured actionPerformed took care of the listeners with the ActionEvent evt

public myApp() {
        initComponents();
        
        aTextField.setVisible(false);
        bTextField.setVisible(false);
        cTextField.setVisible(false);
        dTextField.setVisible(false);
        eTextField.setVisible(false);
        fTextField.setVisible(false);
        gTextField.setVisible(false);
        hTextField.setVisible(false);
        iTextField.setVisible(false);
        jTextField.setVisible(false);
        
    setTitle("MyApp");

    }
private void jComboBox1ActionPerformed(java.awt.event.ActionEvent evt) {                                           
    
    switch (jComboBox1.getSelectedIndex()){
        case 9:
            jTextField.setVisible(true);
            break;
        case 8:
            iTextField.setVisible(true);
            break;
        case 7:
            hTextField.setVisible(true);
            break;
        case 6:
            gTextField.setVisible(true);
            break;
        case 5:
            fTextField.setVisible(true);
            break;
        case 4:
            eTextField.setVisible(true);
            break;
        case 3:
            dTextField.setVisible(true);
            break;
        case 2:
            cTextField.setVisible(true);
            break;
        case 1:
            bTextField.setVisible(true);
            break;
        case 0:
            aTextField.setVisible(true);
            break;
}
KirkPatrick
Junior Poster
162 posts since Apr 2009
Reputation Points: 38
Solved Threads: 8
 

Yes, that should be the case. If you're using netbeans to debug it, set a break point on the switch statement.

One note on your switch though. If you want to it to perform like the series of if() statements you had earlier, you need to remove the break statements and let the cases fall through so they are additive.

Ezzaral
Posting Genius
Moderator
15,986 posts since May 2007
Reputation Points: 3,250
Solved Threads: 847
 

Since you need to set visible true or false for every field, maybe now is a good time to re-visit the array of fields solution

for (int i = 0; i < 10; i++) {
   arrayOfFields[i].setVisible(i<= ComboBox1.getSelectedIndex());
}
JamesCherrill
Posting Genius
Moderator
6,371 posts since Apr 2008
Reputation Points: 2,130
Solved Threads: 1,073
 

ah yes, that would make sense since I want it to continue going through each case below it without stopping. Thanks for informing me bud.

Anyways I think my problem was setting all my textfields to true above my switch statement. For some reason that was throwing it off. I might have to override it when doing a switch.

On a side note I went ahead and test some things out. (After going through it and put some print statements in on the switch statement which proved it to be working just not being able to over ride the setVisible(true) above it.

I did run into a problem though as I was testing it with if else statements. Since the textfields were automatically set true I had a problem with just trying to set certain ones true or false and had to make it specific for each text field like so:

if (jComboBox1.getSelectedIndex() == 0) {
        Dcc1TextField.setVisible(true);
        Dcc2TextField.setVisible(false);
        Dcc3TextField.setVisible(false);
        Dcc4TextField.setVisible(false);
        Dcc5TextField.setVisible(false);
        Dcc6TextField.setVisible(false);
        Dcc7TextField.setVisible(false);
        Dcc8TextField.setVisible(false);
        Dcc9TextField.setVisible(false);
        Dcc10TextField.setVisible(false);   
    }
    else if (jComboBox1.getSelectedIndex() == 1) {
        Dcc1TextField.setVisible(true);
        Dcc2TextField.setVisible(true);
        Dcc3TextField.setVisible(false);
        Dcc4TextField.setVisible(false);
        Dcc5TextField.setVisible(false);
        Dcc6TextField.setVisible(false);
        Dcc7TextField.setVisible(false);
        Dcc8TextField.setVisible(false);
        Dcc9TextField.setVisible(false);
        Dcc10TextField.setVisible(false); 
    }
...and so on


When trying to do it by just telling which ones to setVisible(true) or setVisible(false) it occasionally wouldn't update the GUI.

Using the switch statement also caused problems with the GUI. For example when index 9 was chosen it would display 10 textfields, then index 4 was chosen and it would show 5 textfields, and then choosing index 9 again instead of showing 10 textfields it would stay with 5 textfields.

So basically I figured out why it wasn't displaying them, but now I am intrigued with the switch statement you have shown me and I guess I was wondering if there is a way to get it working with the way my if else statement now works?

Thanks again for your continuous help bud


*Edit*

Just noticed that JamesCherrill has also replied. So would this array of fields also solve the problem of certain textfields not showing up? Judging from the looks of it, it should. However I have a question as I get confused with loops. For the arrayOfFields, I assume I would have to make an array which contains each field name in sequential order?Since you need to set visible true or false for every field, maybe now is a good time to re-visit the array of fields solution
Help with Code Tags
java Syntax (Toggle Plain Text)

for (int i = 0; i < 10; i++) {
      arrayOfFields[i].setVisible(i<= ComboBox1.getSelectedIndex());
   
      }
KirkPatrick
Junior Poster
162 posts since Apr 2009
Reputation Points: 38
Solved Threads: 8
 

Hi. I'm suggesting the array/loop approach because if you have 10 of anything without them being in an array, you will end up with 10 almost identical blocks of code for everything you do.
You can just set them up in the array from scratch, then refer to them by array[i] rather than field1, field2 etc

JTextField[] arrayOfFields = new JTextField[10];
for (int i = 0; i < 10; i++) { 
   arrayOfFields[i] = new JTextField("");
   form.add(arrayOfFields[i]);
   arrayOfFields[i]. // etc etc
}
JamesCherrill
Posting Genius
Moderator
6,371 posts since Apr 2008
Reputation Points: 2,130
Solved Threads: 1,073
 

This question has already been solved

Post: Markdown Syntax: Formatting Help
You