В Java, как вы перехватываете событие до переключения на новый JTab?

как вы перехватываете событие перед переключением на новую вкладку? В каждой вкладке у меня есть JTable, и я что-то делаю с его данными (удаляю, добавляю, обновляю). Я хотел бы выполнить проверку данных (сохранить или отменить изменения) перед переходом на новую вкладку. Я использую Яву 1.5.

class ViewPanel extends JPanel 
  {

    private void Components() {
    setPreferredSize(new Dimension(700, 400));

    tabbedPane.addTab("DC", ANSFER.getIcon(),new DcTabPanel(this), "DC");
    tabbedPane.addTab("PC", THUMB4.getIcon(),new PcTabPanel(this), "PC");

    tabbedPane.addChangeListener(this);
    add(tabbedPane);
     }


     public void stateChanged(ChangeEvent e) {

     }

   }

person itro    schedule 13.06.2012    source источник
comment
Я не совсем уверен, что понимаю ваш вопрос. Вам нужно быть более конкретным.   -  person OmniOwl    schedule 13.06.2012
comment
@Vipar ОП хочет определить, когда вкладка будет изменена в JTabbedPane прежде чем это действительно произойдет.   -  person Jeffrey    schedule 13.06.2012
comment
Да, действительно, я хочу, чтобы это не произошло, если условие не в порядке или пусть это произойдет, но некоторые сотрудники, например, сохранят данные ....   -  person itro    schedule 13.06.2012


Ответы (3)


JTabbedPane поддерживается SingleSelectionModel. Если вы расширяете DefaultSingleSelectionModel, вы можете переопределить setSelectedIndex и реализуйте свою логику.

// in new selection model:
public void setSelectedIndex(int index) {
    // do pre-switch things here
    super.setSelectedIndex(index);
}

// in ViewPanel, on tabbedPane create:
tabbedPane.setModel(newSelectionModel);

Причина, по которой вы не можете просто использовать ChangeListener, заключается в том, что он срабатывает при изменении. Расширяя модель выбора, вы срабатываете до смены вкладок.

person Roddy of the Frozen Peas    schedule 13.06.2012

Вы можете предотвратить переключение вкладок, расширив JTabbedPane и переопределив setSelectedIndex(int). Вот небольшой пример, иллюстрирующий это. Это просто предотвращает переключение между несмежными вкладками:

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTabbedPane;
import javax.swing.SwingUtilities;

public class Test2 {
    private static class BlockingTabbedPane extends JTabbedPane {

        public static interface TabSwitchAllower {
            public boolean allowTabSwitch(int from, int to);
        }

        private TabSwitchAllower allower;

        public BlockingTabbedPane(TabSwitchAllower allower) {
            super();
            this.allower = allower;
        }

        @Override
        public void setSelectedIndex(int index) {
            if (allower == null || allower.allowTabSwitch(getSelectedIndex(), index)) {
                super.setSelectedIndex(index);
            }
        }

    }

    protected static void initUI() {
        final JFrame frame = new JFrame("test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        BlockingTabbedPane.TabSwitchAllower allower = new BlockingTabbedPane.TabSwitchAllower() {

            @Override
            public boolean allowTabSwitch(int from, int to) {
                if (Math.abs(from - to) == 1) {
                    return true;
                } else {
                    JOptionPane.showMessageDialog(frame, "You can only switch between contiguous tabs");
                }
                return false;
            }
        };
        JTabbedPane tabbedPane = new BlockingTabbedPane(allower);
        for (int i = 0; i < 10; i++) {
            tabbedPane.addTab("Tab-" + i, new JLabel("Hello tab " + i));
        }
        frame.add(tabbedPane);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                initUI();
            }
        });
    }
}
person Guillaume Polet    schedule 13.06.2012

прослушиватель действий Java на вкладке

Как написать прослушиватель изменений (документы Oracle)

API JTabbedPane (документы Oracle)

Эти две ссылки должны вам помочь. Я действительно не работал с tabbedPanes, но я предполагаю, что getSelectedComponent() вернет текущую выбранную вкладку. Таким образом, у вас может быть дескриптор currentTab, который будет установлен во время создания экземпляра. Тогда у вас может быть что-то вроде этого.

class TabListener implements ChangeListener {
    public void stateChanged(ChangeEvent e) {

        // Replace JSlider with whatever your tab's data type is
        JSlider source = (JSlider)e.getSource();

        // Use the 'currentTab' handle to do what you want.

        currentTab = getSelectedComponent();
        // I'm assuming that the 'selected component' by the time this stuff
        // runs is going to be the new selected tab.
    }
}

Я не очень уверен в своем ответе, но очень надеюсь, что он укажет вам правильное направление! Пожалуйста, скажите, если вам нужны какие-либо разъяснения или что-то еще! Если я обнаружу что-нибудь, что, по моему мнению, может быть полезно, я обязательно отредактирую свой ответ!

person Sephallia    schedule 13.06.2012