GraphicsApp API
Eine überarbeitete und angepasste Variante der originalen GraphicsApp-Umgebung
AppManager.java
gehe zur Dokumentation dieser Datei
1package de.ur.mi.oop.app;
2
3import de.ur.mi.oop.colors.Color;
4import de.ur.mi.oop.colors.Colors;
5import de.ur.mi.oop.events.*;
6
7import javax.swing.*;
8import java.awt.*;
9import java.awt.event.*;
10import java.awt.image.BufferedImage;
11
12
13/**
14 * Der AppManager ist dafür zuständig, den Zeichen-Canvas zu initialisieren und
15 * die Anwendungs-Eigenschaften wie Fenstergröße, Fenstertitel usw. zu setzen.
16 * <p>
17 * Im AppManager läuft die Zeichenschleife, welche die Grafikobjekte ständig erneut zeichnet. Er
18 * gibt die Tasten- und Maus-Events an die GraphicsApp weiter.
19 */
20public class AppManager implements ConfigChangeListener, ActionListener, KeyListener, MouseListener, MouseMotionListener {
21
22 private static final Color DEFAULT_BACKGROUND_COLOR = Colors.WHITE;
23
24 private Config config;
25 private GraphicsApp app;
26 private Canvas canvas;
27 private JFrame appFrame;
28 private Timer loopTimer;
29
30 private Cursor originalCursor;
31 private Cursor blankCursor;
32
33 private long lastFrameTime = 0;
34 private int lastFPS = 0;
35
36 public AppManager(GraphicsApp app, Config config) {
37 this.app = app;
38 this.config = config;
39 this.app.setAppManager(this);
40 initFrame();
41 }
42
43 public void start() {
44 startLoop();
45 }
46
47 public void draw() {
48 app.draw();
49 canvas.setComponents(app.getDrawBuffer());
50 canvas.repaint();
51 app.clearDrawBuffer();
52 }
53
54 private void initFrame() {
55 canvas = new Canvas();
56 appFrame = new JFrame();
57 appFrame.setTitle(config.getTitle());
58 appFrame.setSize(config.getWidth(), config.getHeight());
59 appFrame.setLocationRelativeTo(null);
60 appFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
61 appFrame.setResizable(false);
62 appFrame.add(canvas);
63 canvas.addMouseListener(this); // MouseListener auf Canvas, damit Koordinaten Titelleiste nicht beinhalten
64 canvas.addMouseMotionListener(this);
65 appFrame.addKeyListener(this);
66 appFrame.setVisible(true);
67 originalCursor = appFrame.getContentPane().getCursor();
68 blankCursor = Toolkit.getDefaultToolkit().createCustomCursor(
69 new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB), new Point(0, 0), "blank cursor");
70 }
71
72 private void startLoop() {
73 loopTimer = new Timer(1000 / config.getFrameRate(), this);
74 loopTimer.start();
75 }
76
77 private void showFPS(int fps) {
78 if (config.shouldShowFrameRate()) {
79 appFrame.setTitle("Current FPS: ~ " + fps);
80 }
81 }
82
83 private void hideCursor() {
84 appFrame.getContentPane().setCursor(blankCursor);
85 }
86
87 private void showCursor() {
88 appFrame.getContentPane().setCursor(originalCursor);
89 }
90
91 public Graphics2D getGraphicsContext() {
92 return (Graphics2D) canvas.getGraphics();
93 }
94
95 @Override
96 public void actionPerformed(ActionEvent e) {
97 long currentTime = System.currentTimeMillis();
98 long delta = currentTime - lastFrameTime;
99 if (delta != currentTime && delta != 0) {
100 int currentFPS = 1000 / (int) delta;
101 if (Math.abs(currentFPS - lastFPS) > 5) {
102 showFPS(currentFPS);
103 }
104 lastFPS = currentFPS;
105 }
106 draw();
107 lastFrameTime = System.currentTimeMillis();
108 }
109
110 @Override
111 public void onSizeChanged(int newWidth, int newHeight) {
112 appFrame.getContentPane().setPreferredSize(new Dimension(newWidth, newHeight));
113 appFrame.pack();
114 }
115
116 @Override
117 public void onFrameRateChanged(int newFramerate) {
118 if (loopTimer != null) {
119 loopTimer.setDelay(1000 / newFramerate);
120 }
121 }
122
123 @Override
124 public void onCursorVisibilityChanged(boolean cursorVisibility) {
125 if(cursorVisibility) {
126 showCursor();
127 } else {
128 hideCursor();
129 }
130 }
131
132 @Override
133 public void keyTyped(KeyEvent e) {
134 }
135
136 @Override
137 public void keyPressed(KeyEvent e) {
138 // Close GraphicsApp on ESCAPE
139 if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
140 appFrame.dispatchEvent(new WindowEvent(appFrame, WindowEvent.WINDOW_CLOSING));
141 return;
142 }
144 ((GraphicsAppKeyListener) app).onKeyPressed(keyPressedEvent);
145 }
146
147 @Override
148 public void keyReleased(KeyEvent e) {
150 ((GraphicsAppKeyListener) app).onKeyReleased(keyReleasedEvent);
151 }
152
153
154 @Override
155 public void mouseClicked(MouseEvent e) {
156 }
157
158 @Override
159 public void mousePressed(MouseEvent e) {
161 ((GraphicsAppMouseListener) app).onMousePressed(mousePressedEvent);
162 }
163
164 @Override
165 public void mouseReleased(MouseEvent e) {
167 ((GraphicsAppMouseListener) app).onMouseReleased(mouseReleasedEvent);
168 }
169
170 @Override
171 public void mouseEntered(MouseEvent e) {
172
173 }
174
175 @Override
176 public void mouseExited(MouseEvent e) {
177
178 }
179
180 @Override
181 public void mouseDragged(MouseEvent e) {
183 ((GraphicsAppMouseListener) app).onMouseDragged(mouseDraggedEvent);
184 }
185
186 @Override
187 public void mouseMoved(MouseEvent e) {
189 ((GraphicsAppMouseListener) app).onMouseMoved(mouseMovedEvent);
190 }
191}
Graphics2D getGraphicsContext()
Definition: AppManager.java:91
AppManager(GraphicsApp app, Config config)
Definition: AppManager.java:36
void onSizeChanged(int newWidth, int newHeight)
void mousePressed(MouseEvent e)
void onFrameRateChanged(int newFramerate)
void keyReleased(KeyEvent e)
void actionPerformed(ActionEvent e)
Definition: AppManager.java:96
void keyPressed(KeyEvent e)
void mouseDragged(MouseEvent e)
void mouseEntered(MouseEvent e)
void onCursorVisibilityChanged(boolean cursorVisibility)
void mouseReleased(MouseEvent e)
void mouseClicked(MouseEvent e)
void mouseExited(MouseEvent e)
void keyTyped(KeyEvent e)
void mouseMoved(MouseEvent e)
void setComponents(GraphicsObject[] components)
Definition: Canvas.java:36
boolean shouldShowFrameRate()
Definition: Config.java:103
void setAppManager(AppManager manager)
static final Color WHITE
Definition: Colors.java:20
static GraphicsAppKeyEvent createKeyEventFromAWT(KeyEvent event, KeyEventType type)
static GraphicsAppMouseEvent createMouseEventFromAWT(MouseEvent event, MouseEventType type)