2

在切换到新选项卡之前如何捕获事件?在每个选项卡中,我都有 JTable,我对它的数据做了一些事情(删除、添加、更新)。我想在切换到新标签之前进行数据验证(保存或取消更改)。我使用 Java 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) {

     }

   }
4

3 回答 3

5

JTabbedPaneSingleSelectionModel支持。如果您扩展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 的原因是因为它会触发change。通过扩展选择模型,您可以在选项卡更改之前触发。

于 2012-06-13T15:14:40.850 回答
4

您可以通过扩展 JTabbedPane 和 override 来防止选项卡切换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();
            }
        });
    }
}
于 2012-06-13T15:27:19.680 回答
2

选项卡上的 java actionlistener

如何编写更改侦听器(Oracle 文档)

JTabbedPane API(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.
    }
}

我对我的回答不太有信心,但我当然希望这能为您指明正确的方向!如果您需要任何澄清或任何事情,请说!如果我碰巧发现任何我认为可能有用的东西,我一定会编辑我的答案!

于 2012-06-13T15:27:42.777 回答