Java Swing - 如何在另一个面板上显示面板?

Poo*_*ool 31 java swing dialog z-index jpanel

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

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

玻璃窗格似乎也不合适.

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

http://i42.tinypic.com/30tkuvk.jpg

编辑

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

wil*_*ood 37

我认为LayeredPane是你最好的选择.你需要第三个面板来包含A和B.第三个面板是layeredPane,然后面板A和B仍然可以有一个漂亮的LayoutManagers.所有你需要做的就是将A中心放在A上,并且在Swing小道中有很多关于如何做到这一点的例子.没有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();
    }

}
Run Code Online (Sandbox Code Playgroud)

您可以使用setBounds将面板放置在分层窗格内,还可以设置它们的大小.

编辑以反映对原始帖子的更改 您将需要添加组件侦听器,以检测何时调整父容器的大小,然后动态更改面板A和B的边界.


mav*_*ato 5

您可以像这样添加一个未修饰的 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);
  }
}
Run Code Online (Sandbox Code Playgroud)


Car*_*rlG 5

我只是想,我想补充一点,还有就是 Z顺序的一个Swing概念,参见[java.awt.Component中#setComponentZOrder] [1]

它影响其父组件数组中组件的位置,该组件确定绘制顺序.

请注意,您应该覆盖javax.swing.JComponent#isOptimizedDrawingEnabled以在父容器中返回false以使重叠组件正确重新绘制,否则它们的重绘将相互冲突.(除非isOptimizedDrawingEnabled返回false,否则JComponents假定没有重叠的子节点)

[1]:http://java.sun.com/j2se/1.5.0/docs/api/java/awt/Container.html#setComponentZOrder(java.awt.Component ,int)