2

新しいタブが切り替わる前に、どのようにイベントをトラップしますか?すべてのタブにJTableがあり、そのデータを使用して何かを実行します(削除、追加、更新)。新しいタブに切り替える前に、データ検証(変更の保存またはキャンセル)を行いたいのですが。私はJava1.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

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 を単純に使用できない理由は、それが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 アクションリスナー

変更リスナーを作成する方法 (Oracle Docs)

JTabbedPane API (Oracle ドキュメント)

これらの 2 つのリンクが役に立ちます。私は実際に 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 に答える