import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionListener; import java.util.ArrayList; import javax.swing.SwingUtilities; public class NonogramComponent extends Component implements MouseMotionListener { /** * */ private static final long serialVersionUID = 2252313796820615010L; private static final int PIXELS_PER_SQUARE = 16; ArrayList<NonogramEventListener> listeners; private int width; private int height; private boolean[][] pixels; public NonogramComponent(int width, int height) { this.width = width; this.height = height; pixels = new boolean[width][height]; listeners = new ArrayList<NonogramEventListener>(); addMouseMotionListener(this); setPreferredSize(new Dimension(width*PIXELS_PER_SQUARE+1, height*PIXELS_PER_SQUARE+1)); } public void addListener(NonogramEventListener listener) { listeners.add(listener); } public void setPixel(int x, int y, boolean val) { pixels[x][y] = val; repaint(); } @Override public void paint(Graphics g) { Graphics2D g2 = (Graphics2D)g; for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { if (pixels[x][y]) { g2.setColor(Color.BLACK); } else { g2.setColor(Color.WHITE); } g2.fillRect(x*PIXELS_PER_SQUARE, y*PIXELS_PER_SQUARE, PIXELS_PER_SQUARE, PIXELS_PER_SQUARE); } } g2.setColor(Color.BLACK); for (int x = 0; x <= width; x++) { g2.drawLine(x*PIXELS_PER_SQUARE, 0, x*PIXELS_PER_SQUARE, width*PIXELS_PER_SQUARE); } for (int y = 0; y <= width; y++) { g2.drawLine(0, y*PIXELS_PER_SQUARE, height*PIXELS_PER_SQUARE, y*PIXELS_PER_SQUARE); } } @Override public void mouseDragged(MouseEvent e) { boolean left = SwingUtilities.isLeftMouseButton(e); boolean right = SwingUtilities.isRightMouseButton(e); int x = e.getX() / PIXELS_PER_SQUARE; int y = e.getY() / PIXELS_PER_SQUARE; if ((left || right) && x < width && y < height && x >= 0 && y >= 0) { for (NonogramEventListener listener : listeners) { listener.nonogramClicked(x, y, left); } } } @Override public void mouseMoved(MouseEvent e) {} }