Swing基础教程 06:定制布局方法
最编程
2024-02-11 11:06:17
...
package my;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Rectangle;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
public class MyFrame extends JFrame
{
public MyFrame(String title)
{
super(title);
// 不使用布局器 (默认地,ContentPane自带一个BorderLayout布局器)
Container root = this.getContentPane();
root.setLayout(null); // 取消其布局器
// 由于没有布局器,所以默认地,子控件无法显示
JLabel a1 = new ColorfulLabel("1", Color.yellow);
JLabel a2 = new ColorfulLabel("2", Color.blue);
root.add(a1);
root.add(a2);
a1.setBounds(new Rectangle(0,0, 200,200));
a2.setBounds(new Rectangle(100,100, 200,100));
}
// ColorfulLabel: 参考4.5节的讲解
private static class ColorfulLabel extends JLabel
{
public ColorfulLabel(String text, Color bgColor)
{
super(text);
setOpaque(true);
setBackground(bgColor);
setPreferredSize(new Dimension(60,30));
setHorizontalAlignment(SwingConstants.CENTER);
setFont(new Font("微软雅黑", Font.PLAIN, 20) );
}
}
}
创建布局器
package my;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.LayoutManager;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
public class MyFrame extends JFrame
{
JLabel a1 = new ColorfulLabel("Hello,World", Color.yellow);
JLabel a2 = new ColorfulLabel("样例文本", new Color(202,255,112));
public MyFrame(String title)
{
super(title);
// 根容器
Container root = this.getContentPane();
// 设置一个自定义的布局器
LayoutManager layoutMgr = new SimpleLayout();
root.setLayout(layoutMgr);
// 由于没有布局器,所以默认地,子控件无法显示
root.add(a1);
root.add(a2);
}
// ColorfulLabel: 参考4.5节的讲解
private static class ColorfulLabel extends JLabel
{
public ColorfulLabel(String text, Color bgColor)
{
super(text);
setOpaque(true);
setBackground(bgColor);
//setPreferredSize(new Dimension(60,30));
setHorizontalAlignment(SwingConstants.CENTER);
setFont(new Font("宋体", Font.PLAIN, 16));
}
}
private class SimpleLayout implements LayoutManager
{
@Override
public void addLayoutComponent(String name, Component comp)
{
}
@Override
public void removeLayoutComponent(Component comp)
{
}
@Override
public Dimension preferredLayoutSize(Container parent)
{
return null;
}
@Override
public Dimension minimumLayoutSize(Container parent)
{
return null;
}
@Override
public void layoutContainer(Container parent)
{
int w = parent.getWidth(); // 父窗口的宽度 width
int h = parent.getHeight(); // 父窗口的高度 height
System.out.println("父容器: " + w + ", " + h);
// a1 显示在中间, 以 Preferred Size 作为大小
if(a1.isVisible())
{
// 得取该控件所需的显示尺寸
Dimension size = a1.getPreferredSize();
//System.out.println(size);
int x = (w - size.width) / 2;
int y = (h - size.height) /2 ;
// 在设置子控件位置时,其坐标是相对于父窗口的
// (0,0) 就是父窗口的左上角
a1.setBounds(x, y, size.width, size.height);
}
// a2 显示在右上角
if(a2.isVisible())
{
Dimension size = a2.getPreferredSize();
//System.out.println(size);
int x = (w - size.width);
int y = 0;
a2.setBounds(x, y, size.width, size.height);
}
}
}
}
手动布局
package my;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.LayoutManager;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import af.swing.layout.AfSimpleLayout;
public class MyFrame extends JFrame
{
JLabel a1 = new ColorfulLabel("Hello,World", Color.yellow);
JLabel a2 = new ColorfulLabel("样例文本", new Color(202,255,112));
public MyFrame(String title)
{
super(title);
// 根容器
Container root = this.getContentPane();
// 设置一个自定义的布局器
LayoutManager layoutMgr = new MyCustomLayout();
root.setLayout(layoutMgr);
// 由于没有布局器,所以默认地,子控件无法显示
root.add(a1);
root.add(a2);
}
// ColorfulLabel: 参考4.5节的讲解
private static class ColorfulLabel extends JLabel
{
public ColorfulLabel(String text, Color bgColor)
{
super(text);
setOpaque(true);
setBackground(bgColor);
//setPreferredSize(new Dimension(60,30));
setHorizontalAlignment(SwingConstants.CENTER);
setFont(new Font("宋体", Font.PLAIN, 16));
}
}
private class MyCustomLayout extends AfSimpleLayout
{
@Override
public void layoutContainer(Container parent)
{
int w = parent.getWidth(); // 父窗口的宽度 width
int h = parent.getHeight(); // 父窗口的高度 height
System.out.println("父容器: " + w + ", " + h);
// a1 显示在中间, 以 Preferred Size 作为大小
if(a1.isVisible())
{
// 得取该控件所需的显示尺寸
Dimension size = a1.getPreferredSize();
//System.out.println(size);
int x = (w - size.width) / 2;
int y = (h - size.height) /2 ;
// 在设置子控件位置时,其坐标是相对于父窗口的
// (0,0) 就是父窗口的左上角
a1.setBounds(x, y, size.width, size.height);
}
// a2 显示在右上角
if(a2.isVisible())
{
Dimension size = a2.getPreferredSize();
//System.out.println(size);
int x = (w - size.width);
int y = 0;
a2.setBounds(x, y, size.width, size.height);
}
}
}
}
package af.swing.layout;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.LayoutManager;
public abstract class AfSimpleLayout implements LayoutManager
{
@Override
public void addLayoutComponent(String name, Component comp)
{
}
@Override
public void removeLayoutComponent(Component comp)
{
}
@Override
public Dimension preferredLayoutSize(Container parent)
{
return null;
}
@Override
public Dimension minimumLayoutSize(Container parent)
{
return null;
}
// @Override
// public void layoutContainer(Container parent)
// {
// }
}
线性布局
package my;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.LayoutManager;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import af.swing.layout.AfXLayout;
public class MyFrame extends JFrame
{
JLabel a1 = new ColorfulLabel("Hello,World", Color.yellow);
JLabel a2 = new ColorfulLabel("样例文本", Color.blue);
JLabel a3 = new ColorfulLabel("Good Boy", Color.CYAN);
JLabel a4 = new ColorfulLabel("占满剩余", Color.red);
public MyFrame(String title)
{
super(title);
// 根容器
JPanel root = new JPanel();
this.setContentPane(root);
// 设置为横向布局
// 注: AfXLayout 与 AfRowLayout等效
root.setLayout(new AfXLayout(8)); // 子控件之间的间距为8像素
root.add(a1, "100px"); // 固定占100像素
root.add(a2, "30%"); // 固定占30%
root.add(a3, "auto"); // 按 Preferred Size 设置
root.add(a4, "1w"); // 按权重设置,权重为1 weight
}
// ColorfulLabel: 参考4.5节的讲解
private static class ColorfulLabel extends JLabel
{
public ColorfulLabel(String text, Color bgColor)
{
super(text);
setOpaque(true);
setBackground(bgColor);
//setPreferredSize(new Dimension(60,30));
setHorizontalAlignment(SwingConstants.CENTER);
setFont(new Font("宋体", Font.PLAIN, 16));
}
}
}
package af.swing.layout;
/* 横向布局器,和 AfRowLayout 等效
*
*/
public class AfXLayout extends AfRowLayout
{
public AfXLayout()
{
}
public AfXLayout(int gap)
{
super(gap);
}
public AfXLayout(int gap, boolean usePerferredSize)
{
super(gap, usePerferredSize);
}
}
*位置布局
package my;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import af.swing.layout.AfAnyWhere;
import af.swing.layout.AfMargin;
public class MyFrame extends JFrame
{
JLabel a1 = new ColorfulLabel("Hello,World", Color.yellow);
JLabel a2 = new ColorfulLabel("样例文本", Color.blue);
JLabel a3 = new ColorfulLabel("Good Boy", Color.CYAN);
JLabel a4 = new ColorfulLabel("占满剩余", Color.red);
public MyFrame(String title)
{
super(title);
// 根容器
JPanel root = new JPanel();
this.setContentPane(root);
// 设置为自动位置布局
root.setLayout(new AfAnyWhere());
// 左上 ,相当于 new AfMargin(0,0,-1,-1)
root.add(a1, AfMargin.TOP_LEFT);
// 右上 ,相当于 new AfMargin(0,-1,-1,0)
root.add(a2, AfMargin.TOP_RIGHT);
// 中间 ,相当于 new AfMargin(-1, -1, -1, -1)
root.add(a3, AfMargin.CENTER); // 中间
a3.setPreferredSize(new Dimension(160,80));
// *位置定义
root.add(a4, new AfMargin(
推荐阅读