Eigene Knöpfe mit eigenem Listener

PissPain

Aktives Mitglied
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)
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);
			}
		}
		
	}
}
Die Klasse ActionListener ist nur ein interface mit der
Code:
actionPerformed(ActionEvent e)
-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 :)
 

turtle

Top Contributor
Variable beginnen mit einem Kleinbuchstaben und dann gemischte Schreibweise.
Also beispielsweise telefonNummer oder width.

Auch solltest du vermeiden Namen zu nehmen wie die Datentypen von Java. Verwirrt nur.

Konstanten werden in UPPERCASE geschrieben, damit das sofort ersichtlich ist.
 

taro

Bekanntes Mitglied
Mal ins blaue getippt:

Du zeichnest hier den Button
Java:
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);
        }

... legst aber den Listener über eine andere Flächenabmessung

Java:
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);
            }
        }
 
Zuletzt bearbeitet:

PissPain

Aktives Mitglied
Was heißt das denn dann?
Es ist nicht eine "andere Flächenabmessung", sondern die Flächenabmessung!
Es sagt dem Button einfach nur was er zu Zeichnen hat :)

Vielen Dank :)
 
Zuletzt bearbeitet:

turtle

Top Contributor
Ich verstehe echt nicht, was du beabsichtigst???:L

Es wird sehr selten direkt mit Graphics2D ein Button "gemalt"., denn dafür gibt es ja bereits JButton, der das verzüglich macht.

Und einem JButton kannst du ziemlich einfach einen ActionListener zuordnen, der aufegrufen wird, wenn man drauf klickt.

Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class MyTest {
    public static void main(String[] args) {
	final JFrame frame = new JFrame("Turtle Test");
	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	JButton btnKlickMich = new JButton("Klick mich nicht");
	btnKlickMich.addActionListener(new ActionListener() {

	    @Override
	    public void actionPerformed(ActionEvent e) {
		JOptionPane.showMessageDialog(frame, "Sagte ich nicht, du sollst mich nicht klicken?");
	    }
	});
	frame.add(btnKlickMich);
	frame.pack();
	frame.setVisible(true);
    }

}
 

PissPain

Aktives Mitglied
Ich will ja nicht Swing nach machen, bloß habe ich die Button früher mal benutzt, doch für Spiele sind die nicht geeignet, da die ein wenig Grafikbugs aufweisen. Und deshalb habe ich meine Klassen auch so genannt, jetzt wollte ich halt meine eigenen Button machen und die weisen keine Grafikbugs auf!

Nun bin ich halt auf das Problem gestoßen dass die Button aus irgendeinem komischen Grund versetzt gezeichnet werden (oder falsch überprüft wird) und ich kann mir das nicht erklären also brauch ich eure Hilfe!

Vielen Dank :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Amina556 Eigene Klasse definieren Java Basics - Anfänger-Themen 9
T Eigene Exception - ohne werfen abfangen Java Basics - Anfänger-Themen 2
T Datentypen Eigene Datentypen Java Basics - Anfänger-Themen 15
low_in_the_head Eigene Exception nutzen Java Basics - Anfänger-Themen 4
C Archiv für eigene Klassen Java Basics - Anfänger-Themen 9
L Meine erste eigene Exception Klasse Java Basics - Anfänger-Themen 10
D Attribut Telefonnummer - eigene Klasse oder String Java Basics - Anfänger-Themen 13
B JUnit 4: Wie man die eigene Liste testen kann [TDD] Java Basics - Anfänger-Themen 46
C eigene Methoden erstellen (Instanzmethoden) Java Basics - Anfänger-Themen 7
S Eigene LinkedList Klasse Java Basics - Anfänger-Themen 4
I Eigene Java Tools Nutzung Java Basics - Anfänger-Themen 6
G eigene Bibliothek einbinden Java Basics - Anfänger-Themen 1
K Eigene Annotations, Pre-/Post-/Call-Method Java Basics - Anfänger-Themen 6
O Erste Schritte Eigene charAt(i) Methode schreiben Java Basics - Anfänger-Themen 10
D Methoden Eigene Methode um alle Ausgaben aufzurufen Java Basics - Anfänger-Themen 17
L Eigene Exception schreiben bei zu langem Array Java Basics - Anfänger-Themen 10
P Maven und eigene Jars Java Basics - Anfänger-Themen 4
J Algorithmus - Strings auf eigene Reihenfolge miteinander vergleichen Java Basics - Anfänger-Themen 4
R Interface Eigene Objekte in Listen sortieren mit Interface Comparable Java Basics - Anfänger-Themen 5
A Eigene Methoden entwicken Java Basics - Anfänger-Themen 3
F Klassen Eigene Exception Bedingungen festlegen Java Basics - Anfänger-Themen 2
H GSON-Bibliothek für eigene Programme benutzen Java Basics - Anfänger-Themen 2
H Klassen auf eigene Klasse zugreifen Java Basics - Anfänger-Themen 2
N Eclipse - eigene Icons unter ClassPath Resource Java Basics - Anfänger-Themen 0
N Eigene Stream Methoden implementieren Java Basics - Anfänger-Themen 3
R eigene Graphikbedienelemente Java Basics - Anfänger-Themen 8
V Generics / eigene Liste Java Basics - Anfänger-Themen 4
T Eigene Bedingung in IF-Bedingung Java Basics - Anfänger-Themen 22
P Java 8 & Eigene Applets Java Basics - Anfänger-Themen 3
E Best Practice Exaktes Rechnen mit (Pseudo-)Rationalen/Realen Zahlen. Operations Zuweisung für (eigene) Klassen Java Basics - Anfänger-Themen 3
G eigene Bibliothek in Java importieren Java Basics - Anfänger-Themen 5
D Klassen Eigene Klasse für ArrayList Java Basics - Anfänger-Themen 6
M Wann eigene implementierte HashCode Methode zwingend erforderlich? Java Basics - Anfänger-Themen 1
B Klassen Eigene "non static" Klasse in Main verwenden! Java Basics - Anfänger-Themen 12
P Vererbung Eigene HashMap Variante Java Basics - Anfänger-Themen 2
J Eigene Klasse für die Variablen? Java Basics - Anfänger-Themen 3
S Wann existiert eine Instanz (eigene Klasse) Java Basics - Anfänger-Themen 8
T Muss ein Parametertest immer eine eigene Testklasse sein? Java Basics - Anfänger-Themen 3
B Multithreading und eigene Queue entwickeln Java Basics - Anfänger-Themen 3
O GUI: Eigene Fenster "Form"? Java Basics - Anfänger-Themen 13
F Eigene LinkedList - toString Java Basics - Anfänger-Themen 10
O Denkanstöße für eigene Konfigurations-Datei Java Basics - Anfänger-Themen 12
SexyPenny90 Wieso ist diese eigene Equals-Methode schlecht? Java Basics - Anfänger-Themen 17
C eigene Exception Java Basics - Anfänger-Themen 4
M externe JARs in die eigene JAR einbinden Java Basics - Anfänger-Themen 9
V Klassen import - einfaches Umleiten auf eigene Klassen? Java Basics - Anfänger-Themen 8
S Eigene Exception Klasse - fehlender Konstruktor mit String Java Basics - Anfänger-Themen 3
B eigene klasse in listen eintragen Java Basics - Anfänger-Themen 6
A Objekte in eigene Klasse auslagern Java Basics - Anfänger-Themen 2
S [JavaFX 2.1] - Eigene Sprachauswahl? Java Basics - Anfänger-Themen 4
K Klassen Eigene Exception verwenden Java Basics - Anfänger-Themen 9
J eigene packages bzw klassen verwenden Java Basics - Anfänger-Themen 25
E Eigene Stackklasse Java Basics - Anfänger-Themen 7
B Eigene Exceptions entwerfen Java Basics - Anfänger-Themen 3
S Eigene Exception Schreiben und Welche Auslösen wie ? Java Basics - Anfänger-Themen 7
P eigene kleine Datenverwaltung Java Basics - Anfänger-Themen 5
N Eigene Methoden-> Werte übergeben Java Basics - Anfänger-Themen 5
U Klassen Eigene Klassen importieren Java Basics - Anfänger-Themen 13
Kenan89 ActionListener in eigene Klasse Java Basics - Anfänger-Themen 8
E Object in eigene Klasse umwandeln? Java Basics - Anfänger-Themen 7
S Eigene Klassen addieren Java Basics - Anfänger-Themen 3
B OOP Eigene Objekte in Arrays zusammenfassen Java Basics - Anfänger-Themen 3
E Eigene class datum Java Basics - Anfänger-Themen 2
G Eigene MessageBox kreieren Java Basics - Anfänger-Themen 9
I Erste Schritte Eigene Fehlermeldungen bei Exceptions Java Basics - Anfänger-Themen 19
F Klassen Eigene Klasse definieren Java Basics - Anfänger-Themen 4
S Eigene KeyEvent-Mask erstellen Java Basics - Anfänger-Themen 4
X Eigene Libary Java Basics - Anfänger-Themen 2
Crashbreaker Eigene Java-Programm ohne hilfe des CMD starten Java Basics - Anfänger-Themen 11
A Klassen Eigene Datenklasse - Strings mit fixer Länge Java Basics - Anfänger-Themen 2
T eigene Exception Klasse Java Basics - Anfänger-Themen 12
G Shape um eigene Achse drehen Java Basics - Anfänger-Themen 2
P Vererbung Basisklasse soll eigene Methode benutzen Java Basics - Anfänger-Themen 38
F Eigene Klasse für die Keys von HashMap Java Basics - Anfänger-Themen 5
J Eigene kleine Datenbank programmieren Java Basics - Anfänger-Themen 2
G Eigene Klasse als Array, zugriff? Java Basics - Anfänger-Themen 2
xehpuk Ordner "Eigene Bilder" ansteuern Java Basics - Anfänger-Themen 3
V Sonderzeichen als eigene "Operatoren" im JTextField Java Basics - Anfänger-Themen 4
S Eigene Stack Klasse Java Basics - Anfänger-Themen 26
D Eigene equals methode schreiben Java Basics - Anfänger-Themen 4
dataframe OOP Eigene typisierte Liste Java Basics - Anfänger-Themen 3
W GUI als eigene Klasse oder in die Startklasse? Java Basics - Anfänger-Themen 21
T Konstruktor für eigene Klasse erstellen Java Basics - Anfänger-Themen 6
H Buttonbefehle in eigene Klasse schreiben Java Basics - Anfänger-Themen 8
M Datentypen Eigene iterierbare Liste Java Basics - Anfänger-Themen 4
G Eigene Klasse für externe Befehle - Warten auf Prozesse Java Basics - Anfänger-Themen 6
S Klassendiagramm - nur eigene Klassen? Java Basics - Anfänger-Themen 3
nrg Eigene simple List-Klasse programmieren Java Basics - Anfänger-Themen 3
C Eigene Interpreter-Programmiersprache mit Java Java Basics - Anfänger-Themen 17
B eigene Exception.... Java Basics - Anfänger-Themen 5
N Java Programm soll Datei in eigene jar schreiben Java Basics - Anfänger-Themen 13
F Eigene Exception StackTrace und Message ist leer warum??? Java Basics - Anfänger-Themen 3
M Eigene Pakete in Eclipse erstellen Java Basics - Anfänger-Themen 5
M Eigene Hash Funktion Java Basics - Anfänger-Themen 5
O Eigene Exceptions Java Basics - Anfänger-Themen 11
H eigene Schriftarten registrieren Java Basics - Anfänger-Themen 5
Kasoki Eigene Funktionen / Commands Java Basics - Anfänger-Themen 14
M Eigene LinkedList und Nodes Java Basics - Anfänger-Themen 20
S eigene Methoden in JDialog Java Basics - Anfänger-Themen 13
K eigene Hash-Datenstruktur Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben