samer@1: import java.awt.*; samer@1: import java.awt.event.*; samer@1: import javax.swing.*; samer@1: samer@1: /** A rectangle that has a fixed size. */ samer@1: class BLDComponent extends JComponent { samer@1: private Color normalHue; samer@1: private final Dimension preferredSize; samer@1: private String name; samer@1: private boolean restrictMaximumSize; samer@1: private boolean printSize; samer@1: samer@1: public BLDComponent(float alignmentX, float hue, samer@1: int shortSideSize, samer@1: boolean restrictSize, samer@1: boolean printSize, samer@1: String name) { samer@1: this.name = name; samer@1: this.restrictMaximumSize = restrictSize; samer@1: this.printSize = printSize; samer@1: setAlignmentX(alignmentX); samer@1: normalHue = Color.getHSBColor(hue, 0.4f, 0.85f); samer@1: preferredSize = new Dimension(shortSideSize*2, shortSideSize); samer@1: samer@1: MouseListener l = new MouseAdapter() { samer@1: public void mousePressed(MouseEvent e) { samer@1: int width = getWidth(); samer@1: float alignment = (float)(e.getX()) samer@1: / (float)width; samer@1: samer@1: // Round to the nearest 1/10th. samer@1: int tmp = Math.round(alignment * 10.0f); samer@1: alignment = (float)tmp / 10.0f; samer@1: samer@1: setAlignmentX(alignment); samer@1: revalidate(); // this GUI needs relayout samer@1: repaint(); samer@1: } samer@1: }; samer@1: addMouseListener(l); samer@1: } samer@1: samer@1: /** samer@1: * Our BLDComponents are completely opaque, so we override samer@1: * this method to return true. This lets the painting samer@1: * system know that it doesn't need to paint any covered samer@1: * part of the components underneath this component. The samer@1: * end result is possibly improved painting performance. samer@1: */ samer@1: public boolean isOpaque() { samer@1: return true; samer@1: } samer@1: samer@1: public void paint(Graphics g) { samer@1: int width = getWidth(); samer@1: int height = getHeight(); samer@1: float alignmentX = getAlignmentX(); samer@1: samer@1: g.setColor(normalHue); samer@1: g.fill3DRect(0, 0, width, height, true); samer@1: samer@1: /* Draw a vertical white line at the alignment point.*/ samer@1: // XXX: This code is probably not the best. samer@1: g.setColor(Color.white); samer@1: int x = (int)(alignmentX * (float)width) - 1; samer@1: g.drawLine(x, 0, x, height - 1); samer@1: samer@1: /* Say what the alignment point is. */ samer@1: g.setColor(Color.black); samer@1: g.drawString(Float.toString(alignmentX), 3, height - 3); samer@1: samer@1: if (printSize) { samer@1: System.out.println("BLDComponent " + name + ": size is " samer@1: + width + "x" + height samer@1: + "; preferred size is " samer@1: + getPreferredSize().width + "x" samer@1: + getPreferredSize().height); samer@1: } samer@1: } samer@1: samer@1: public Dimension getPreferredSize() { samer@1: return preferredSize; samer@1: } samer@1: samer@1: public Dimension getMinimumSize() { samer@1: return preferredSize; samer@1: } samer@1: samer@1: public Dimension getMaximumSize() { samer@1: if (restrictMaximumSize) { samer@1: return preferredSize; samer@1: } else { samer@1: return super.getMaximumSize(); samer@1: } samer@1: } samer@1: samer@1: public void setSizeRestriction(boolean restrictSize) { samer@1: restrictMaximumSize = restrictSize; samer@1: } samer@1: samer@1: }