我希望有一个内部(非窗口)对话框来询问成员输入。我希望将对话框集中放在现有的JPanel上。
我查看了layeredpanes,由于在所有窗格中只有一个布局管理器(或没有布局管理器),这些似乎无法使用。我想我可以尝试覆盖JLayeredPane并提供自定义布局,但这似乎极端。
Glass panes似乎也不合适。
如何做到这一点?在Swing中没有可用的z索引概念吗?
修改
分层窗格不合适的原因是每层缺少布局管理器。小组可以调整大小,小组A应该保持100%的面积,小组B应该保持集中。
答案 0 :(得分:35)
我认为LayeredPane是你最好的选择。你需要第三个面板来包含A和B.第三个面板是layeredPane,然后面板A和B仍然可以有一个漂亮的LayoutManagers。所有你需要做的就是将A中心放在A上,并且在Swing小道中有很多关于如何做到这一点的例子。 Tutorial for positioning without a LayoutManager
public class Main {
private JFrame frame = new JFrame();
private JLayeredPane lpane = new JLayeredPane();
private JPanel panelBlue = new JPanel();
private JPanel panelGreen = new JPanel();
public Main()
{
frame.setPreferredSize(new Dimension(600, 400));
frame.setLayout(new BorderLayout());
frame.add(lpane, BorderLayout.CENTER);
lpane.setBounds(0, 0, 600, 400);
panelBlue.setBackground(Color.BLUE);
panelBlue.setBounds(0, 0, 600, 400);
panelBlue.setOpaque(true);
panelGreen.setBackground(Color.GREEN);
panelGreen.setBounds(200, 100, 100, 100);
panelGreen.setOpaque(true);
lpane.add(panelBlue, new Integer(0), 0);
lpane.add(panelGreen, new Integer(1), 0);
frame.pack();
frame.setVisible(true);
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
new Main();
}
}
您可以使用setBounds将面板放置在分层窗格内,也可以设置它们的大小。
修改以反映对原始帖子的更改 您将需要添加组件侦听器,以检测何时调整父容器的大小,然后动态更改面板A和B的边界。
答案 1 :(得分:5)
我只是认为我会在Swing中添加是 Z-order的概念,请参阅 [java.awt.Component中#setComponentZOrder] [1]
会影响其父组件数组中组件的位置,这决定了绘制顺序。
请注意,您应该覆盖javax.swing.JComponent#isOptimizedDrawingEnabled以在父容器中返回false以使重叠组件正确重新绘制,否则它们的重绘将相互冲突。 (JComponents假设没有重叠的子节点,除非isOptimizedDrawingEnabled返回false)
答案 2 :(得分:4)
您可以像这样添加未修饰的JDialog:
import java.awt.event.*;
import javax.swing.*;
public class TestSwing {
public static void main(String[] args) throws Exception {
JFrame frame = new JFrame("Parent");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(800, 600);
frame.setVisible(true);
final JDialog dialog = new JDialog(frame, "Child", true);
dialog.setSize(300, 200);
dialog.setLocationRelativeTo(frame);
JButton button = new JButton("Button");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
dialog.dispose();
}
});
dialog.add(button);
dialog.setUndecorated(true);
dialog.setVisible(true);
}
}
答案 3 :(得分:1)
在现有JPanel上使用1 x 1 GridLayout,然后将Panel添加到该JPanel。 GridLayout是1比1的唯一问题是您将无法在JPanel上放置其他项目。在这种情况下,您必须找出合适的布局。您使用的每个面板都可以使用自己的布局,这样就不会有问题。
我是否正确理解了这个问题?
答案 4 :(得分:1)
JOptionPane.showInternalInputDialog可能会做你想要的。如果没有,了解它缺少什么会有所帮助。
答案 5 :(得分:0)
这里有另一个可能感兴趣的布局管理器:Overlay Layout 这是一个简单的教程:OverlayLayout: for layout management of components that lie on top of one another。 叠加布局允许您将面板定位在彼此之上,并在每个面板内设置布局。您还可以单独设置每个面板的大小和位置。
(我多年前回答这个问题的原因是因为我偶然发现了同样的问题,而且我很少看到StackOverflow上的叠加布局,但它似乎有很好的记录。希望这个可以帮助那些一直在寻找它的人。)