Hallo,
ich habe versucht einen Listener zu erstellen der mit eigenen Knöpfen funktioniert…
Ich habe keine Ahnung wie das in Swing ist, aber ich habe einfach angefangen so wie ich denke, dass es funktionieren würde…
Und es hat auch wunderbar funktioniert!
Die Klasse Button ist nur erstmal zum Test da, später wird sich das noch ein wenig verändern (z.b. Bilder anstatt recs).
Button (müsst nicht alles durchlesen)
ActionEvent
Die Klasse ActionListener ist nur ein interface mit der
-Methode.
Es funktioniert alles wunderbar, doch es ist ein bisschen komisch mit den Positionen…
Wenn die Maus von rechts auf den Button geht, ist der Button schon 2 Pixel davor "entered", genauso mit der y, also von oben.
Und wenn ich von rechts oder unten komme, dann muss die Maus 2 extra Pixel weiter rein gehen, damit es "entered" ist.
Es ist aber so, dass wenn ich die 2 Pixel vor dem Button bin, mir die richtige Position angezeigt wird, obwohl ich deutlich 2 Pixel noch davor bin!
Ich glaube aber nicht das es am Überprüfen liegt, da die Maus-Position ja nicht verschoben sein kann, sondern dass ich irgendwas am Zeichnen falsch gemacht habe…
Ich konnte aber den Fehler nicht finden, deswegen hoffe ich, dass ihr mir helfen könnt (trotz meiner schlechten Erklärung).
Vielen Dank
ich habe versucht einen Listener zu erstellen der mit eigenen Knöpfen funktioniert…
Ich habe keine Ahnung wie das in Swing ist, aber ich habe einfach angefangen so wie ich denke, dass es funktionieren würde…
Und es hat auch wunderbar funktioniert!
Die Klasse Button ist nur erstmal zum Test da, später wird sich das noch ein wenig verändern (z.b. Bilder anstatt recs).
Button (müsst nicht alles durchlesen)
Java:
package display.components.button;
import java.awt.Color;
import java.awt.Graphics;
import main.config.Config;
public class Button {
private String NAME, STRING;
private int X, Y, WIDTH, HEIGHT;
private double F;
private boolean isPressed = false, isEntered = false;
public Button(String STRING) {
this.STRING = STRING;
F = Double.parseDouble(Config.getProperty("SCREEN_FACTOR"));
}
public void setSize(int WIDTH, int HEIGHT) {
this.WIDTH = (int) (WIDTH*F);
this.HEIGHT = (int) (HEIGHT*F);
}
public void setLocation(int X, int Y) {
this.X = (int) (X*F);
this.Y = (int) (Y*F);
}
public int getWidth() {
return WIDTH;
}
public int getHeight() {
return HEIGHT;
}
public int getX() {
return X;
}
public int getY() {
return Y;
}
public String getName() {
return NAME;
}
public void setName(String NAME) {
this.NAME = NAME;
}
public String getString() {
return STRING;
}
public void draw(Graphics g) {
if(this.isPressed) {
g.setColor(new Color(200, 200, 200, 100));
g.drawRoundRect(X+1, Y+1, WIDTH-2, HEIGHT-2, 10, 10);
} else if(this.isEntered) {
g.setColor(new Color(100, 100, 100, 100));
g.drawRoundRect(X+1, Y+1, WIDTH-2, HEIGHT-2, 10, 10);
}
g.setColor(Color.BLACK);
g.drawRoundRect(X, Y, WIDTH, HEIGHT, 10, 10);
g.drawString(STRING, X+WIDTH/25, Y+HEIGHT/2);
}
public void setPressed(boolean isPressed) {
this.isPressed = isPressed;
}
public boolean isPressed() {
return isPressed;
}
public void setEntered(boolean isEntered) {
this.isEntered = isEntered;
}
public boolean isEntered() {
return isEntered;
}
}
ActionEvent
Java:
package display.components.button;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.List;
import javax.swing.JPanel;
public class ActionEvent implements MouseListener {
private ActionListener LISTENER;
private List<Button> BUTTONS;
private Button CLICKED_BUTTON;
public ActionEvent(JPanel PANEL, List<Button> BUTTONS, ActionListener LISTENER) {
this.BUTTONS = BUTTONS;
this.LISTENER = LISTENER;
PANEL.addMouseListener(this);
PANEL.addMouseMotionListener(new MouseEntered(BUTTONS));
}
@Override
public void mouseClicked(MouseEvent e) {}
@Override
public void mouseEntered(MouseEvent e) {}
@Override
public void mouseExited(MouseEvent e) {}
@Override
public void mousePressed(MouseEvent e) {
int X = e.getX(), Y = e.getY();
for(int i = 0; i < BUTTONS.size(); i++) {
Button BUTTON = BUTTONS.get(i);
if(X >= BUTTON.getX() && BUTTON.getX()+BUTTON.getWidth() >= X && Y >= BUTTON.getY() && BUTTON.getY()+BUTTON.getHeight() >= Y)BUTTON.setPressed(true);
}
}
@Override
public void mouseReleased(MouseEvent e) {
int X = e.getX(), Y = e.getY();
for(int i = 0; i < BUTTONS.size(); i++) {
Button BUTTON = BUTTONS.get(i);
if(X >= BUTTON.getX() && BUTTON.getX()+BUTTON.getWidth() >= X && Y >= BUTTON.getY() && BUTTON.getY()+BUTTON.getHeight() >= Y && BUTTON.isPressed()) {
BUTTON.setPressed(false);
CLICKED_BUTTON = BUTTON;
LISTENER.actionPerformed(this);
} else {
BUTTON.setPressed(false);
CLICKED_BUTTON = null;
}
}
}
public Button getSource() {
return CLICKED_BUTTON;
}
class MouseEntered implements MouseMotionListener {
private List<Button> BUTTONS;
public MouseEntered(List<Button> BUTTONS) {
this.BUTTONS = BUTTONS;
}
@Override
public void mouseDragged(MouseEvent e) {}
@Override
public void mouseMoved(MouseEvent e) {
int X = e.getX(), Y = e.getY();
for(int i = 0; i < BUTTONS.size(); i++) {
Button BUTTON = BUTTONS.get(i);
if(X >= BUTTON.getX() && BUTTON.getX()+BUTTON.getWidth() >= X && Y >= BUTTON.getY() && BUTTON.getY()+BUTTON.getHeight() >= Y)BUTTON.setEntered(true);
else BUTTON.setEntered(false);
}
}
}
}
Code:
actionPerformed(ActionEvent e)
Es funktioniert alles wunderbar, doch es ist ein bisschen komisch mit den Positionen…
Wenn die Maus von rechts auf den Button geht, ist der Button schon 2 Pixel davor "entered", genauso mit der y, also von oben.
Und wenn ich von rechts oder unten komme, dann muss die Maus 2 extra Pixel weiter rein gehen, damit es "entered" ist.
Es ist aber so, dass wenn ich die 2 Pixel vor dem Button bin, mir die richtige Position angezeigt wird, obwohl ich deutlich 2 Pixel noch davor bin!
Ich glaube aber nicht das es am Überprüfen liegt, da die Maus-Position ja nicht verschoben sein kann, sondern dass ich irgendwas am Zeichnen falsch gemacht habe…
Ich konnte aber den Fehler nicht finden, deswegen hoffe ich, dass ihr mir helfen könnt (trotz meiner schlechten Erklärung).
Vielen Dank