摆动 - 按钮被"标签行"在JTabbedPane中,没有选项卡

时间:2017-02-20 09:07:55

标签: java swing tabs jtabbedpane miglayout

我想要的是:

enter image description here

但按钮必须是可点击的。现在使用我的SSCCE,无法单击此按钮。但是,如果我将按钮添加到此区域之外,例如将此按钮的y范围设置为0,它不再位于JTabbedPane"标签行"后面,并且因此可以点击。

所以:

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();

            }

        });
    }
}

为什么呢?这不是理想的行为。 "标签行"不应该阻止任何元素,如果它们位于选项卡的相同高度,但在它们前面没有任何实际的标签。

1 个答案:

答案 0 :(得分:0)

我的同事告诉我原因。

它与布局无关,而只是添加组件的顺序。 似乎Java Swing的Z轴以非直观的方式运行:从顶层到底层,这意味着如果先添加组件A然后再添加组件B,则A将阻止B在同一个地方。 我重读了Oracle DOC,并确信它在任何地方都没有提及!

因此,为了使按钮起作用,我必须首先添加按钮然后添加JTabbedPane,因此"标签行的空白区域"将在按钮后面。多么奇怪。 Swing只是糟透了....