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 将位于按钮后面。多奇怪。摇摆很烂....
我想要的是这样的:
但是按钮必须是可点击的。现在我的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 将位于按钮后面。多奇怪。摇摆很烂....