Java JTabbedPane-更改选定选项卡之前的动作



使用jtabbedpane,我想在选择新选项卡的选择更改之前就捕获这一刻,这是有效的并执行操作。这类似于秋千组件的焦点失散事件。目的是在更改选项卡时将一些JTEXTFIELD的文本保存到外部文件中,因此每次用户单击一个不同的选项卡时,当前选项卡的值都会写入外部文件中。

我一直在使用ChangElistener来跟踪标签的更改,但还没有找到做我需要的方法。在下一个简单示例中如何实现它的任何想法?

import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTabbedPane;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class TabSample {
    static void add(JTabbedPane tabbedPane, String label) {
        JButton button = new JButton(label);
        tabbedPane.addTab(label, button);
    }
    public static void main(String args[]) {
        JFrame frame = new JFrame("TabSample");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JTabbedPane tabbedPane = new JTabbedPane();
        String titles[] = { "Geometry", "Materials", "Analysis"};
        for (int i = 0, n = titles.length; i < n; i++) {
            add(tabbedPane, titles[i]);
        }
        ChangeListener changeListener = new ChangeListener() {
            public void stateChanged(ChangeEvent changeEvent) {
                JTabbedPane sourceTabbedPane = (JTabbedPane) changeEvent.getSource();
                int index = sourceTabbedPane.getSelectedIndex();
                System.out.println("Tab changed to: " + sourceTabbedPane.getTitleAt(index));
        }
        };
        tabbedPane.addChangeListener(changeListener);
        frame.add(tabbedPane, BorderLayout.CENTER);
        frame.setSize(400, 150);
        frame.setVisible(true);
    }
}
在实现单元模型的模型(检查Singleselectionmodel API),该模型覆盖setSelectedIndex(int index)方法,这是我肯定Swing时使用的方法,当它想告诉JTABBEDPANE更改选项卡时。如果创建一个从默认的lectelelectionmodel延伸的类,这是一个实现上述接口并覆盖此方法的具体类,则可以在调用超级方法之前进行方法调用,从而在之前进行GUI调用标签更改。例如,您的setSelectedIndex方法看起来像这样:
    @Override
    public void setSelectedIndex(int index) {
        if (activated) {
            String text = String.format("Before change, old index: %d; new index: %d", super.getSelectedIndex(), index);
            JOptionPane.showMessageDialog(gui, text);
        }
        super.setSelectedIndex(index);
    }

使用上面的代码可以实现:

import java.awt.BorderLayout;
import java.awt.Component;
import javax.swing.DefaultSingleSelectionModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTabbedPane;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class TabSample {
    static void add(JTabbedPane tabbedPane, String label) {
        JButton button = new JButton(label);
        tabbedPane.addTab(label, button);
    }
    public static void main(String args[]) {
        JFrame frame = new JFrame("TabSample");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        MySingleSelectionModel selectionModel = new MySingleSelectionModel(frame);
        JTabbedPane tabbedPane = new JTabbedPane();
        tabbedPane.setModel(selectionModel);
        String titles[] = { "Geometry", "Materials", "Analysis"};
        for (int i = 0, n = titles.length; i < n; i++) {
            add(tabbedPane, titles[i]);
        }
        ChangeListener changeListener = new ChangeListener() {
            public void stateChanged(ChangeEvent changeEvent) {
                JTabbedPane sourceTabbedPane = (JTabbedPane) changeEvent.getSource();
                int index = sourceTabbedPane.getSelectedIndex();
                System.out.println("Tab changed to: " + sourceTabbedPane.getTitleAt(index));
        }
        };
        tabbedPane.addChangeListener(changeListener);
        frame.add(tabbedPane, BorderLayout.CENTER);
        frame.setSize(400, 150);
        frame.setVisible(true);
        selectionModel.setActivated(true);
    }
    private static class MySingleSelectionModel extends DefaultSingleSelectionModel {
        private Component gui;
        private boolean activated = false;
        public MySingleSelectionModel(Component gui) {
            this.gui = gui;
        }
        public void setActivated(boolean activated) {
            this.activated = activated;
        }
        @Override
        public void setSelectedIndex(int index) {
            if (activated) {
                String text = String.format("Before change, old index: %d; new index: %d", 
                        super.getSelectedIndex(), index);
                JOptionPane.showMessageDialog(gui, text);
            }
            super.setSelectedIndex(index);
        }
    }
}

请注意,我使用布尔字段,activated激活行为的变化,以免对GUI创建发射。我在显示GUI之后的模型上致电setActivated(true)


关于您的编辑:

更改选项卡时,目的是将一些jtextfields的文本保存到外部文件中,因此每次用户单击其他选项卡时,当前选项卡的值都会写入外部文件中。

我应该知道,这毕竟是一个XY问题,当最佳解决方案是使用完全不同的方法时,您询问如何解决特定的代码问题。将来,请为我们提供所有相关信息,其中包括原始问题,以免使用不必要的解决方案浪费时间。

实际上,这里不需要做任何事情 更改,因为在时, 都会更改。您的解决方案是使用ChangElistener,无需通过我上面发布的体操。

最新更新