package gamegui; import java.awt.Color; import java.awt.Graphics; import java.awt.event.MouseEvent; import java.awt.FontMetrics; import java.awt.Font; import java.util.ArrayList; public class Menu extends Member { private ArrayList items; private int selectedIndex; private String label; private Font font; private boolean open; private FontMetrics metrics; public Menu(final String newName, final int newX, final int newY, final int newWidth, final int newHeight, final String newLabel, final Font newFont) { super(newName, newX, newY, newWidth, newHeight); this.items = new ArrayList(); this.selectedIndex = -1; this.label = newLabel; this.font = newFont; this.open = false; } @Override public boolean handleEvent(final MouseEvent e) { if (this.getX() + this.metrics.stringWidth(this.label) + 4 <= e.getX() && e.getX() <= this.getX() + this.getWidth() && this.getY() + this.getHeight() <= e.getY() && e.getY() <= this.getY() + this.getHeight() + 15 * this.items.size() && this.open) { this.selectedIndex = (e.getY() - this.getY() - this.getHeight()) / 15; this.open = false; return true; } if (this.getX() + this.getWidth() - this.getHeight() <= e.getX() && e.getX() <= this.getX() + this.getWidth() && this.getY() <= e.getY() && e.getY() <= this.getY() + this.getHeight()) { this.open = !this.open; return true; } return false; } @Override public void clear() { if (this.selectedIndex != -1) { this.selectedIndex = 0; } } @Override public void draw(final Graphics g) { this.metrics = g.getFontMetrics(this.font); g.setColor(Color.black); g.fillRect(this.getX(), this.getY(), this.getWidth(), this.getHeight()); g.setColor(Color.red); g.drawRect(this.getX(), this.getY(), this.getWidth(), this.getHeight()); g.drawLine(this.getX() + this.metrics.stringWidth(this.label) + 4, this.getY(), this.getX() + this.metrics.stringWidth(this.label) + 4, this.getY() + this.getHeight()); g.drawLine(this.getX() + this.getWidth() - this.getHeight(), this.getY(), this.getX() + this.getWidth() - this.getHeight(), this.getY() + this.getHeight()); g.drawLine(this.getX() + this.getWidth() - this.getHeight() * 17 / 20, this.getY() + this.getHeight() * 3 / 20, this.getX() + this.getWidth() - this.getHeight() * 3 / 20, this.getY() + this.getHeight() * 3 / 20); g.drawLine(this.getX() + this.getWidth() - this.getHeight() * 17 / 20, this.getY() + this.getHeight() * 3 / 20, this.getX() + this.getWidth() - this.getHeight() / 2, this.getY() + this.getHeight() * 17 / 20); g.drawLine(this.getX() + this.getWidth() - this.getHeight() / 2, this.getY() + this.getHeight() * 17 / 20, this.getX() + this.getWidth() - this.getHeight() * 3 / 20, this.getY() + this.getHeight() * 3 / 20); g.setColor(Color.green); g.setFont(this.font); g.drawString(this.label, this.getX() + 2, this.getY() + (this.getHeight() + this.metrics.getHeight()) / 2 - 2); g.drawString(this.items.get(this.selectedIndex), this.getX() + this.metrics.stringWidth(this.label) + 8, this.getY() + (this.getHeight() + this.metrics.getHeight()) / 2 - 2); if (this.open) { g.setColor(Color.black); g.fillRect(this.getX() + this.metrics.stringWidth(this.label) + 4, this.getY() + this.getHeight(), this.getWidth() - this.metrics.stringWidth(this.label) - 4, this.items.size() * 15); g.setColor(Color.red); g.drawRect(this.getX() + this.metrics.stringWidth(this.label) + 4, this.getY() + this.getHeight(), this.getWidth() - this.metrics.stringWidth(this.label) - 4, this.items.size() * 15); if (this.selectedIndex != -1) { g.setColor(Color.blue); g.fillRect(this.getX() + this.metrics.stringWidth(this.label) + 5, this.getY() + this.getHeight() + 1 + 15 * this.selectedIndex, this.getWidth() - this.metrics.stringWidth(this.label) - 5, 14); } g.setColor(Color.green); for (int x = 0; x < this.items.size(); ++x) { g.drawString(this.items.get(x), this.getX() + this.metrics.stringWidth(this.label) + 8, this.getY() + (this.getHeight() + this.metrics.getHeight()) / 2 + 15 * (x + 1)); } } } public void add(final String newString) { this.selectedIndex = 0; this.items.add(newString); } public String getSelected() { return this.items.get(this.selectedIndex); } }