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