第一次尝试自己写布局管理器,实用价值不大,核心代码和测试代码如下:
ConcentricCirclesPanel.java
ConcentricCirclesPanel.java
- import java.awt.Component;
- import java.awt.Container;
- import java.awt.Dimension;
- import java.awt.Graphics;
- import java.awt.Graphics2D;
- import java.awt.Insets;
- import java.awt.LayoutManager;
- import java.awt.LayoutManager2;
- import java.awt.RenderingHints;
- import javax.swing.JPanel;
- public class ConcentricCirclesPanel extends JPanel {
- private static final long serialVersionUID = 6265955429442551839L;
- protected void paintComponent(Graphics g) {
- super.paintComponent(g);
- LayoutManager layout = getLayout();
- if (!(layout instanceof ConcentricCirclesLayout)) return;
- ConcentricCirclesLayout ccl = (ConcentricCirclesLayout)layout;
- int fcr = ccl.getFirstCircleRadius();
- int ri = ccl.getRadiusIncrement();
- int cn = ccl.getCircleNum();
- Insets insets = getInsets();
- int cx = insets.left + (getWidth() - insets.left - insets.right) / 2;
- int cy = insets.top + (getHeight() - insets.top - insets.bottom) / 2;
- ((Graphics2D) g).setRenderingHint(
- RenderingHints.KEY_ANTIALIASING,
- RenderingHints.VALUE_ANTIALIAS_ON
- );
- for (int r = fcr, ENDR = fcr + ri * (cn - 1); r <= ENDR; r += ri) {
- g.drawOval(cx - r, cy - r, r * 2, r * 2);
- }
- }
- public static class ConcentricCirclesLayout implements LayoutManager2 {
- private int firstCircleRadius;
- private int radiusIncrement;
- private int circleNum;
- private double angleDegrees;
- private Component[] comps;
- public ConcentricCirclesLayout() {
- this(20, 20, 3, 0.0);
- }
- public ConcentricCirclesLayout(int firstCircleRadius, int radiusIncrement, int circleNum, double angleDegrees) {
- super();