Swing - 按钮被 JTabbedPane 中的 "tabs row" 阻止,其中没有选项卡

Swing - button is blocked by the "tabs row" in a JTabbedPane, where there are no tabs

我想要的是这样的:

但是按钮必须是可点击的。现在我的SSCCE,这个按钮不能点击了。但是,如果我将按钮添加到该区域之外,例如把这个按钮的boundsy设为0,不在JTabbedPane的"tabs row"之后,就可以点击了。

所以:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.SwingUtilities;

import net.miginfocom.swing.MigLayout;

public class MigLayoutWithJTabbedPaneButton extends JFrame {
    public MigLayoutWithJTabbedPaneButton() {
        begin();
    }

    private void begin() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel panel = new JPanel();
        panel.setLayout(null);

        JTabbedPane tabsPane = new JTabbedPane();
        tabsPane.setBounds(20, 20, 300, 400);
        panel.add(tabsPane);


        JLayeredPane tab = new JLayeredPane();
        tab.setLayout(new MigLayout("insets 2 2 2 2, fillx, debug", "[]5[]5[]", "[]5[]"));

        JButton button1 = new JButton("In the grid");
        JButton button2 = new JButton("Out of the grid");
        ActionListener ls = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(MigLayoutWithJTabbedPaneButton.this, "This can be clicked. ");

            }
        };
        button1.addActionListener(ls);
        button2.addActionListener(ls);

        tab.add(button1, "cell 0 0, grow");

        tabsPane.addTab("This is a tab", tab);

        button2.setBounds(200, 20, 80, 20);
        panel.add(button2);
        getContentPane().add(panel);

        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }

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

            @Override
            public void run() {
                MigLayoutWithJTabbedPaneButton frame = new MigLayoutWithJTabbedPaneButton();

            }

        });
    }
}

为什么?这不是期望的行为。 "tabs row" 不应阻挡任何与选项卡高度相同但前面没有任何实际选项卡的元素。

我的同事告诉我原因。

这与布局无关,只是添加组件的顺序。 似乎JavaSwing的Z轴表现不直观:从顶层到底层,也就是说,如果先添加组件A,再添加组件B ,如果他们在同一个地方,A 将阻止 B。 我重新阅读了 Oracle DOC 并确信它没有在任何地方被提及!

所以要让按钮起作用,我必须先添加按钮,然后再添加 JTabbedPane,因此 "tabs row" 的空白 space 将位于按钮后面。多奇怪。摇摆很烂....