覆盖面板(另一个上方)[英] Overlay panel (above another)

问题描述

我正在学习如何使用 Swing,发现自己的任务相当艰巨.

我想要完成的工作:我希望在左侧(比如说 100 像素宽度)和第二个面板(称为内容面板)上有面板(称为菜单面板),它占据了其余可用位置.

在菜单面板中有 3 个按钮.当我按下它们时,菜单面板(在内容面板上方)的右侧应该出现第二个菜单面板(子菜单)(它应该从按下的按钮中间开始).

这可能很难理解,所以我创建了一个简单的草稿:

在此处输入图片描述

我尝试了 JLayeredPane,但在调整窗口大小时出现问题(分层窗格中的元素没有调整大小).

推荐答案

JLayeredPane 错过了 LayoutManager 的实现,你必须手动 setPreferredSize 或 setBounds 来调整/放置 JComponents,

有一种可能的解决方法,您可以将 ComponentListener 添加到 JFrame,然后在 componentResized(ComponentEvent e) 上,您可以将 JComponent(s) 调整大小/替换为所需的 Bounds

例如

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;

public class LayeredPaneWithOverlap {

    private JTextArea textArea = new JTextArea(2, 10);
    private JPanel textPanel = new JPanel(new BorderLayout());
    private JTable table = new JTable(30, 5);
    private JScrollPane scroll = new JScrollPane(table);
    private JLayeredPane layer = new JLayeredPane();
    private JFrame frame = new JFrame("Frame with resiziable JLayeredPane");

    public void makeUI() {
        textArea.setBorder(new LineBorder(Color.DARK_GRAY));
        textArea.setText("Frame with resiziable JLayeredPane");
        textPanel.setOpaque(false);
        textPanel.add(textArea, BorderLayout.NORTH);
        Font font = textArea.getFont();
        FontMetrics fontMetrics = textArea.getFontMetrics(font);
        int h = fontMetrics.getHeight() + frame.getInsets().top + 
                textPanel.getInsets().top + textArea.getInsets().top
                + textArea.getInsets().bottom;
        scroll.setBounds(0, h, 400, 300);
        layer.add(textPanel, new Integer(2));
        layer.add(scroll, new Integer(1));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(600, 400);
        frame.addComponentListener(new ComponentAdapter() {

            @Override
            public void componentResized(ComponentEvent e) {

                SwingUtilities.invokeLater(new Runnable() {

                    @Override
                    public void run() {
                        resizeAll();
                    }
                });
            }
        });
        frame.setLocationRelativeTo(null);
        frame.add(layer);
        resizeAll();
        frame.setVisible(true);
    }

    void resizeAll() {
        Insets insets = frame.getInsets();
        int w = frame.getWidth() - insets.left - insets.right;
        int h = frame.getHeight() - insets.top - insets.bottom;
        textPanel.setSize(w, h);
        scroll.setSize(w, h - scroll.getY());
        layer.revalidate();
        layer.repaint();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new LayeredPaneWithOverlap().makeUI();
            }
        });
    }
}

本文地址:https://www.itbaoku.cn/post/978743.html