⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dialoglayout2.java

📁 Manning - Java Swing 2nd Edition (2003) swing2e源代码
💻 JAVA
字号:
/**
	DialogLayout2
*/
package dl;

import java.awt.*;
import java.util.*;

import javax.swing.*;

public class DialogLayout2
	implements LayoutManager
{
	protected static final int COMP_TWO_COL = 0;
	protected static final int COMP_BIG = 1;
	protected static final int COMP_BUTTON = 2;

	protected int m_divider = -1;
	protected int m_hGap = 10;
	protected int m_vGap = 5;
	protected Vector m_v = new Vector();

	public DialogLayout2() {}

	public DialogLayout2(int hGap, int vGap)
	{
		m_hGap = hGap;
		m_vGap = vGap;
	}

	public void addLayoutComponent(String name, Component comp) {}

	public void removeLayoutComponent(Component comp) {}

	public Dimension preferredLayoutSize(Container parent)
	{
		m_v.removeAllElements();
		int w = 0;
		int h = 0;
		int type = -1;

		for (int k=0 ; k<parent.getComponentCount(); k++)
		{
			Component comp = parent.getComponent(k);
			int newType = getLayoutType(comp);
			if (k == 0)
				type = newType;

			if (type != newType)
			{
				Dimension d = preferredLayoutSize(m_v, type);
				w = Math.max(w, d.width);
				h += d.height + m_vGap;
				m_v.removeAllElements();
				type = newType;
			}

			m_v.addElement(comp);
		}

		Dimension d = preferredLayoutSize(m_v, type);
		w = Math.max(w, d.width);
		h += d.height + m_vGap;

		h -= m_vGap;

		Insets insets = parent.getInsets();
		return new Dimension(w+insets.left+insets.right,
			h+insets.top+insets.bottom);
	}

	protected Dimension preferredLayoutSize(Vector v, int type)
	{
		int w = 0;
		int h = 0;
		switch (type)
		{
		case COMP_TWO_COL:
			int divider = getDivider(v);
			for (int k=1 ; k<v.size(); k+=2)
			{
				Component comp = (Component)v.elementAt(k);
				Dimension d = comp.getPreferredSize();
				w = Math.max(w, d.width);
				h += d.height + m_vGap;
			}
			h -= m_vGap;
			return new Dimension(divider+w, h);

		case COMP_BIG:
			for (int k=0 ; k<v.size(); k++)
			{
				Component comp = (Component)v.elementAt(k);
				Dimension d = comp.getPreferredSize();
				w = Math.max(w, d.width);
				h += d.height + m_vGap;
			}
			h -= m_vGap;
			return new Dimension(w, h);

		case COMP_BUTTON:
			Dimension d = getMaxDimension(v);
			w = d.width + m_hGap;
			h = d.height;
			return new Dimension(w*v.size()-m_hGap, h);
		}
		throw new IllegalArgumentException("Illegal type "+type);
	}

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

	public void layoutContainer(Container parent)
	{
		m_v.removeAllElements();
		int type = -1;

		Insets insets = parent.getInsets();
		int w = parent.getWidth() - insets.left - insets.right;
		int x = insets.left;
		int y = insets.top;

		for (int k=0 ; k<parent.getComponentCount(); k++)
		{
			Component comp = parent.getComponent(k);
			int newType = getLayoutType(comp);
			if (k == 0)
				type = newType;

			if (type != newType)
			{
				y = layoutComponents(m_v, type, x, y, w);
				m_v.removeAllElements();
				type = newType;
			}

			m_v.addElement(comp);
		}

		y = layoutComponents(m_v, type, x, y, w);
		m_v.removeAllElements();
	}

	protected int layoutComponents(Vector v, int type,
		int x, int y, int w)
	{
		switch (type)
		{
		case COMP_TWO_COL:
			int divider = getDivider(v);
			for (int k=1 ; k<v.size(); k+=2)
			{
				Component comp1 = (Component)v.elementAt(k-1);
				Component comp2 = (Component)v.elementAt(k);
				Dimension d = comp2.getPreferredSize();

				comp1.setBounds(x, y, divider, d.height);
				comp2.setBounds(x+divider, y, w-divider, d.height);
				y += d.height + m_vGap;
			}
			//y -= m_vGap;
			return y;

		case COMP_BIG:
			for (int k=0 ; k<v.size(); k++)
			{
				Component comp = (Component)v.elementAt(k);
				Dimension d = comp.getPreferredSize();
				comp.setBounds(x, y, w, d.height);
				y += d.height + m_vGap;
			}
			//y -= m_vGap;
			return y;

		case COMP_BUTTON:
			Dimension d = getMaxDimension(v);
			int ww = d.width*v.size() + m_hGap*(v.size()-1);
			int xx = x + Math.max(0, (w - ww)/2);
			for (int k=0 ; k<v.size(); k++)
			{
				Component comp = (Component)v.elementAt(k);
				comp.setBounds(xx, y, d.width, d.height);
				xx += d.width + m_hGap;
			}
			return y + d.height;
		}
		throw new IllegalArgumentException("Illegal type "+type);
	}

	public int getHGap()
	{
		return m_hGap;
	}

	public int getVGap()
	{
		return m_vGap;
	}

	public void setDivider(int divider)
	{
		if (divider > 0)
			m_divider = divider;
	}

	public int getDivider()
	{
		return m_divider;
	}

	protected int getDivider(Vector v)
	{
		if (m_divider > 0)
			return m_divider;

		int divider = 0;
		for (int k=0 ; k<v.size(); k+=2)
		{
			Component comp = (Component)v.elementAt(k);
			Dimension d = comp.getPreferredSize();
			divider = Math.max(divider, d.width);
		}
		divider += m_hGap;
		return divider;
	}

	protected Dimension getMaxDimension(Vector v)
	{
		int w = 0;
		int h = 0;
		for (int k=0 ; k<v.size(); k++)
		{
			Component comp = (Component)v.elementAt(k);
			Dimension d = comp.getPreferredSize();
			w = Math.max(w, d.width);
			h = Math.max(h, d.height);
		}
		return new Dimension(w, h);
	}

	protected int getLayoutType(Component comp)
	{
		if (comp instanceof AbstractButton)
			return COMP_BUTTON;
		else if (comp instanceof JPanel ||
			comp instanceof JScrollPane ||
			comp instanceof JTabbedPane)
			return COMP_BIG;
		else
			return COMP_TWO_COL;
	}

	public String toString()
	{
		return getClass().getName() + "[hgap=" + m_hGap + ",vgap="
			+ m_vGap + ",divider=" + m_divider + "]";
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -