Java Swing - 如何在另一个面板的顶部显示一个面板?

2022-09-01 07:41:13

我希望有一个内部(非窗口)对话框来请求成员输入。我希望将对话框集中放置在现有的JPanel上。

我已经查看了分层窗格,由于所有窗格中只有一个布局管理器(或没有布局管理器),因此这些窗格似乎无法使用。我想我可以尝试覆盖JLayeredPane并提供自定义布局,但这似乎很极端。

玻璃窗格似乎也不合适。

如何做到这一点?在 Swing 中没有可用的 z 索引概念吗?

编辑

分层窗格不合适的原因是每个图层缺少布局管理器。面板是可调整大小的,面板A应保持在100%的面积,面板B应保持集中。


答案 1

我认为LayeredPane是你最好的选择。您需要第三个面板来包含A和B。第三个面板将是分层窗格,然后面板A和B仍然可以有一个不错的布局管理器。你所要做的就是在A上以B为中心,在Swing小径上有很多关于如何做到这一点的例子。不使用布局管理器进行定位的教程

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 的边界。


答案 2

您可以添加一个未装饰的 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);
  }
}

推荐