code: import java.awt.*;
  import java.awt.event.*;
  import javax.swing.*;
  
  public class Honeycombs extends JFrame {
  
      public static void main(String[] args) {
          SwingUtilities.invokeLater(() -> {
              JFrame f = new Honeycombs();
              f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              f.setVisible(true);
          });
      }
  
      public Honeycombs() {
          add(new HoneycombsPanel(), BorderLayout.CENTER);
          setTitle("Honeycombs");
          setResizable(false);
          pack();
          setLocationRelativeTo(null);
      }
  }
  
  class HoneycombsPanel extends JPanel {
  
      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, y;
              if (i < 12) {
                  x = x1 + (i % 3) * w;
                  y = y1 + (i / 3) * h;
              } else {
                  x = x2 + (i % 2) * w;
                  y = 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);
  
          g.setFont(new Font("SansSerif", Font.BOLD, 30));
          g.setStroke(new BasicStroke(3));
  
          for (Hexagon hex : comb)
              hex.draw(g);
      }
  }
  
  class Hexagon extends Polygon {
      final Color baseColor = Color.yellow;
      final Color selectedColor = Color.magenta;
      final char letter;
  
      private boolean hasBeenSelected;
  
      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.setColor(Color.black);
          g.drawPolygon(this);
  
          g.setColor(hasBeenSelected ? Color.black : Color.red);
          drawCenteredString(g, String.valueOf(letter));
      }
  
      void drawCenteredString(Graphics2D g, String s) {
          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);
      }
  }
  