【问题标题】:Is there a responsive layout manager that support overlapping是否有支持重叠的响应式布局管理器
【发布时间】:2021-02-11 09:07:05
【问题描述】:

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

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

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

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

那么有没有可能使用任何布局管理器来实现这个效果呢?

【问题讨论】:

  • 您可以通过在单元格上覆盖稍大或大得多的 JDialog 来模拟这种效果。

标签: java swing overlap


【解决方案1】:

有几种方法可以实现您想要的行为。
我选择使用popup menus。

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

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());
    }
}

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

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

【讨论】:

  • 我可以解决这个问题,但是有没有办法让 JPopupMenu 在调整窗口大小或在窗口外部单击时不消失?
猜你喜欢
  • 1970-01-01
  • 2021-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-11
  • 2012-12-20
相关资源
最近更新 更多