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

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

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

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

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

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

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

import javax.swing.JOptionPane;

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

    @SuppressWarnings("unchecked")
   //
    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();
    }// 

    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;
    }
}
1
nl ja de

2 ответы

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

public void setEnabledAt(int index, boolean enabled)

о начале выполнения, чтобы не нажимать на заблокированные вкладки

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
       }
2
добавлено
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async