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) {
int width = getWidth();
float alignment = (float)(e.getX())
/ (float)width;
// Round to the nearest 1/10th.
int tmp = Math.round(alignment * 10.0f);
alignment = (float)tmp / 10.0f;
setAlignmentX(alignment);
revalidate(); // this GUI needs relayout
repaint();
}
};
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) {
int width = getWidth();
int height = getHeight();
float alignmentX = getAlignmentX();
g.setColor(normalHue);
g.fill3DRect(0, 0, width, 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)width) - 1;
g.drawLine(x, 0, x, height - 1);
/* Say what the alignment point is. */
g.setColor(Color.black);
g.drawString(Float.toString(alignmentX), 3, height - 3);
if (printSize) {
System.out.println("BLDComponent " + name + ": size is "
+ width + "x" + 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;
}
}
|