Как предотвратить перенаправление на выбранную вкладку в JTabbedPane?

я создал приложение в Java Swing.
Приложение представляет собой JFrame с JTabbedPane с 3 вкладками.

На первой панели есть флажок прогресса, если флажок установлен, то при нажатии на другие панели, т.е. на 2-й или 3-й панели, появится сообщение ERROR, показывающее «Вкладка 1 в процессе».

Проблема в том, что когда я нажимаю на другие панели, когда установлен флажок прогресса, он сначала переходит на панель, которую я выбрал, затем работает только перенаправление, а также сообщение об ошибке выполняется дважды.

Я каким-то образом предотвратил двойное выполнение сообщения об ошибке, но не могу предотвратить переход к щелкнутой панели, когда установлен флажок прогресса.

Может кто-нибудь, пожалуйста, скажите мне какое-нибудь решение этой проблемы.

мой полный код приведен ниже.

import javax.swing.JOptionPane;

public class sample extends javax.swing.JFrame {
public static int status=0;
    public sample() {
        initComponents();
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        tab = new javax.swing.JTabbedPane();
        jDesktopPane2 = new javax.swing.JDesktopPane();
        jLabel1 = new javax.swing.JLabel();
        progress = new javax.swing.JCheckBox();
        jDesktopPane4 = new javax.swing.JDesktopPane();
        jLabel2 = new javax.swing.JLabel();
        jDesktopPane5 = new javax.swing.JDesktopPane();
        jLabel3 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        tab.setTabLayoutPolicy(javax.swing.JTabbedPane.SCROLL_TAB_LAYOUT);
        tab.setTabPlacement(javax.swing.JTabbedPane.LEFT);
        tab.addChangeListener(new javax.swing.event.ChangeListener() {
            public void stateChanged(javax.swing.event.ChangeEvent evt) {
                tabStateChanged(evt);
            }
        });

        jDesktopPane2.setBackground(javax.swing.UIManager.getDefaults().getColor("Button.background"));

        jLabel1.setFont(new java.awt.Font("Tahoma", 1, 18)); // NOI18N
        jLabel1.setText("TABBED PANE 1  BODY ");
        jLabel1.setBounds(50, 60, 230, 40);
        jDesktopPane2.add(jLabel1, javax.swing.JLayeredPane.DEFAULT_LAYER);

        progress.setText("Progress");
        progress.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                progressItemStateChanged(evt);
            }
        });
        progress.setBounds(50, 40, 90, 23);
        jDesktopPane2.add(progress, javax.swing.JLayeredPane.DEFAULT_LAYER);

        tab.addTab("Tabbed Pane 1", jDesktopPane2);

        jDesktopPane4.setBackground(javax.swing.UIManager.getDefaults().getColor("Button.background"));

        jLabel2.setFont(new java.awt.Font("Tahoma", 1, 18)); // NOI18N
        jLabel2.setText("TABBED PANE 2  BODY ");
        jLabel2.setBounds(30, 90, 230, 40);
        jDesktopPane4.add(jLabel2, javax.swing.JLayeredPane.DEFAULT_LAYER);

        tab.addTab("Tabbed Pane 2", jDesktopPane4);

        jDesktopPane5.setBackground(javax.swing.UIManager.getDefaults().getColor("Button.background"));

        jLabel3.setFont(new java.awt.Font("Tahoma", 1, 18)); // NOI18N
        jLabel3.setText("TABBED PANE 3  BODY ");
        jLabel3.setBounds(60, 160, 230, 40);
        jDesktopPane5.add(jLabel3, javax.swing.JLayeredPane.DEFAULT_LAYER);

        tab.addTab("Tabbed Pane 3", jDesktopPane5);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(tab, javax.swing.GroupLayout.PREFERRED_SIZE, 402, javax.swing.GroupLayout.PREFERRED_SIZE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(tab, javax.swing.GroupLayout.DEFAULT_SIZE, 315, Short.MAX_VALUE)
        );

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

    private void progressItemStateChanged(java.awt.event.ItemEvent evt) {
      if(progress.isSelected())
          setStatus(1);
      else
          setStatus(0); 
    }

    private void tabStateChanged(javax.swing.event.ChangeEvent evt) {
       int o=getStatus();
       if(o==1)
       {
        JOptionPane.showMessageDialog(null, "Tabbed 1 Progress!!!", "Confirmation!!!",JOptionPane.ERROR_MESSAGE);
        setStatus(0);
        tab.setSelectedIndex(0);
        setStatus(1);
       }
    }

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
               sample s= new sample();
               s.setLocationRelativeTo(null);
               s.setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify
    private javax.swing.JDesktopPane jDesktopPane2;
    private javax.swing.JDesktopPane jDesktopPane4;
    private javax.swing.JDesktopPane jDesktopPane5;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JCheckBox progress;
    private javax.swing.JTabbedPane tab;
    // End of variables declaration

    public static void setStatus(int i) {
       status=i;
    }
    public static int getStatus()
    {
        return status;
    }
}

person Nidhish Krishnan    schedule 28.12.2012    source источник


Ответы (2)


это потому, что вы используете событие tabStateChanged, поэтому событие будет запускаться только при изменении вкладки, поэтому вы можете либо изменить тип события на щелчок, либо изменить код, чтобы сначала не отображать ошибку, а изменить выбранный Сначала вкладка, затем показать окно ошибки

int o=getStatus();
       if(o==1 && tab.getSelectedIndex() != 0) //if the selected index isn't 0 and the o == 1
       {
            tab.setSelectedIndex(0);
            JOptionPane.showMessageDialog(null, "Tabbed 1 Progress!!!", "Confirmation!!!",JOptionPane.ERROR_MESSAGE);
            //setStatus(0); delete this
            //setStatus(1); delete this
       }
person goravine    schedule 28.12.2012

Вы не можете использовать метод JTabbedPane ?

public void setEnabledAt(int index, boolean enabled)

в начале прогресса, чтобы предотвратить нажатие на отключенные вкладки

person StanislavL    schedule 28.12.2012