import java.awt.*;public class ColumnLayout implements LayoutManager2{ protected int marginWidth; protected int marginHeight; protected int spacing; protected int alignment;
public static final int LEFT=0; public static final int CENTER=1; public static final int RIGHT=2; public static final int JUSTIFY=3;
public static final int PREFERRED_SIZE=0; public static final int MINIMUM_SIZE=1; public static final int MAXIMUM_SIZE=2;
public ColumnLayout(int mW, int mH, int s, int a){ if(mW<0 || mH<0 || s<0){ throw new IllegalArgumentException("Size of margin cannot be negative!"); } if(a<LEFT || a>JUSTIFY){ throw new IllegalArgumentException("Not an alignment!"); } marginWidth=mW; marginHeight=mH; spacing=s; alignment=a; }
public ColumnLayout(){ this(5,5,5,JUSTIFY); }
public ColumnLayout(int a){ this(5,5,5,a); }
public int getMarginWidth(){ return marginWidth; }
public int getMarginHeight(){ return marginHeight; }
public int getSpacing(){ return spacing; }
public int getAlignment(){ return alignment; }
public void layoutContainer(Container parent){ Insets insets=parent.getInsets(); Dimension parentSize=parent.getSize(); Component kid; int kidsCount=parent.getComponentCount(); int x0=insets.left+marginWidth; int x; int y=insets.top+marginHeight;
public int hashCode(){ int hashCode=-93567; hashCode*=alignment; hashCode+=marginWidth*7403; hashCode+=marginHeight*281; return hashCode+spacing; } }new JPanel().setLayout(new ColumnLayout());
setLayout 为null后,对于控件的size更不拘泥了,为了明了就理应在PropertyGrid中设置SetBounds了。再说,这本来就是java 的特性,跟平台就没多大关系了吧。说到layout 问题,我觉得.net的布局直观,容易,更能让你用户接受。
JList不能可视化设计这个问题,我觉得是因为JList可以显示各种对象,没有特别方便的设计方法。可能以后会改变吧,jbuilder的Active Designer可以设计菜单,可能以后可以用来设计其他控件。其实自己加也不麻烦。
protected int marginWidth;
protected int marginHeight;
protected int spacing;
protected int alignment;
public static final int LEFT=0;
public static final int CENTER=1;
public static final int RIGHT=2;
public static final int JUSTIFY=3;
public static final int PREFERRED_SIZE=0;
public static final int MINIMUM_SIZE=1;
public static final int MAXIMUM_SIZE=2;
public ColumnLayout(int mW, int mH, int s, int a){
if(mW<0 || mH<0 || s<0){
throw new IllegalArgumentException("Size of margin cannot be negative!");
}
if(a<LEFT || a>JUSTIFY){
throw new IllegalArgumentException("Not an alignment!");
}
marginWidth=mW;
marginHeight=mH;
spacing=s;
alignment=a;
}
public ColumnLayout(){
this(5,5,5,JUSTIFY);
}
public ColumnLayout(int a){
this(5,5,5,a);
}
public int getMarginWidth(){
return marginWidth;
}
public int getMarginHeight(){
return marginHeight;
}
public int getSpacing(){
return spacing;
}
public int getAlignment(){
return alignment;
}
public void layoutContainer(Container parent){
Insets insets=parent.getInsets();
Dimension parentSize=parent.getSize();
Component kid;
int kidsCount=parent.getComponentCount();
int x0=insets.left+marginWidth;
int x;
int y=insets.top+marginHeight;
int maxWidth=0;
if(alignment==JUSTIFY){
for(int i=0;i<kidsCount;i++){
kid=parent.getComponent(i);
if(!kid.isVisible()) continue;
Dimension pref=kid.getPreferredSize();
maxWidth=(maxWidth<pref.width)?pref.width:maxWidth;
}
}
for(int i=0;i<kidsCount;i++){
kid=parent.getComponent(i);
if(!kid.isVisible()) continue;
Dimension pref=kid.getPreferredSize();
int kidWidth=pref.width;
switch(alignment){
default:
case LEFT: x=x0; break;
case CENTER: x=(parentSize.width-pref.width)/2; break;
case RIGHT: x=parentSize.width-insets.right-marginWidth-pref.width; break;
case JUSTIFY: x=x0; kidWidth=maxWidth; break;
}
kid.setBounds(x,y,kidWidth,pref.height);
y+=pref.height+spacing;
}
}
public Dimension preferredLayoutSize(Container parent){
return layoutSize(parent, 1);
}
public Dimension minimumLayoutSize(Container parent){
return layoutSize(parent, 2);
}
public Dimension maximumLayoutSize(Container parent){
return layoutSize(parent, 3);
}
public Dimension layoutSize(Container parent, int sizeType){
if(sizeType<PREFERRED_SIZE || sizeType>MAXIMUM_SIZE){
throw new IllegalArgumentException("Wrong size type!");
}
int kidsCount=parent.getComponentCount();
Dimension size=new Dimension(0,0);
Insets insets=parent.getInsets();
int visibleKidsCount=0;
for(int i=0;i<kidsCount;i++){
Component kid=parent.getComponent(i);
Dimension d;
if(!kid.isVisible()) continue;
visibleKidsCount++;
switch(sizeType){
default:
case PREFERRED_SIZE: d=kid.getPreferredSize(); break;
case MINIMUM_SIZE: d=kid.getMinimumSize(); break;
case MAXIMUM_SIZE: d=kid.getMaximumSize(); break;
}
if(d.width>size.width) size.width=d.width;
size.height+=d.height;
}
size.width+=insets.left+insets.right+2*marginWidth;
size.height+=insets.top+insets.bottom+2*marginHeight;
size.height+=(visibleKidsCount-1)*spacing;
return size;
}
public void addLayoutComponent(String constraint, Component component){}
public void addLayoutComponent(Component component, Object constraint){}
public void removeLayoutComponent(Component component){}
public void invalidateLayout(Container parent){}
public float getLayoutAlignmentX(Container parent){
return 0.5f;
}
public float getLayoutAlignmentY(Container parent){
return 0.5f;
}
public String toString(){
String str;
switch(alignment){
default:
case LEFT: str="LEFT"; break;
case CENTER: str="CENTER"; break;
case RIGHT: str="RIGHT"; break;
case JUSTIFY: str="JUSTIFY"; break;
}
return "ColumnLayout [alignment="+str+", margin width="+marginWidth+
", margin height="+marginHeight+", spacing="+spacing+"]";
}
public boolean equals(Object obj){
if(obj==null || !(obj instanceof ColumnLayout)) return false;
ColumnLayout c=(ColumnLayout)obj;
return c.marginWidth==marginWidth && c.marginHeight==marginHeight
&& c.spacing==spacing && c.alignment==alignment;
}
public int hashCode(){
int hashCode=-93567;
hashCode*=alignment;
hashCode+=marginWidth*7403;
hashCode+=marginHeight*281;
return hashCode+spacing;
}
}new JPanel().setLayout(new ColumnLayout());