import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.util.*;
import javax.swing.*;
public class CMain {
public static void main(final String[] args) {
Runnable gui = new Runnable() {
public void run() {
MyActionListener cmd = new MyActionListener();
MainMenu view = new MainMenu(cmd);
cmd.setView(view);
view.setVisible(true);
}
};
SwingUtilities.invokeLater(gui);
}
}
class MyActionListener implements ActionListener {
private MainMenu mm;
private Random r = new Random();
public void actionPerformed(final ActionEvent event) {
String cmd = event.getActionCommand();
if (cmd.equals("Beenden")) {
System.exit(0);
} else if (cmd.equals("Test")) {
Point location = new Point(r.nextInt(300), r.nextInt(200));
mm.createCircle(location, 50, 50);
}
}
public void setView(final MainMenu mm) {
this.mm = mm;
}
}
class MainMenu extends JFrame {
private final ActionListener listener;
private final JMenu menuFile;
private final JMenuBar menubar;
private final JPanel panel;
public MainMenu(final ActionListener listener) {
super("MainMenu");
this.listener = listener;
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(400, 300);
setLocationRelativeTo(null);
menuFile = createFileMenu(listener);
menubar = new JMenuBar();
menubar.add(menuFile);
setJMenuBar(menubar);
panel = new JPanel(null);
add(panel);
}
private JMenu createFileMenu(final ActionListener listener) {
JMenu menu = new JMenu("File");
menu.setMnemonic('f');
JMenuItem mi = addNewMenuItem("Test", 't', 't', listener);
menu.add(mi);
menu.add(new JSeparator());
mi = addNewMenuItem("Beenden", 'b', 'b', listener);
menu.add(mi);
return menu;
}
private JMenuItem addNewMenuItem(final String CMenuItemName, final char cShortcut,
final char cAccelerationKey, final ActionListener Listener) {
JMenuItem mi = new JMenuItem(CMenuItemName);
mi.setMnemonic(cShortcut);
mi.setAccelerator(KeyStroke.getKeyStroke(cAccelerationKey));
mi.addActionListener(listener);
return mi;
}
public void createCircle(final Point location, final int width, final int height) {
Shape shape = new Ellipse2D.Double(0, 0, width, height);
ShapeComponent shapeComponent = new ShapeComponent(location, shape);
panel.add(shapeComponent);
shapeComponent.setForeground(Color.GREEN);
shapeComponent.requestFocusInWindow();
}
}
class ShapeComponent extends JComponent {
private final Shape shape;
private final JPopupMenu popup;
public ShapeComponent(final Point location, final Shape shape) {
setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
setToolTipText("");
setOpaque(false);
popup = new JPopupMenu();
popup.add(new JMenuItem("Test 1"));
popup.add(new JMenuItem("Test 2"));
setComponentPopupMenu(popup);
Rectangle bounds = shape.getBounds();
setBounds(location.x, location.y,
bounds.width + 2,
bounds.height + 2);
this.shape = shape;
addFocusListener(new FocusListener() {
public void focusGained(final FocusEvent e) {
repaint();
}
public void focusLost(final FocusEvent e) {
repaint();
}
});
addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(final MouseEvent e) {
getParent().setComponentZOrder(ShapeComponent.this, 0);
requestFocusInWindow();
}
});
}
@Override
public String getToolTipText(final MouseEvent event) {
return "hasFocus:" + hasFocus();
}
@Override
public boolean contains(final int x, final int y) {
return shape.contains(x, y);
}
@Override
protected void paintComponent(final Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setColor(getForeground());
if(hasFocus()){
g2.setColor(getForeground().darker().darker());
}
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.fill(shape);
}
}