Search code examples
javaswitch-statementjava-17

Problem while using switch statement in my Java program


I have a jTabbedPane in my program. When I click on a tab, I need to awake a specific method. I used a switch statement to invoke each method by catching the StateChange event. This is my code.

jTabbedPane :

private javax.swing.JTabbedPane jTabbedPane1;
jTabbedPane1 = new javax.swing.JTabbedPane();
jTabbedPane1.setBorder(javax.swing.BorderFactory.createEtchedBorder());
jTabbedPane1.setTabPlacement(javax.swing.JTabbedPane.LEFT);
jTabbedPane1.addChangeListener(new javax.swing.event.ChangeListener() {
    public void stateChanged(javax.swing.event.ChangeEvent evt) {
        jTabbedPane1StateChanged(evt);
    }
});
jTabbedPane1.addTab("tab0", jPanel0);
jTabbedPane1.addTab("tab1", jPanel1);
jTabbedPane1.addTab("tab2", jPanel2);
jTabbedPane1.addTab("tab3", jPanel3);
jTabbedPane1.addTab("tab4", jPanel4);
jTabbedPane1.addTab("tab5", jPanel5);

Event Handler:

private void jTabbedPane1StateChanged(javax.swing.event.ChangeEvent evt) {
  switch (jTabbedPane1.getSelectedIndex()) {
     case 0:
       method0();
     case 1:
       method1();
     case 2:
       method2();
     case 3:
       method3();
     case 4:
       method4();
     case 5:
       method5();
  }
}

But, when I click on a tab, all methods are called. No error was shown. I'm using JDK 17.

java 17.0.6 2023-01-17 LTS
Java(TM) SE Runtime Environment (build 17.0.6+9-LTS-190)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.6+9-LTS-190, mixed mode, sharing)

When I use the if statement instead of the switch statement, the code is working perfectly.

private void jTabbedPane1StateChanged(javax.swing.event.ChangeEvent evt) {
  if (jTabbedPane1.getSelectedIndex() == 0) {
    method0();
  }
  if (jTabbedPane1.getSelectedIndex() == 1) {
    method1();
  }
  if (jTabbedPane1.getSelectedIndex() == 2) {
    method2();
  }
  if (jTabbedPane1.getSelectedIndex() == 3) {
    method3();
  }
  if (jTabbedPane1.getSelectedIndex() == 4) {
    method4();
  }
  if (jTabbedPane1.getSelectedIndex() == 5) {
    method5();
  }
}

What is the problem there?


Solution

  • You need to add "break" to switc-case definitions. When a switch statemnt matches, you need to prevent other matching checking.

    You can use like this:

        switch (a) {
            case 0:
                System.out.println(0);
                break;
            case 1:
                System.out.println(1);
                break;
            case 2:
                System.out.println(2);
                break;
            case 3:
                System.out.println(3);
                break;
            case 4:
                System.out.println(4);
                break;
            case 5:
                System.out.println(5);
                break;
        }