我想要的是:
但按钮必须是可点击的。现在使用我的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();
}
});
}
}
为什么呢?这不是理想的行为。 "标签行"不应该阻止任何元素,如果它们位于选项卡的相同高度,但在它们前面没有任何实际的标签。
答案 0 :(得分:0)
我的同事告诉我原因。
它与布局无关,而只是添加组件的顺序。 似乎Java Swing的Z轴以非直观的方式运行:从顶层到底层,这意味着如果先添加组件A然后再添加组件B,则A将阻止B在同一个地方。 我重读了Oracle DOC,并确信它在任何地方都没有提及!
因此,为了使按钮起作用,我必须首先添加按钮然后添加JTabbedPane
,因此"标签行的空白区域"将在按钮后面。多么奇怪。 Swing只是糟透了....