从 SCROLL_TAB_LAYOUT JTabbedPane 中删除选项卡后,将剩余的选项卡滚动到可见

Scroll remaining tabs to visible after tab removal from a SCROLL_TAB_LAYOUT JTabbedPane

在设置了 SCROLL_TAB_LAYOUT 选项卡布局策略的 JTabbedPane 尾部移除单个选项卡后,如何将剩余选项卡滚动到可见。

默认行为似乎是不执行任何操作 - 用户被迫使用滚动按钮将剩余的选项卡带回视图(整个选项卡行变为空)。

如果你在我的例子中反复点击"Remove"按钮,你就会明白我的意思了。如果您删除了足够多的标签,您最终会得到一个空白标签行。

import java.awt.BorderLayout;
import java.awt.event.*;
import javax.swing.*;

public class FooTest extends JFrame {

    public FooTest() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new BorderLayout());

        final JTabbedPane tabs = new JTabbedPane();
        tabs.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);        
        add(tabs, BorderLayout.CENTER);

        for (int i = 0; i < 10; i++) {
            tabs.addTab("Long tab name " + i, new JPanel());
            tabs.setSelectedIndex(i);
        }

        JButton button = new JButton("Remove");
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (tabs.getTabCount() > 0) {
                    tabs.removeTabAt(tabs.getTabCount() - 1);
                }
            }
        });
        add(button, BorderLayout.PAGE_END);

        setSize(400, 400);
        setLocationRelativeTo(null);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new FooTest().setVisible(true);
            }
        });
    }

}

换句话说,如何确保从尾部删除后尽可能多的选项卡可见?

how do I ensure visibility of as much tabs as possible after removing from tail?

Swing 使用 Action 来执行组件的常用功能。

您可以在删除选项卡后手动调用滚动选项卡的Action

tabs.removeTabAt(tabs.getTabCount() - 1);
ActionMap am = tabs.getActionMap();
Action action = am.get("scrollTabsBackwardAction");
action.actionPerformed(new ActionEvent(tabs, ActionEvent.ACTION_PERFORMED, ""));

查看 Key Bindings 以获取每个 Swing 组件支持的操作列表。