java - 是否有支持重叠的响应式布局管理器
问题描述
我正在尝试创建一个库程序来扫描本地目录中的一些文件,然后将它们的缩略图和标题呈现给它们。我尝试了多个布局管理器,但都无法获得我想要的结果。
基本上我想要的是有一个响应网格,根据窗口大小重新定位单元格
使用 Flow Layout 或Wrap Layout已经可以实现这种效果,但另一件事是我还想在单击时调整单个单元格的大小并重叠下面的单元格
我能想到的最接近使用这种机制的是 Windows 10 桌面
那么使用任何布局管理器都可以实现这种效果吗?
解决方案
有几种方法可以实现您想要的行为。
我选择使用弹出菜单。
下面的代码只是一个概念证明(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());
}
}
这是我启动应用程序时的样子。
这就是弹出窗口显示的样子。
推荐阅读
- puppeteer - 使用 puppeteer-recorder 录制浏览器的视频
- jenkins - 将 job-dsl 插件从 1.50 升级到 1.72 后没有方法错误的签名
- swift - 在 Swift 中将 Double 值类型转换为 Int64,位数为 13,但它运行的系统是 32 位系统,它会失败吗?
- node.js - 请求会话不是持久的 - 快速会话
- c# - 我在编辑控制器中输入错误的类型,我该怎么办?
- python - 在python中安排一个每小时重复一次的任务和另一个每天重复一次的任务
- json - 如何使用 volley 在数据来自 json 的 recyclerview 中打开特定/不同的 Activity
- python - 在两个进程之间共享字典,而其中一个进程一直在更新它
- keycloak - 如果用户已经存在于 keycloak 中并希望自动链接,如何绕过 ext-idm 用户的 keycloak 同意屏幕
- javascript - 从 javascript 发送数据以查看和返回修改后的数据