以下代码在框架的contentPane和"帮助"中创建了一个带有JTabbedPane的框架。按钮直接添加到框架的分层窗格中 - 索引的索引高于默认值,因此应始终将其绘制在选项卡式窗格的前面。但正如您可以看到的那样,只要您单击其中一个选项卡(或者,在Mac上,只要将鼠标悬停在选项卡上),就可以看到"帮助"按钮被涂上 - 即消失。您必须调整框架的大小以进行“帮助”#34;按钮重新出现。
这是一个Java错误还是我做错了什么?如果是后者,需要做些什么才能解决问题?我已经咨询了https://docs.oracle.com/javase/tutorial/uiswing/components/rootpane.html和https://docs.oracle.com/javase/tutorial/uiswing/components/toplevel.html。
请原谅"帮助"按钮。我只是想写一个快速测试,包括在这里。这个想法是覆盖"帮助" JTabbedPane未使用空间中的图标按钮。
import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.SwingUtilities;
public class TabTest {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame frame = new JFrame();
JTabbedPane tp = new JTabbedPane();
tp.addTab("hello", new JPanel());
tp.addTab("there", new JPanel());
frame.getContentPane().add(tp, BorderLayout.CENTER);
JLayeredPane layeredPane = frame.getRootPane().getLayeredPane();
JButton helpButton = new JButton("Help");
helpButton.setBounds(800, 5, 50, 20);
layeredPane.add(helpButton, 400);
frame.setSize(new Dimension(900, 800));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}
答案 0 :(得分:2)
这是对JLayeredPane
的常见误解。
如果你看一下Container
的JavaDocs,你会注意到(至少)有两个add
方法
你需要回答的问题是,你实际上在调用哪一个?
JavaDocs for JLayeredPane
和How to use JLayeredPane都证明您应该拨打第二个。
虽然第一个会影响组件的z排序,但不能保证组件位置不会改变。
而不是:
layeredPane.add(helpButton, 400);
你应该使用:
layeredPane.add(helpButton, new Integer(400));
将值作为约束传递给容器,而不是容器层次结构中的所需位置 - 是的,我知道
另一种解决方案可能是使用glassPane
代替,例如......
JFrame frame = new JFrame();
JTabbedPane tp = new JTabbedPane();
tp.addTab("hello", new JPanel());
tp.addTab("there", new JPanel());
frame.getContentPane().add(tp, BorderLayout.CENTER);
// Null layout used here for demonstration purposes only
JPanel glassPane = new JPanel(null);
glassPane.setOpaque(false);
frame.getRootPane().setGlassPane(glassPane);
// This is important, as setGlassPane makes it invisible
glassPane.setVisible(true);
JButton helpButton = new JButton("Help");
helpButton.setBounds(800, 5, 50, 20);
glassPane.add(helpButton);
frame.setSize(new Dimension(900, 800));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);