ComboBox: getSelectedIndex () ведет себя неправильно при повторном выборе - PullRequest
0 голосов
/ 06 октября 2018

Идентификатор моего поля со списком: cmbYear.

Элементы: 1800, 1801, 1802, 1803, ... ... ..., 2017, 2018.

Затем я запускаю проект.Когда я выбираю 1801 в пользовательском интерфейсе, getSelectedIndex() возвращает 1 (как напечатано в консоли), что верно.

В том же прогоне, если я снова выбираю, скажем, 1802, getSelectedIndex()still возвращает 1. При каждом последующем выборе getSelectedIndex() возвращает 1, то есть первый выбранный индекс.

getSelectedIndex() вызывается из метода cmbYearActionPerformed(java.awt.event.ActionEvent evt).

Как исправитьэто плохое поведение, пожалуйста?

Ниже приведены соответствующие строки.

 /*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package agecalcagain.UI;

import java.awt.event.ItemEvent;
import java.util.Calendar;
import javax.swing.JComboBox;

/**
 *
 * @author MuhammadRaselParvej
 */
public class AgeCalcAgain extends javax.swing.JFrame {

    private Integer[] yearList;
    private Integer[] dayList;
    private int selectedMonthIndex=0;
    private int selectedYearIndex=0;

    private void newMonthIndex(){
       selectedMonthIndex = cmbMonth.getSelectedIndex(); 
       System.out.println("Yes, new month :"+ String.valueOf(months[selectedMonthIndex]));
    }

    private void newYearIndex(){
        selectedYearIndex = cmbYear.getSelectedIndex();
        System.out.println("Yes, new year :"+ yearList[selectedYearIndex]);
    }

    int p=1;

    Calendar today = Calendar.getInstance();
    String months[] = new String[]{"January", "February", "March", "April", "May", "June",
        "July", "August", "September", "October", "November", "December"};
    String eras[] = new String[]{"BC", "AD"};

    /**
     * Creates new form AgeCalcAgain
     */
    private void updateYearList() {
        int n = today.get(Calendar.YEAR);
        n = n - 1800 + 1;
        yearList = new Integer[n];

        for (int i = 0; i < n; i++) {
            yearList[i] = 1800 + i;
        }
    }

    private void updateDayList() {
        System.out.println("In updateDayList **************** "+ p++);
        int n = yearList[selectedYearIndex];
        System.out.println("n "+n);
        n = n % 100 == 0 ? n / 100 : n;
        System.out.println("n "+n);
        int m;
        m = selectedMonthIndex;
        m++;
        System.out.println("m "+m);
        int numberOfDays = 28;
        if (m == 2 && n % 4 == 0) {
            numberOfDays++;
        } else if (m != 2) {
            numberOfDays += 2;
        }
        if (m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12) {
            numberOfDays++;
        }
        dayList = new Integer[numberOfDays];
        for (int i = 0; i < numberOfDays; i++) {
            dayList[i] = i + 1;
        }
        System.out.println(numberOfDays);
    }

    private void createTempCmbMonth() {
        cmbMonth = new JComboBox<String>(months);
    }

    private void createTempCmbYear() {
        cmbYear = new JComboBox<>(yearList);
    }

    public AgeCalcAgain() {
        updateYearList();
        createTempCmbYear();
        createTempCmbMonth();
        updateDayList();
        myInitComponents();

        this.lbl01.setText("Today is " + today.get(Calendar.DATE) + " "
                + months[today.get(Calendar.MONTH)] + ", " + today.get(Calendar.YEAR) + " " + eras[today.get(Calendar.ERA)]);

    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        lbl01 = new javax.swing.JLabel();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        jLabel4 = new javax.swing.JLabel();
        cmbDay = new javax.swing.JComboBox<>();
        cmbYear = new javax.swing.JComboBox<>();
        cmbMonth = new javax.swing.JComboBox<>();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setMinimumSize(new java.awt.Dimension(500, 500));
        setPreferredSize(new java.awt.Dimension(500, 500));
        getContentPane().setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

        lbl01.setFont(new java.awt.Font("Arial Narrow", 0, 20)); // NOI18N
        lbl01.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        lbl01.setBorder(javax.swing.BorderFactory.createCompoundBorder(javax.swing.BorderFactory.createCompoundBorder(), javax.swing.BorderFactory.createCompoundBorder(javax.swing.BorderFactory.createCompoundBorder(javax.swing.BorderFactory.createCompoundBorder(), javax.swing.BorderFactory.createCompoundBorder()), javax.swing.BorderFactory.createCompoundBorder())));
        getContentPane().add(lbl01, new org.netbeans.lib.awtextra.AbsoluteConstraints(70, 30, 270, 20));

        jLabel1.setFont(new java.awt.Font("Arial Narrow", 0, 20)); // NOI18N
        jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel1.setText("Enter Your Birthdate");
        getContentPane().add(jLabel1, new org.netbeans.lib.awtextra.AbsoluteConstraints(120, 70, 180, 20));

        jLabel2.setFont(new java.awt.Font("Arial Narrow", 0, 20)); // NOI18N
        jLabel2.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel2.setText("Birthday");
        getContentPane().add(jLabel2, new org.netbeans.lib.awtextra.AbsoluteConstraints(120, 200, 80, -1));

        jLabel3.setFont(new java.awt.Font("Arial Narrow", 0, 20)); // NOI18N
        jLabel3.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel3.setText("Birthyear");
        getContentPane().add(jLabel3, new org.netbeans.lib.awtextra.AbsoluteConstraints(120, 110, 80, 30));

        jLabel4.setFont(new java.awt.Font("Arial Narrow", 0, 20)); // NOI18N
        jLabel4.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel4.setText("Birthmonth");
        getContentPane().add(jLabel4, new org.netbeans.lib.awtextra.AbsoluteConstraints(120, 150, 80, 30));

        cmbDay.setFont(new java.awt.Font("Arial Narrow", 0, 20)); // NOI18N
        cmbDay.setModel(new javax.swing.DefaultComboBoxModel<>(dayList));
        cmbDay.setSelectedItem(1);
        cmbDay.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cmbDayActionPerformed(evt);
            }
        });
        getContentPane().add(cmbDay, new org.netbeans.lib.awtextra.AbsoluteConstraints(210, 200, 120, 30));

        cmbYear.setFont(new java.awt.Font("Arial Narrow", 0, 20)); // NOI18N
        cmbYear.setModel(new javax.swing.DefaultComboBoxModel<>(yearList));
        cmbYear.setSelectedItem(yearList[selectedYearIndex]);
        cmbYear.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                cmbYearItemStateChanged(evt);
            }
        });
        cmbYear.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cmbYearActionPerformed(evt);
            }
        });
        getContentPane().add(cmbYear, new org.netbeans.lib.awtextra.AbsoluteConstraints(210, 110, 120, 30));

        cmbMonth.setFont(new java.awt.Font("Arial Narrow", 0, 20)); // NOI18N
        cmbMonth.setModel(new javax.swing.DefaultComboBoxModel<>(months));
        cmbMonth.setSelectedItem(months[selectedMonthIndex]);
        cmbMonth.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                cmbMonthItemStateChanged(evt);
            }
        });
        cmbMonth.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cmbMonthActionPerformed(evt);
            }
        });
        cmbMonth.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
            public void propertyChange(java.beans.PropertyChangeEvent evt) {
                cmbMonthPropertyChange(evt);
            }
        });
        getContentPane().add(cmbMonth, new org.netbeans.lib.awtextra.AbsoluteConstraints(210, 150, 120, 30));

        pack();
    }// </editor-fold>                        

    private void myInitComponents() {

        lbl01 = new javax.swing.JLabel();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        jLabel4 = new javax.swing.JLabel();
        cmbDay = new javax.swing.JComboBox<>();
        cmbYear = new javax.swing.JComboBox<>();
        cmbMonth = new javax.swing.JComboBox<>();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setMinimumSize(new java.awt.Dimension(500, 500));
        setPreferredSize(new java.awt.Dimension(500, 500));
        getContentPane().setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

        lbl01.setFont(new java.awt.Font("Arial Narrow", 0, 20)); // NOI18N
        lbl01.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        lbl01.setBorder(javax.swing.BorderFactory.createCompoundBorder(javax.swing.BorderFactory.createCompoundBorder(), javax.swing.BorderFactory.createCompoundBorder(javax.swing.BorderFactory.createCompoundBorder(javax.swing.BorderFactory.createCompoundBorder(), javax.swing.BorderFactory.createCompoundBorder()), javax.swing.BorderFactory.createCompoundBorder())));
        getContentPane().add(lbl01, new org.netbeans.lib.awtextra.AbsoluteConstraints(70, 30, 270, 20));

        jLabel1.setFont(new java.awt.Font("Arial Narrow", 0, 20)); // NOI18N
        jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel1.setText("Enter Your Birthdate");
        getContentPane().add(jLabel1, new org.netbeans.lib.awtextra.AbsoluteConstraints(120, 70, 180, 20));

        jLabel2.setFont(new java.awt.Font("Arial Narrow", 0, 20)); // NOI18N
        jLabel2.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel2.setText("Birthday");
        getContentPane().add(jLabel2, new org.netbeans.lib.awtextra.AbsoluteConstraints(120, 200, 80, -1));

        jLabel3.setFont(new java.awt.Font("Arial Narrow", 0, 20)); // NOI18N
        jLabel3.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel3.setText("Birthyear");
        getContentPane().add(jLabel3, new org.netbeans.lib.awtextra.AbsoluteConstraints(120, 110, 80, 30));

        jLabel4.setFont(new java.awt.Font("Arial Narrow", 0, 20)); // NOI18N
        jLabel4.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel4.setText("Birthmonth");
        getContentPane().add(jLabel4, new org.netbeans.lib.awtextra.AbsoluteConstraints(120, 150, 80, 30));



        cmbYear.setFont(new java.awt.Font("Arial Narrow", 0, 20)); // NOI18N
        cmbYear.setModel(new javax.swing.DefaultComboBoxModel<>(yearList));
        cmbYear.setSelectedItem(yearList[selectedYearIndex]);
        cmbYear.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                cmbYearItemStateChanged(evt);
            }
        });
        cmbYear.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cmbYearActionPerformed(evt);
            }
        });
        getContentPane().add(cmbYear, new org.netbeans.lib.awtextra.AbsoluteConstraints(210, 110, 120, 30));

        cmbMonth.setFont(new java.awt.Font("Arial Narrow", 0, 20)); // NOI18N
        cmbMonth.setModel(new javax.swing.DefaultComboBoxModel<>(months));
        cmbMonth.setSelectedItem(months[selectedMonthIndex]);
        cmbMonth.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                cmbMonthItemStateChanged(evt);
            }
        });
        cmbMonth.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cmbMonthActionPerformed(evt);
            }
        });
        cmbMonth.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
            public void propertyChange(java.beans.PropertyChangeEvent evt) {
                cmbMonthPropertyChange(evt);
            }
        });
        getContentPane().add(cmbMonth, new org.netbeans.lib.awtextra.AbsoluteConstraints(210, 150, 120, 30));


        cmbDay.setFont(new java.awt.Font("Arial Narrow", 0, 20)); // NOI18N
        cmbDay.setModel(new javax.swing.DefaultComboBoxModel<>(dayList));
        cmbDay.setSelectedItem(1);
        cmbDay.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cmbDayActionPerformed(evt);
            }
        });
        getContentPane().add(cmbDay, new org.netbeans.lib.awtextra.AbsoluteConstraints(210, 200, 120, 30));

        pack();
    }// </editor-fold>                        



    private void cmbYearActionPerformed(java.awt.event.ActionEvent evt) {                                        
        // TODO add your handling code here:
        newYearIndex();
        updateDayList();
        myInitComponents();

    }                                       


    private void cmbMonthActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // TODO add your handling code here:
        newMonthIndex();
        updateDayList();
        myInitComponents();
    }                                        

    private void cmbDayActionPerformed(java.awt.event.ActionEvent evt) {                                       
        // TODO add your handling code here:
    }                                      

    private void cmbMonthPropertyChange(java.beans.PropertyChangeEvent evt) {                                        
        // TODO add your handling code here:
    }                                       

    private void cmbMonthItemStateChanged(java.awt.event.ItemEvent evt) {                                          
               // TODO add your handling code here:
    }                                         

    private void cmbYearItemStateChanged(java.awt.event.ItemEvent evt) {                                         
        // TODO add your handling code here:

    }                                        

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(AgeCalcAgain.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(AgeCalcAgain.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(AgeCalcAgain.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(AgeCalcAgain.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new AgeCalcAgain().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JComboBox<Integer> cmbDay;
    private javax.swing.JComboBox<String> cmbMonth;
    private javax.swing.JComboBox<Integer> cmbYear;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel lbl01;
    // End of variables declaration                   
}   

1 Ответ

0 голосов
/ 06 октября 2018

Делайте , а не , вызывайте myInitComponents() в своем слушателе, так как в этом методе вы создаете совершенно новые компоненты графического интерфейса, все они устанавливаются в исходное состояние, и это вызывает у вас большие проблемы.Вместо этого напишите код, который устанавливает текущие компоненты обратно в исходное состояние (или в любое другое состояние).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...