added working click listener

This commit is contained in:
rmaco
2020-03-03 22:27:05 +02:00
parent d1f0716fcb
commit c0f062c565
14 changed files with 479 additions and 25 deletions

View File

@@ -1,4 +0,0 @@
<?xml version="1.0"?>
<Window Visible="true" Size="640, 480" PositionRelativeTo="null">
<Button BackgroundColor="#990000"/>
</Window>

9
resources/ui.xml Normal file
View File

@@ -0,0 +1,9 @@
<?xml version="1.0"?>
<Window Name="window" Visible="true" Size="640, 480">
<Button Name="button1" BackgroundColor="#990000" Size="200, 200" Label="button1">
<Button Name="button4" BackgroundColor="#009999" Size="100, 100" Label="button4">
<Button Name="button2" BackgroundColor="#000099" Label="button2"/>
</Button>
</Button>
<Button Name="button3" BackgroundColor="#009900" Location="300, 300" Label="button3"/>
</Window>

View File

@@ -1,3 +1,4 @@
import guiTree.Button;
import guiTree.Window; import guiTree.Window;
import parser.XAMLParser; import parser.XAMLParser;
@@ -7,14 +8,16 @@ import java.awt.event.WindowEvent;
public class Main { public class Main {
public static void main(String[] args) { public static void main(String[] args) {
try{ try{
Window window = XAMLParser.parse("company.xml"); Window window = XAMLParser.parse("ui.xml");
assert window != null; assert window != null;
Button button = (Button)window.findByName("button1");
window.addWindowListener(new WindowAdapter() { window.addWindowListener(new WindowAdapter() {
@Override @Override
public void windowClosing(WindowEvent e) { public void windowClosing(WindowEvent e) {
window.dispose(); window.dispose();
} }
}); });
}catch (Exception e){ }catch (Exception e){
e.printStackTrace(); e.printStackTrace();
} }

View File

@@ -1,15 +1,62 @@
package guiTree; package guiTree;
import guiTree.Visual; import guiTree.events.MouseListener;
import java.awt.*; import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
public class Button extends Visual { public class Button extends Visual {
private String label;
public Button() public Button() {
{ this("");
}
public Button(String label) {
super(); super();
this.label = label;
this.addMouseListener(new MouseListener() {
@Override
public void mouseClicked(MouseEvent mouseEvent) {
if(getBackgroundColor() == Color.BLACK) {
setBackgroundColor(Color.RED);
}
else {
setBackgroundColor(Color.BLACK);
}
}
@Override
public void mouseReleased(MouseEvent mouseEvent) {
}
@Override
public void mousePressed(MouseEvent mouseEvent) {
}
@Override
public void mouseEntered(MouseEvent mouseEvent) {
}
@Override
public void mouseExited(MouseEvent mouseEvent) {
}
@Override
public void mouseDragged(MouseEvent mouseEvent) {
}
@Override
public void mouseMoved(MouseEvent mouseEvent) {
}
});
} }
@Override @Override
@@ -17,6 +64,16 @@ public class Button extends Visual {
{ {
Graphics g = imageBuffer.getGraphics(); Graphics g = imageBuffer.getGraphics();
g.setColor(this.getBackgroundColor()); g.setColor(this.getBackgroundColor());
g.fillRect(0, 0, getWidth(), getHeight()); g.fillRoundRect(0, 0, this.getWidth(), this.getHeight(), 50, 50);
g.setColor(this.getForegroundColor());
g.drawString(this.label, this.getWidth()/2, this.getHeight()/2);
}
public void setLabel(String label) {
this.label = label;
}
public String getLabel() {
return this.label;
} }
} }

View File

@@ -1,19 +1,32 @@
package guiTree; package guiTree;
import guiTree.events.KeyEventGetter;
import guiTree.events.MouseWheelGetter;
import javax.swing.event.MouseInputListener;
import java.awt.*; import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
public class CustomFrame extends Frame { public class CustomFrame extends Frame {
private BufferedImage imageBuffer; private BufferedImage imageBuffer;
private Window parentWindow;
public CustomFrame() public CustomFrame(Window parent)
{ {
super(); this("", parent);
} }
public CustomFrame(String name) public CustomFrame(String name, Window parent)
{ {
super(name); super(name);
this.parentWindow = parent;
this.addMouseMotionListener(new MouseEventGetter(parent));
this.addMouseListener(new MouseEventGetter(parent));
this.addKeyListener(new KeyEventGetter(parent));
this.addMouseWheelListener(new MouseWheelGetter(parent));
} }
public void setImageBuffer(BufferedImage imageBuffer) { public void setImageBuffer(BufferedImage imageBuffer) {

View File

@@ -0,0 +1,52 @@
package guiTree;
import javax.swing.event.MouseInputListener;
import java.awt.event.MouseEvent;
public class MouseEventGetter implements MouseInputListener {
private Window callingWindow;
public MouseEventGetter(Window callingWindow) {
this.callingWindow = callingWindow;
}
@Override
public void mouseDragged(MouseEvent mouseEvent) {
callingWindow.mouseDragged(mouseEvent, 0, 0);
}
@Override
public void mouseMoved(MouseEvent mouseEvent) {
callingWindow.mouseMoved(mouseEvent, 0, 0);
System.out.println("MOVED");
}
@Override
public void mouseClicked(MouseEvent mouseEvent) {
callingWindow.mouseClicked(mouseEvent, 0, 0);
System.out.println("CLICKED");
}
@Override
public void mousePressed(MouseEvent mouseEvent) {
callingWindow.mousePressed(mouseEvent, 0, 0);
System.out.println("PRESSED");
}
@Override
public void mouseReleased(MouseEvent mouseEvent) {
callingWindow.mouseReleased(mouseEvent, 0, 0);
}
@Override
public void mouseEntered(MouseEvent mouseEvent) {
callingWindow.mouseEntered(mouseEvent, 0, 0);
System.out.println("ENTERED");
}
@Override
public void mouseExited(MouseEvent mouseEvent) {
callingWindow.mouseExited(mouseEvent, 0, 0);
System.out.println("EXITED");
}
}

View File

@@ -1,6 +1,12 @@
package guiTree; package guiTree;
import guiTree.events.KeyListener;
import guiTree.events.MouseListener;
import guiTree.events.MouseWheelListener;
import java.awt.*; import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseWheelEvent;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -13,12 +19,14 @@ public class Visual {
private List<Visual> children; private List<Visual> children;
private Visual parent; private Visual parent;
private BufferedImage imageBuffer; private BufferedImage imageBuffer;
private String name;
private List<MouseListener> mouseListeners;
private List<MouseWheelListener> mouseWheelListeners;
private List<KeyListener> keyListeners;
/*-------------------------------------------------------------------- /*--------------------------------------------------------------------
Attributes Attributes
---------------------------------------------------------------------*/ ---------------------------------------------------------------------*/
private String name;
private Integer width; private Integer width;
private Integer height; private Integer height;
private Integer locationX; private Integer locationX;
@@ -33,6 +41,9 @@ public class Visual {
---------------------------------------------------------------------*/ ---------------------------------------------------------------------*/
public Visual() { public Visual() {
this.children = new ArrayList<>(); this.children = new ArrayList<>();
this.mouseWheelListeners = new ArrayList<>();
this.mouseListeners = new ArrayList<>();
this.keyListeners = new ArrayList<>();
this.parent = null; this.parent = null;
this.backgroundColor = Color.WHITE; this.backgroundColor = Color.WHITE;
this.foregroundColor = Color.BLACK; this.foregroundColor = Color.BLACK;
@@ -105,13 +116,21 @@ public class Visual {
} }
private void calculateInitialSize() { private void calculateInitialSize() {
this.width = 20; if(this.width == null) {
this.height = 20; this.width = 20;
}
if(this.height == null){
this.height = 20;
}
} }
private void calculateInitialLocation(){ private void calculateInitialLocation(){
this.locationX = 20; if(this.locationX == null) {
this.locationY = 50; this.locationX = 20;
}
if(this.locationY == null){
this.locationY = 50;
}
} }
@@ -119,6 +138,22 @@ public class Visual {
Tree Methods Tree Methods
---------------------------------------------------------------------*/ ---------------------------------------------------------------------*/
public Visual findByName(String name){
if(this.name.equals(name)){
return this;
}
else{
for(Visual child: children){
Visual visual;
visual = child.findByName(name);
if(visual != null){
return visual;
}
}
}
return null;
}
public void addVisual(Visual child) { public void addVisual(Visual child) {
this.children.add(child); this.children.add(child);
child.setParent(this); child.setParent(this);
@@ -130,6 +165,16 @@ public class Visual {
child.revalidate(); child.revalidate();
} }
public void removeVisual(Visual child) {
this.children.remove(child);
child.setParent(null);
child.setSize(0, 0);
child.setLocation(0, 0);
child.imageBuffer = null;
child.active = false;
revalidate();
}
private void setParent(Visual parent) private void setParent(Visual parent)
{ {
this.parent = parent; this.parent = parent;
@@ -172,14 +217,199 @@ public class Visual {
} }
/*--------------------------------------------------------------------
Listener Methods
---------------------------------------------------------------------*/
void addMouseListener(MouseListener mouseListener) {
this.mouseListeners.add(mouseListener);
}
void removeMouseListener(MouseListener mouseListener) {
this.mouseListeners.remove(mouseListener);
}
void addMouseWheelListener(MouseWheelListener mouseWheelListener) {
this.mouseWheelListeners.add(mouseWheelListener);
}
void removeMouseWheelListener(MouseWheelListener mouseWheelListener) {
this.mouseWheelListeners.remove(mouseWheelListener);
}
void addKeyListener(KeyListener keyListener) {
this.keyListeners.add(keyListener);
}
void removeKeyListener(KeyListener keyListener) {
this.keyListeners.remove(keyListener);
}
void mouseClicked(MouseEvent mouseEvent, int offsetX, int offsetY) {
boolean front = true;
int mouseX = mouseEvent.getX() - offsetX;
int mouseY = mouseEvent.getY() - offsetY;
for(Visual v: children) {
if(mouseX > v.getLocationX() &&
mouseY > v.getLocationY() &&
mouseX < v.getWidth() + v.getLocationX() &&
mouseY < v.getHeight() + v.getLocationY()) {
front = false;
v.mouseClicked(mouseEvent, v.locationX + offsetX, v.locationY + offsetY);
}
}
if(front) {
for(MouseListener mouseListener: mouseListeners) {
mouseListener.mouseClicked(mouseEvent);
}
}
}
void mouseReleased(MouseEvent mouseEvent, int offsetX, int offsetY) {
boolean front = true;
int mouseX = mouseEvent.getX() + offsetX;
int mouseY = mouseEvent.getY() + offsetY;
for(Visual v: children) {
if(mouseX > v.getLocationX() &&
mouseY < v.getLocationY() &&
mouseX < v.getWidth() &&
mouseY > v.getHeight()) {
front = false;
v.mouseReleased(mouseEvent, offsetX + v.locationX, offsetY + v.locationY);
}
}
if(front) {
for(MouseListener mouseListener: mouseListeners) {
mouseListener.mouseReleased(mouseEvent);
}
}
}
void mousePressed(MouseEvent mouseEvent, int offsetX, int offsetY) {
boolean front = true;
int mouseX = mouseEvent.getX() + offsetX;
int mouseY = mouseEvent.getY() + offsetY;
for(Visual v: children) {
if(mouseX > v.getLocationX() &&
mouseY < v.getLocationY() &&
mouseX < v.getWidth() &&
mouseY > v.getHeight()) {
front = false;
v.mousePressed(mouseEvent, offsetX + v.locationX, offsetY + v.locationY);
}
}
if(front) {
for(MouseListener mouseListener: mouseListeners) {
mouseListener.mousePressed(mouseEvent);
}
}
}
void mouseEntered(MouseEvent mouseEvent, int offsetX, int offsetY) {
boolean front = true;
int mouseX = mouseEvent.getX() + offsetX;
int mouseY = mouseEvent.getY() + offsetY;
for(Visual v: children) {
if(mouseX > v.getLocationX() &&
mouseY < v.getLocationY() &&
mouseX < v.getWidth() &&
mouseY > v.getHeight()) {
front = false;
v.mouseEntered(mouseEvent, offsetX + v.locationX, offsetY + v.locationY);
}
}
if(front) {
for(MouseListener mouseListener: mouseListeners) {
mouseListener.mouseEntered(mouseEvent);
}
}
}
void mouseExited(MouseEvent mouseEvent, int offsetX, int offsetY) {
boolean front = true;
int mouseX = mouseEvent.getX() + offsetX;
int mouseY = mouseEvent.getY() + offsetY;
for(Visual v: children) {
if(mouseX > v.getLocationX() &&
mouseY < v.getLocationY() &&
mouseX < v.getWidth() &&
mouseY > v.getHeight()) {
front = false;
v.mouseExited(mouseEvent, offsetX + v.locationX, offsetY + v.locationY);
}
}
if(front) {
for(MouseListener mouseListener: mouseListeners) {
mouseListener.mouseExited(mouseEvent);
}
}
}
void mouseDragged(MouseEvent mouseEvent, int offsetX, int offsetY) {
boolean front = true;
int mouseX = mouseEvent.getX() + offsetX;
int mouseY = mouseEvent.getY() + offsetY;
for(Visual v: children) {
if(mouseX > v.getLocationX() &&
mouseY < v.getLocationY() &&
mouseX < v.getWidth() &&
mouseY > v.getHeight()) {
front = false;
v.mouseDragged(mouseEvent, offsetX + v.locationX, offsetY + v.locationY);
}
}
if(front) {
for(MouseListener mouseListener: mouseListeners) {
mouseListener.mouseDragged(mouseEvent);
}
}
}
void mouseMoved(MouseEvent mouseEvent, int offsetX, int offsetY) {
boolean front = true;
int mouseX = mouseEvent.getX() + offsetX;
int mouseY = mouseEvent.getY() + offsetY;
for(Visual v: children) {
if(mouseX > v.getLocationX() &&
mouseY < v.getLocationY() &&
mouseX < v.getWidth() &&
mouseY > v.getHeight()) {
front = false;
v.mouseMoved(mouseEvent, offsetX + v.locationX, offsetY + locationY);
}
}
if(front) {
for(MouseListener mouseListener: mouseListeners) {
mouseListener.mouseMoved(mouseEvent);
}
}
}
void mouseWheelMoved(MouseWheelEvent mouseWheelEvent, int offsetX, int offsetY) {
boolean front = true;
int mouseX = mouseWheelEvent.getX() + offsetX;
int mouseY = mouseWheelEvent.getY() + offsetY;
for(Visual v: children) {
if(mouseX > v.getLocationX() &&
mouseY < v.getLocationY() &&
mouseX < v.getWidth() &&
mouseY > v.getHeight()) {
front = false;
v.mouseWheelMoved(mouseWheelEvent, offsetX + v.locationX, offsetY + v.locationY);
}
}
if(front) {
for(MouseWheelListener mouseWheelListener: mouseWheelListeners) {
mouseWheelListener.mouseWheelMoved(mouseWheelEvent);
}
}
}
/*-------------------------------------------------------------------- /*--------------------------------------------------------------------
Helper Methods Helper Methods
---------------------------------------------------------------------*/ ---------------------------------------------------------------------*/
private void initializeImageBuffer(Integer width, Integer height){ private void initializeImageBuffer(Integer width, Integer height){
this.imageBuffer = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR); this.imageBuffer = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
this.imageBuffer.getGraphics().setColor(backgroundColor); this.imageBuffer.getGraphics().setColor(backgroundColor);
this.imageBuffer.getGraphics().fillRect(0, 0, width, height); this.imageBuffer.getGraphics().fillRect(0, 0, width, height);
this.imageBuffer.getGraphics().setColor(foregroundColor);
} }
} }

View File

@@ -1,19 +1,19 @@
package guiTree; package guiTree;
import guiTree.Visual;
import java.awt.*; import java.awt.*;
import java.awt.event.WindowListener; import java.awt.event.WindowListener;
import java.awt.event.WindowStateListener; import java.awt.event.WindowStateListener;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.util.List;
public class Window extends Visual { public class Window extends Visual {
public CustomFrame frame; public CustomFrame frame;
private List<Visual> listenerList;
public Window() public Window()
{ {
super(); super();
this.frame = new CustomFrame(); this.frame = new CustomFrame(this);
this.addWindowStateListener(e -> { this.addWindowStateListener(e -> {
this.setSize(getWidth(), getHeight()); this.setSize(getWidth(), getHeight());
revalidate(); revalidate();
@@ -64,4 +64,14 @@ public class Window extends Visual {
public void setPositionRelativeTo(){ public void setPositionRelativeTo(){
frame.setLocationRelativeTo(null); frame.setLocationRelativeTo(null);
} }
public void setUndecorated(Boolean undecorated){frame.setUndecorated(undecorated);}
public void addListener(Visual listener) {
this.listenerList.add(listener);
}
public void removeListener(Visual listener) {
this.listenerList.remove(listener);
}
} }

View File

@@ -0,0 +1,29 @@
package guiTree.events;
import guiTree.Window;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class KeyEventGetter implements KeyListener {
public Window callingWindow;
public KeyEventGetter(Window callingWindow) {
this.callingWindow = callingWindow;
}
@Override
public void keyTyped(KeyEvent keyEvent) {
}
@Override
public void keyPressed(KeyEvent keyEvent) {
}
@Override
public void keyReleased(KeyEvent keyEvent) {
}
}

View File

@@ -0,0 +1,9 @@
package guiTree.events;
import java.awt.event.KeyEvent;
public interface KeyListener {
void keyTyped(KeyEvent keyEvent);
void keyPressed(KeyEvent keyEvent);
void keyReleased(KeyEvent keyEvent);
}

View File

@@ -0,0 +1,13 @@
package guiTree.events;
import java.awt.event.MouseEvent;
public interface MouseListener {
void mouseClicked(MouseEvent mouseEvent);
void mouseReleased(MouseEvent mouseEvent);
void mousePressed(MouseEvent mouseEvent);
void mouseEntered(MouseEvent mouseEvent);
void mouseExited(MouseEvent mouseEvent);
void mouseDragged(MouseEvent mouseEvent);
void mouseMoved(MouseEvent mouseEvent);
}

View File

@@ -0,0 +1,19 @@
package guiTree.events;
import guiTree.Window;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
public class MouseWheelGetter implements MouseWheelListener {
private Window callingWindow;
public MouseWheelGetter(Window callingWindow) {
this.callingWindow = callingWindow;
}
@Override
public void mouseWheelMoved(MouseWheelEvent mouseWheelEvent) {
}
}

View File

@@ -0,0 +1,7 @@
package guiTree.events;
import java.awt.event.MouseWheelEvent;
public interface MouseWheelListener {
void mouseWheelMoved(MouseWheelEvent mouseWheelEvent);
}

View File

@@ -23,11 +23,18 @@ public class XAMLParser {
String methodName = "set"; String methodName = "set";
methodName = methodName.concat(attribute.getNodeName()); methodName = methodName.concat(attribute.getNodeName());
List<Object> parameterList = convertStringToPrimitives(object, attribute.getNodeValue(), methodName); List<Object> parameterList = convertStringToPrimitives(object, attribute.getNodeValue(), methodName);
Method method = getMethod(object, methodName, parameterList); if(parameterList == null) {
break;
}
Class<?>[] parameterTypes = new Class[parameterList.size()];
for(int index = 0; index < parameterList.size(); index++){
parameterTypes[index] = parameterList.get(index).getClass();
}
try { try {
Method method = object.getClass().getMethod(methodName, parameterTypes);
assert method != null; assert method != null;
method.invoke(object, parameterList.toArray()); method.invoke(object, parameterList.toArray());
} catch (IllegalAccessException | InvocationTargetException e) { } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
e.printStackTrace(); e.printStackTrace();
} }
} }