Honeycombs: Difference between revisions

Content added Content deleted
(ActionScript implementation)
(→‎{{header|Java}}: added Java)
Line 1,099: Line 1,099:
{{libheader|Icon Programming Library}}
{{libheader|Icon Programming Library}}
[http://www.cs.arizona.edu/icon/library/src/procs/printf.icn printf.icn provides formatting]
[http://www.cs.arizona.edu/icon/library/src/procs/printf.icn printf.icn provides formatting]

=={{header|Java}}==
<lang java>import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Honeycombs extends JFrame {

HoneycombsPanel panel;

public static void main(String[] args) {
JFrame f = new Honeycombs();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}

public Honeycombs() {
Container content = getContentPane();
content.setLayout(new BorderLayout());
panel = new HoneycombsPanel();
content.add(panel, BorderLayout.CENTER);
setTitle("Honeycombs");
setResizable(false);
pack();
setLocationRelativeTo(null);
}
}

class HoneycombsPanel extends JPanel {

class Hexagon extends Polygon {
final Color baseColor = Color.yellow;
final Color selectedColor = Color.magenta;
final char letter;

private boolean hasBeenSelected = false;

Hexagon(int x, int y, int halfWidth, char c) {
letter = c;
for (int i = 0; i < 6; i++)
addPoint((int) (x + halfWidth * Math.cos(i * Math.PI / 3)),
(int) (y + halfWidth * Math.sin(i * Math.PI / 3)));
getBounds();
}

void setSelected() {
hasBeenSelected = true;
}

void draw(Graphics2D g) {
g.setColor(hasBeenSelected ? selectedColor : baseColor);
g.fillPolygon(this);

g.setStroke(new BasicStroke(3));
g.setColor(Color.black);
g.drawPolygon(this);

g.setColor(hasBeenSelected ? Color.black : Color.red);
drawCenteredString(String.valueOf(letter), g);
}

void drawCenteredString(String s, Graphics2D g) {
g.setFont(new Font("SansSerif", Font.BOLD, 30));

FontMetrics fm = g.getFontMetrics();
int asc = fm.getAscent();
int dec = fm.getDescent();

int x = bounds.x + (bounds.width - fm.stringWidth(s)) / 2;
int y = bounds.y + (asc + (bounds.height - (asc + dec)) / 2);

g.drawString(s, x, y);
}
}

Hexagon[] comb;

public HoneycombsPanel() {
setPreferredSize(new Dimension(600, 500));
setBackground(Color.white);
setFocusable(true);

addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
for (Hexagon hex : comb)
if (hex.contains(e.getX(), e.getY())) {
hex.setSelected();
break;
}
repaint();
}
});

addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
for (Hexagon hex : comb)
if (hex.letter == Character.toUpperCase(e.getKeyChar())) {
hex.setSelected();
break;
}
repaint();
}
});

char[] letters = "LRDGITPFBVOKANUYCESM".toCharArray();
comb = new Hexagon[20];

int x1 = 150, y1 = 100, x2 = 225, y2 = 143, w = 150, h = 87;
for (int i = 0; i < comb.length; i++) {
int x = i < 12 ? x1 + (i % 3) * w : x2 + (i % 2) * w;
int y = i < 12 ? y1 + (i / 3) * h : y2 + ((i - 12) / 2) * h;
comb[i] = new Hexagon(x, y, w / 3, letters[i]);
}

requestFocus();
}

@Override
public void paintComponent(Graphics gg) {
super.paintComponent(gg);
Graphics2D g = (Graphics2D) gg;
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);

for (Hexagon hex : comb)
hex.draw(g);
}
}</lang>


=={{header|Perl}}==
=={{header|Perl}}==