package javademo.swing.draw.d2; import java.awt.Button; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.geom.Ellipse2D; import java.awt.geom.Rectangle2D; import java.util.Random; import javax.swing.JFrame; import javax.swing.JPanel; /** * 直接在Panel上绘制不同的图像 * @author Dharma * @created 2009-3-14 */ public class ShapeTest { /** * @param args */ public static void main(String[] args) { JFrame frame = new ShapeTestFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } } @SuppressWarnings("serial") class ShapeTestFrame extends JFrame implements ActionListener { private Button button = null; private PaintPanel canvas; public ShapeTestFrame() { setTitle("Shape test"); setLayout(null); // 必需要有此语句! button = new Button("Start"); button.addActionListener(this); add(button); button.setBounds(10, 1, 100, 26); // add(button, BorderLayout.NORTH); canvas = new PaintPanel(); // add(canvas, BorderLayout.CENTER); add(canvas); canvas.setBounds(10, 35, 420, 420); pack(); setSize(430, 480); } @Override public void actionPerformed(ActionEvent e) { canvas.addBox(); } } class PaintPanel extends JPanel { private static final long serialVersionUID = 1L; private int[][] map = new int[20][20]; public PaintPanel() { super(); setLayout(null); // 一定要加上这一句,新增的Box才不会在“最小化”再“还原”后在屏幕上乱跑 setSize(440, 440); for (int i = 0; i < map.length; i++) { for (int j = 0; j < map[i].length; j++) { map[i][j] = 0; } } } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); // 画网络 for (int i = 0; i <= 400; i = i + 20) { g.drawLine(0, i, 400, i); } for (int j = 0; j <= 400; j = j + 20) { g.drawLine(j, 0, j, 400); } // 画图像 Graphics2D g2 = (Graphics2D) g; g2.setColor(Color.BLACK); for (int i = 0; i < map.length; i++) { for (int j = 0; j < map.length; j++) { if (map[i][j] != 0) { Rectangle2D rect = new Rectangle2D.Double(i * 20 + 2, j * 20 + 2, 16, 16); g2.fill(rect); } } } } public void addBox() { int i = new Random().nextInt(map.length * map[0].length); int row = i / map.length; int column = i - (row * map.length); map[row][column] = 1; repaint(); } } class Box { public Box(Color color, double x, double y) { super(); this.color = color; this.x = x; this.y = y; } public Ellipse2D getShape() { return new Ellipse2D.Double(x, y, XSIZE, YSIZE); } public Color getColor() { return color; } Color color; double x = 0; double y = 0; static final int XSIZE = 18; static final int YSIZE = 18; }