有没有像Windows资源管理器一样工作的布局? [英] Is there any layout which works like Windows Explorer?

查看:121
本文介绍了有没有像Windows资源管理器一样工作的布局?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想要一个布局管理器,它在文件夹视图(而不是任何列表视图)中的作用类似于Windows资源管理器.我需要的是这样的边缘布局"面板,例如Windows 7资源管理器ListView 在Swing中. 有什么方法可以自定义标准布局,或者您知道任何外部布局吗?

I would like to have layout manager which works like Windows Explorer in folder view (not any list view). What I need is something like this Marginal Layout panel like Windows 7 Explorer ListView in Swing. Is there any way to customize standard layouts or do you know any external layouts?

推荐答案

http://java-sl. com/tip_columns_flow_layout.html 截屏和有关以下代码的文章的链接

http://java-sl.com/tip_columns_flow_layout.html The link to screenshot and article about the code below

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

public class ColumnsFlowLayout implements LayoutManager {
    int hGap;
    int vGap;
    public ColumnsFlowLayout() {
        this(2,2);
    }

    public ColumnsFlowLayout(int hGap, int vGap) {
        this.hGap=hGap;
        this.vGap=vGap;
    }
    public void addLayoutComponent(String name, Component comp) {
    }

    public void removeLayoutComponent(Component comp) {
    }

    public Dimension preferredLayoutSize(Container target) {
        synchronized (target.getTreeLock()) {
            Dimension dim = new Dimension(0, 0);
            int count = target.getComponentCount();
            int visibleCount = 0;
            for (int i=0; i<count; i++) {
                if (target.getComponent(i).isVisible()) {
                    visibleCount++;
                }
            }
            Insets insets = target.getInsets();

            Dimension maxPref=getCellSize(target);

            if (target.getWidth()!=0) {
                int maxWidth = target.getWidth() - (insets.left + insets.right);
                int colCount=maxWidth/(maxPref.width+hGap);
                int row=visibleCount/colCount;
                if (visibleCount % colCount!=0) {
                    row++;
                }
                dim.width += insets.left + insets.right + hGap*(visibleCount-1)+maxPref.width*visibleCount;
                dim.height += insets.top + insets.bottom + row*maxPref.height;
            }
            else {
                dim.width += insets.left + insets.right + hGap*(visibleCount-1)+maxPref.width*visibleCount;
                dim.height += insets.top + insets.bottom + maxPref.height;
            }
            return dim;
        }
    }

    private Dimension getCellSize(Container target) {
        Dimension maxPref=new Dimension();
        int count = target.getComponentCount();
        for (int i = 0 ; i < count ; i++) {
            Component m = target.getComponent(i);
            if (m.isVisible()) {
                Dimension d = m.getPreferredSize();
                maxPref.width = Math.max(maxPref.width, d.width);
                maxPref.height = Math.max(maxPref.height, d.height);
            }
        }

        return maxPref;
    }

    public Dimension minimumLayoutSize(Container target) {
        return preferredLayoutSize(target);
    }

    /**
     * Lays out the container.
     *
     * @param target the specified component being laid out
     * @see Container
     * @see       java.awt.Container#doLayout
     */
    public void layoutContainer(Container target) {
        synchronized (target.getTreeLock()) {
            Insets insets = target.getInsets();
            int maxWidth = target.getWidth() - (insets.left + insets.right);
            int count = target.getComponentCount();
            Dimension cellSize=getCellSize(target);
            int x=insets.left;
            int y=insets.top;
            int row=0;
            int colCount=maxWidth/(cellSize.width+hGap);
            int realHGap=colCount>1 ?(maxWidth-colCount*(cellSize.width+hGap))/(colCount-1) : 0;
            for (int i = 0 ; i < count ; i++) {
                Component m = target.getComponent(i);
                if (m.isVisible()) {
                    m.setSize(cellSize.width, cellSize.height);

                    m.setLocation(x, y+row*(cellSize.height+vGap));
                    x+=hGap+cellSize.width+realHGap;
                    if (x+cellSize.width>=maxWidth) {
                        row++;
                        x=insets.left;
                    }

                }
            }
        }
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame("Multi column flow layout (Windows Explorer like)");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel container=new JPanel(new ColumnsFlowLayout(3,3));
        container.setBorder(new EmptyBorder(2,2,2,2));
        for (int i=0; i<27; i++) {
            container.add(new JButton("Test "+i));
        }
        frame.getContentPane().add(container);

        frame.setSize(500, 300);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

}

这篇关于有没有像Windows资源管理器一样工作的布局?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆