首页 > 解决方案 > 是否有支持重叠的响应式布局管理器

问题描述

我正在尝试创建一个库程序来扫描本地目录中的一些文件,然后将它们的缩略图和标题呈现给它们。我尝试了多个布局管理器,但都无法获得我想要的结果。

基本上我想要的是有一个响应网格,根据窗口大小重新定位单元格

在此处输入图像描述

在此处输入图像描述

使用 Flow Layout 或Wrap Layout已经可以实现这种效果,但另一件事是我还想在单击时调整单个单元格的大小并重叠下面的单元格

在此处输入图像描述

我能想到的最接近使用这种机制的是 Windows 10 桌面

在此处输入图像描述

在此处输入图像描述

那么使用任何布局管理器都可以实现这种效果吗?

标签: javaswingoverlap

解决方案


有几种方法可以实现您想要的行为。
我选择使用弹出菜单

下面的代码只是一个概念证明(POC)。我希望它足以帮助您根据您的要求完成您的申请。下面的代码是一个完整的例子。您可以按原样复制代码并编译并运行它。

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.net.URL;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.SwingConstants;
import javax.swing.WindowConstants;

public class Overlaps extends MouseAdapter implements Runnable {
    private Icon  largeIco;
    private Icon  smallIco;
    private JFrame  frame;
    private JPopupMenu  popup;

    public Overlaps() {
        Class<?> thisClass = getClass();
        URL url = thisClass.getResource("11-cd-32px.png");
        smallIco = new ImageIcon(url);
        url = thisClass.getResource("11-cd-64px.png");
        largeIco = new ImageIcon(url);
    }

    @Override // java.awt.event.MouseAdapter
    public void mouseClicked(MouseEvent event) {
        Component cmpt = event.getComponent();
        popup.show(cmpt, -10, -10);
    }

    @Override // java.lang.Runnable
    public void run() {
        showGui();
    }

    private JLabel createLabel(String text) {
        JLabel label = new JLabel(text, smallIco, SwingConstants.CENTER);
        label.setHorizontalTextPosition(SwingConstants.CENTER);
        label.setVerticalTextPosition(SwingConstants.BOTTOM);
        label.addMouseListener(this);
        return label;
    }

    private JPanel createMainPanel() {
        JPanel mainPanel = new JPanel();
        mainPanel.add(createLabel("Zero"));
        mainPanel.add(createLabel("One"));
        mainPanel.add(createLabel("Two"));
        mainPanel.add(createLabel("Three"));
        mainPanel.add(createLabel("Four"));
        mainPanel.add(createLabel("Five"));
        mainPanel.add(createLabel("Six"));
        return mainPanel;
    }

    private void initPopup() {
        popup = new JPopupMenu();
        popup.add(new JLabel(largeIco));
    }

    private void showGui() {
        initPopup();
        frame = new JFrame("Example Program");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.add(createMainPanel(), BorderLayout.CENTER);
        frame.setSize(200, 200);
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Overlaps());
    }
}

这是我启动应用程序时的样子。

推出

这就是弹出窗口显示的样子。

弹出显示


推荐阅读