AWT eigenem Knopf ActionListener zuweisen

derSoerrn

Aktives Mitglied
Hallo zusammen,

ich hab eine eigene Knopfklasse geschrieben, bei welcher man drei Bilder und die Position angibt und dann ein Knopf erstellt wird, der wie die JButtons aus Swing dann sein Aussehen ändert:

Bild 1: normales Aussehen
Bild 2: Wenn Fokus
Bild 3: Wenn Maus gedrückt

Das Problem, was ich nun habe ist, dass ich nicht weiß, wie ich der Klasse bzw. dem Knopf sagen soll, dass er auf einen ActionListener "hören" soll.

Ich habe es zuerst mit einem MouseListner versucht, der dann bei einem Mausklick den gewünschten Effekt ausführt. Jedoch funktioniert diese Möglichkeit nicht auf den Bildern, sonder nur am Rand, da die Bilder den Mausklick anscheinend nicht "durchlassen".

Ich hoffe Ihr könnt mir helfen.

LG
 

jgh

Top Contributor
kommt drauf an, wie du die Bilder deiner ButtonKlasse addest?!
erbt die Klasse von JButton, JPanel, JComponent...und wem addest du den MouseListener...Code würde hier helfen ;) am besten in Form eines KSKB
 

derSoerrn

Aktives Mitglied
Java:
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.ActionListener;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class JPictureButton extends JPanel{
    JLabel knopf;
    Icon bild1, bild2, bild3;
    String aufschrift;
    private int x, y, width, height;
    public JPictureButton(int x, int y, int width, int height, String pfad1, String pfad2, String pfad3){
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
        this.bild1 = new ImageIcon(getClass().getResource(pfad1));
        this.bild2 = new ImageIcon(getClass().getResource(pfad2));
        this.bild3 = new ImageIcon(getClass().getResource(pfad3));
        this.setBounds(x, y, width, height);
        this.setLayout(new FlowLayout());
        knopf = new JLabel();
        knopf.setIcon(bild1);
        knopf.addMouseListener(new ChangeIcon());
        add(knopf);
    }

    public JPictureButton(int x, int y, int width, int height, String pfad1, String pfad2, String pfad3, String aufschrift){
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
        this.bild1 = new ImageIcon(getClass().getResource(pfad1));
        this.bild2 = new ImageIcon(getClass().getResource(pfad2));
        this.bild3 = new ImageIcon(getClass().getResource(pfad3));
        this.aufschrift = aufschrift;
        knopf = new JLabel();
        knopf.setLayout(new FlowLayout());
        knopf.setIcon(bild1);
        knopf.setText(aufschrift);
        knopf.setBounds(x, y, width, height);
        knopf.setFont(new Font("Arial", Font.BOLD, 30)) ;
        knopf.setForeground(Color.BLACK);
        knopf.setIconTextGap(-200);
        knopf.addMouseListener(new ChangeIcon());
        add(knopf);
    }

    public void setzeSchrift(String text, String schriftname, int art, int groesse, Color farbe){
        knopf.setText(text);
        knopf.setFont(new Font(schriftname, art, groesse));
        knopf.setForeground(farbe);
        knopf.setIconTextGap(-200);
    }

    @Override
    public void addMouseListener(MouseListener m){
        super.addMouseListener(m);
        knopf.addMouseListener(m);
    }

    @Override
    public void removeMouseListener(MouseListener m){
        super.removeMouseListener(m);
        knopf.removeMouseListener(m);
    }

    private class ChangeIcon implements MouseListener{

        private boolean geklickt = false;
        private boolean verlassen = false;

        @Override
        public void mouseClicked(MouseEvent e) {

        }

        @Override
        public void mouseEntered(MouseEvent e) {
            knopf.setIcon(bild2);
            verlassen = false;
        }

        @Override
        public void mouseExited(MouseEvent e) {
            if(!geklickt){
                knopf.setIcon(bild1);
                knopf.setIconTextGap(-200);
            }
            verlassen = true;
        }

        @Override
        public void mousePressed(MouseEvent e) {
            knopf.setIcon(bild3);
            geklickt = true;
        }

        @Override
        public void mouseReleased(MouseEvent e) {
            knopf.setIcon(bild2);
            geklickt = false;
            if(verlassen){
                knopf.setIcon(bild1);
            }
        }
    }
}

Also hier ist schonmal der Code. Ich erbe von JPanel, erzeuge auf diesem ein Label, was das Bild ändert. Aber das seht Ihr ja vermutlich selbst :p

P.S. bin seit gerade eben hier und wusste nicht genau wohin mit dem Thema, darum sorry falls es hier falsch ist ...
 

jgh

Top Contributor
mmh, und was soll nicht funktionieren?

hiermal dein Bsp-Code in einem KSKB und unten als runnable Jar (mit Bildern)...

Java:
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class JPictureButton extends JPanel {
	JLabel knopf;
	Icon bild1, bild2, bild3;
	String aufschrift;
	private int x, y, width, height;

	public static void main(String[] args) {
		JFrame f = new JFrame();
		f.setSize(600, 600);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setLocationRelativeTo(null);
		f.add(new JPictureButton(0, 0, 500, 500, "/pic1.jpg", "pic2.jpg",
				"pic3.jpg", "Hallo"));
		f.setVisible(true);
	}

	public JPictureButton(int x, int y, int width, int height, String pfad1,
			String pfad2, String pfad3) {
		this.x = x;
		this.y = y;
		this.width = width;
		this.height = height;
		this.bild1 = new ImageIcon(getClass().getResource(pfad1));
		this.bild2 = new ImageIcon(getClass().getResource(pfad2));
		this.bild3 = new ImageIcon(getClass().getResource(pfad3));
		this.setBounds(x, y, width, height);
		this.setLayout(new FlowLayout());
		knopf = new JLabel();
		knopf.setIcon(bild1);
		knopf.addMouseListener(new ChangeIcon());
		add(knopf);
	}

	public JPictureButton(int x, int y, int width, int height, String pfad1,
			String pfad2, String pfad3, String aufschrift) {
		this.x = x;
		this.y = y;
		this.width = width;
		this.height = height;
		this.bild1 = new ImageIcon(getClass().getResource(pfad1));
		this.bild2 = new ImageIcon(getClass().getResource(pfad2));
		this.bild3 = new ImageIcon(getClass().getResource(pfad3));
		this.aufschrift = aufschrift;
		knopf = new JLabel();
		knopf.setLayout(new FlowLayout());
		knopf.setIcon(bild1);
		knopf.setText(aufschrift);
		knopf.setBounds(x, y, width, height);
		knopf.setFont(new Font("Arial", Font.BOLD, 30));
		knopf.setForeground(Color.BLACK);
		knopf.setIconTextGap(-200);
		knopf.addMouseListener(new ChangeIcon());
		add(knopf);
	}

	public void setzeSchrift(String text, String schriftname, int art,
			int groesse, Color farbe) {
		knopf.setText(text);
		knopf.setFont(new Font(schriftname, art, groesse));
		knopf.setForeground(farbe);
		knopf.setIconTextGap(-200);
	}

	@Override
	public void addMouseListener(MouseListener m) {
		super.addMouseListener(m);
		knopf.addMouseListener(m);
	}

	@Override
	public void removeMouseListener(MouseListener m) {
		super.removeMouseListener(m);
		knopf.removeMouseListener(m);
	}

	private class ChangeIcon implements MouseListener {

		private boolean geklickt = false;
		private boolean verlassen = false;

		@Override
		public void mouseClicked(MouseEvent e) {
			// na wenn hier nichts steht...gibt es halt kein Klickevent, außer
			// wenn die Mouse gedrückt wird...
		}

		@Override
		public void mouseEntered(MouseEvent e) {
			knopf.setIcon(bild2);
			verlassen = false;
		}

		@Override
		public void mouseExited(MouseEvent e) {
			if (!geklickt) {
				knopf.setIcon(bild1);
				knopf.setIconTextGap(-200);
			}
			verlassen = true;
		}

		@Override
		public void mousePressed(MouseEvent e) {
			knopf.setIcon(bild3);
			geklickt = true;
		}

		@Override
		public void mouseReleased(MouseEvent e) {
			knopf.setIcon(bild2);
			geklickt = false;
			if (verlassen) {
				knopf.setIcon(bild1);
			}
		}
	}
}
 

Anhänge

  • JPictureButton.jar
    33,6 KB · Aufrufe: 9
S

SlaterB

Gast
Zeile 77-86 kann übrigens weg wenn nur das JLabel den Listener bekommt,
das ganze umgebende JPanel könnte wegfallen, ein JLabel reicht,

x, y, width, height haben derzeit keine Funktion, setBounds() ist nur für null-Layout interessant,
welches du lieber gar nicht erst näher kennenlernen solltest,
die Breite und Höhe könnte man wenn überhaupt besser aus den Bildern auslesen statt redundant zu übergeben, woher kennt der Aufrufer sie?

knopf als JLabel braucht im Moment kein Layout,

die beiden Konstruktoren solltest du zusammenfassen, also der eine ruft den anderen auf mit aufschrift==null,
mit if unterscheiden, ob der zugehörige Code wie Schrift-Setzen dann ausgeführt wird oder nicht
 

derSoerrn

Aktives Mitglied
Wenn ich den Knopf jetzt in einer anderen Klasse initialisiere und dann in der Klasse mit einem MouseListener arbeite funktioniert es nicht. Ich hab das nämlich eigentlich so geschrieben, dass ich diesen Knopf in meinem GUI benutzen kann. Ich fände das eher unpraktisch wenn ich diesen knopf jetzt immer für jedes "Ereignis" speziell anpassen muss. Verstehst du?
 
S

SlaterB

Gast
extern mit deinen überschriebenen Methoden einen zweiten MouseListener hinzuzufügen funktioniert genauso,
weiterhin kein Problem zu erkennen,
bei einem einfachen JLabel ohne JPanel sicher genauso, siehe mein Post zwischendurch, falls übersehen

du könntest auch das einfachere ActionListener-Modell manuell nachbauen:
nach außen set/addActionListener() anbieten, intern eine Liste oder eine einzelne Variable dafür,
der vorhandene MouseListener ruft beim Klick die actionPerformed()-Methode des gesetzen Listeners auf

ActionEvent wenn nötig ist auch nachzubauen, vielleicht geht es aber ohne, also null
 
Zuletzt bearbeitet von einem Moderator:

Michael...

Top Contributor
Hab mal den Code ausprobiert und kann hier keinen Unterschied zu einem normalen JButton feststellen, ausser, dass hier die Border fehlt und kein Fokus angezeigt wird.
Wenn man das völlig losgelöst behandeln will würde ich mich SlaterB's Vorschlag anschließen und die addActionLister() und das auslösen des Events selbst implementieren
 

derSoerrn

Aktives Mitglied
Ich hab' das jetzt mal so umgeschrieben, sodass ich statt des JPanel vom JButton (JLabel ist jetzt komplett weg) erbe, jedoch habe ich jetzt einen Rahmen um den Knopf. Wenn ihr mir noch sagen könntet wie ich diesen weg bekomme, dann seit ihr echt die besten :p

Hab Euch ein Bild angeheftet auf dem man den Rahmen sieht. "setOpaque" hat übrings nicht funktioniert...

LG
 

Anhänge

  • Rahmen.png
    Rahmen.png
    1,5 KB · Aufrufe: 53

derSoerrn

Aktives Mitglied
Kann man den Button nicht auch irgendwie ganz durchsichtig machen? Ich benutze nämlich (leider) abgerundete Bilder für mein GUI. Sonst ging
Code:
setBorder(null)
 

derSoerrn

Aktives Mitglied
Tut mir Leid, hab vergessen es zu schreiben :p

hab das benutzt: "this.setContentAreaFilled(false);"

Aber wisst ihr, ob es "Schiebeknöpfe" in Java gibt? Ich hab gerade mal im API geguckt und nichts gefunden. Anbei sollte ein Bild von einem Knopf sein, wie ich ihn mir vorstelle.
 

Anhänge

  • Schiebeknopf.PNG
    Schiebeknopf.PNG
    4,4 KB · Aufrufe: 32
S

SlaterB

Gast
eine GUI-Komponente in einem bestimmten eigenen Design, auch nur rund statt eckig,
das ist wahrlich bereits außerhalb des normal bekannten Anfänger-Standards,

vielleicht findest du einen passenden Look & Feel (Konfiguration der Darstellung),
vielleicht kannst du einen derartigen modifizieren (ich nicht),
oder du baust wieder einmal etwas selber, wohl weniger mit Bildern hier, mehr mit paint-Methoden

meinst du denn überhaupt diese Komponente oder willst nur zwischen A und B hin und her schalten? das wäre Checkbox/ RadioButton
 

derSoerrn

Aktives Mitglied
Ich bräuchte diesen Knopf für das Einstellungsmenü, um bestimmte Einstellungen eben ein oder auszuschalten und dafür fände ich diesen Knopf wohl am besten. Ich könnte da natürlich auch eine/n CheckBox/RadioButton benutzen, aber das ist meiner Meinung nach hässlich :p

Ich werde dann wohl mal deinen letzten Vorschlag ausprobieren ;-)
 
S

SlaterB

Gast
wenn nur A/B, dann geht ja auch Bilder, kein Schieben Pixel um Pixel,
mit mousePressed() usw. sicher machbar
 

Michael...

Top Contributor
Im Prinzip ist das m.M. auch wieder eine Standardkomponente:
JToggleButton, dem man zwei Icons zuweist (setIcon & setSelectedIcon), Border,Fokus, Hintergrund, kann man ja wieder ausblenden.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Falsches Rendern durch JCheckBox in eigenem JTree AWT, Swing, JavaFX & SWT 6
T JTextPane ignoriert HTML Zeilenumbruch <br> tag wegen eigenem HTMLEditorKit AWT, Swing, JavaFX & SWT 5
J CheckTreeView mit eigenem Cell Value AWT, Swing, JavaFX & SWT 3
P Einer JList mit eigenem ListModel einen Eintrag hinzfügen AWT, Swing, JavaFX & SWT 5
F jTree.startEditingAtPath(path); funktioniert nicht bei eigenem CellEditor? AWT, Swing, JavaFX & SWT 8
L JTableModel - Zeilen mit eigenem Index ausstatten AWT, Swing, JavaFX & SWT 4
N Tabellenzelle wird bei JCombBox mit eigenem Datentyp nicht aktualisiert AWT, Swing, JavaFX & SWT 7
N jComboBox mit eigenem Renderer und eigenem Datentyp als Rückgabe in einer Tabelle AWT, Swing, JavaFX & SWT 2
P Teil einer Swing GUI in eigenem Thread AWT, Swing, JavaFX & SWT 4
B Zeichnen von Bildern auf JPanel aus eigenem Objekt AWT, Swing, JavaFX & SWT 19
C Kann Konstruktor von eigenem TableModel nicht nutzen AWT, Swing, JavaFX & SWT 2
R JScrollBar mit eigenem look and feel AWT, Swing, JavaFX & SWT 6
G JComboBox mit eigenem Model vorhanden, wie selektieren AWT, Swing, JavaFX & SWT 29
G JTable sortieren mit eigenem Sortieralgorithmus AWT, Swing, JavaFX & SWT 3
R setEnabled bei eigenem Widget implementieren? AWT, Swing, JavaFX & SWT 3
M Problem mit eigenem Menu Explorer AWT, Swing, JavaFX & SWT 6
N Probleme mit eigenem JOptionPane AWT, Swing, JavaFX & SWT 2
T JList mit eigenem TransferHandler: Fokus(?)-Probleme AWT, Swing, JavaFX & SWT 4
B JTable Vector Exception bei eigenem CellEditor AWT, Swing, JavaFX & SWT 3
C Clipping funktioniert mit eigenem Polygon nicht AWT, Swing, JavaFX & SWT 8
M Hilfe bei vers. Fonts und Zeilenlänge in eigenem Editor. AWT, Swing, JavaFX & SWT 3
T schönes Resize bei eigenem JFrame AWT, Swing, JavaFX & SWT 5
M JTree mit eigenem Renderer sieht seltsam aus AWT, Swing, JavaFX & SWT 2
F Problem mit PopupMenu und eigenem Panel AWT, Swing, JavaFX & SWT 5
C Proleme mit eigenem Cell Renderer AWT, Swing, JavaFX & SWT 3
S Knoten im JTree hinzufügen/löschen mit eigenem Jtree AWT, Swing, JavaFX & SWT 8
M setOpaque() bei eigenem Renderer AWT, Swing, JavaFX & SWT 5
R JTable: Jede Zelle mit eigenem ToolTip belegen AWT, Swing, JavaFX & SWT 5
M Wie einen JTable editierbar machen (mit eigenem TreeModel) AWT, Swing, JavaFX & SWT 2
Paule Popup oder Dialog-Feld mit eigenem Inhalt AWT, Swing, JavaFX & SWT 9
Z Probleme mit eigenem Canvas und ScrollPane AWT, Swing, JavaFX & SWT 8
TheSepp Fenster um x Pixel bewegen, wenn man auf dem Knopf drückt AWT, Swing, JavaFX & SWT 10
N Knopf ganz oben (JFrame) AWT, Swing, JavaFX & SWT 9
P Knopf gedrückt -> Textfeld befüllen AWT, Swing, JavaFX & SWT 9
D Java Swing, Label lässt sich nicht mit Checkboxen/Knopf verändern AWT, Swing, JavaFX & SWT 2
I Spezieller Knopf in Swing? Soll sein wie der Run in Eclipse. AWT, Swing, JavaFX & SWT 4
E windowClosing() - JFrame nicht durch X knopf gleich beenden? AWT, Swing, JavaFX & SWT 9
T der knopf der nicht wollte wie er sollte! AWT, Swing, JavaFX & SWT 3
C Button ActionListener funktioniert nicht AWT, Swing, JavaFX & SWT 1
B Actionlistener mit Java Swing AWT, Swing, JavaFX & SWT 2
L jComboBox Actionlistener wird beim erstmaligen Befüllen getriggert AWT, Swing, JavaFX & SWT 7
H Viele ActionListener (MouseListener) - Performance AWT, Swing, JavaFX & SWT 24
pkm MainFrame durch Actionlistener auffrischen, aber wie? AWT, Swing, JavaFX & SWT 2
L actionListener für Button AWT, Swing, JavaFX & SWT 97
R Actionlistener funktioniert nicht AWT, Swing, JavaFX & SWT 4
N Bilder auf Button einfügen und mehrmals ändern (ein Button, mehrere ActionListener) AWT, Swing, JavaFX & SWT 2
R ActionListener in Actionlistener AWT, Swing, JavaFX & SWT 6
S Swing Variable in Actionlistener aufrufen AWT, Swing, JavaFX & SWT 10
P Swing ActionListener überschreibt einen Wert aus der Hauptklasse nicht AWT, Swing, JavaFX & SWT 5
N Aufruf einer anderen Klasse durch Button ActionListener AWT, Swing, JavaFX & SWT 2
M AWT Kann meinen Fehler beim ActionListener nicht finden AWT, Swing, JavaFX & SWT 5
F Wie bekomme ich den Wert der ComboBox in eine Variable gespeichert welche ich für meinen ActionListener nutzen kann? AWT, Swing, JavaFX & SWT 3
L Ein Actionlistener für ein Textfeld, anstatt viele Actionlistener für ein Textfeld AWT, Swing, JavaFX & SWT 7
coolian ActionListener funktonirt nicht richtig auf JMenuItem AWT, Swing, JavaFX & SWT 4
L ActionListener zu Button in Panel hinzufügen AWT, Swing, JavaFX & SWT 10
R Kann JLabel in ActionListener nicht aufrufen AWT, Swing, JavaFX & SWT 4
Blender3D einzelner ActionListener vs anonyme ActionListener AWT, Swing, JavaFX & SWT 10
T Swing Änderung des ActionListener Events nach Klick auf JButton AWT, Swing, JavaFX & SWT 2
xYurisha ActionListener Methoden Buttons zuweisen! AWT, Swing, JavaFX & SWT 16
J ActionListener bei Buttons AWT, Swing, JavaFX & SWT 14
S Swing Problem mit Button und ActionListener AWT, Swing, JavaFX & SWT 5
it_is_all ActionListener umlenken/ updaten mit AddActionListener funktioniert nicht AWT, Swing, JavaFX & SWT 3
it_is_all Event Handling ActionListener in anderer Klasse klappt nicht AWT, Swing, JavaFX & SWT 4
F "ActionListener" funktioniert nicht AWT, Swing, JavaFX & SWT 4
Z ActionListener Variable übergeben AWT, Swing, JavaFX & SWT 12
T JProgressbar während actionListener updaten AWT, Swing, JavaFX & SWT 1
S While Schleife im Actionlistener AWT, Swing, JavaFX & SWT 1
S ActionListener für alle Buttons AWT, Swing, JavaFX & SWT 26
R Swing ActionListener bei JButton AWT, Swing, JavaFX & SWT 9
T ActionListener nimmt JTextField nicht mehr an. AWT, Swing, JavaFX & SWT 2
P ActionListener Graphics Einbauen AWT, Swing, JavaFX & SWT 0
S actionlistener mit 2 fenster integrieren AWT, Swing, JavaFX & SWT 11
Liondary GUI - ActionListener AWT, Swing, JavaFX & SWT 7
J ActionListener erkennt Variable nicht AWT, Swing, JavaFX & SWT 6
E ActionListener führt falsche Funktion aus AWT, Swing, JavaFX & SWT 6
Sin137 ActionListener in MVC AWT, Swing, JavaFX & SWT 7
M ActionListener und mathematische Methoden AWT, Swing, JavaFX & SWT 13
A Oberfläche mit zwei Klassen und actionlistener verbinden AWT, Swing, JavaFX & SWT 7
Paul15 ActionListener Variablen AWT, Swing, JavaFX & SWT 13
Y ActionListener AWT, Swing, JavaFX & SWT 2
K Ereignisbehandlung, ActionListener, ActionEvent AWT, Swing, JavaFX & SWT 3
A Gui für Vokabeltrainer (ActionListener) AWT, Swing, JavaFX & SWT 14
C Im ActionListener Buttons disablen, einen Thread starten, dann Buttons enablen AWT, Swing, JavaFX & SWT 2
M JTextArea wird nicht aktualisiert (ActionListener-Problem) AWT, Swing, JavaFX & SWT 1
J Event Handling JOptionPane ActionListener setzen. AWT, Swing, JavaFX & SWT 3
S ActionListener Klasse aufrufen AWT, Swing, JavaFX & SWT 4
R Swing Problem: IOException bei ActionListener AWT, Swing, JavaFX & SWT 1
J ActionListener soll auf paint() Methode zugreifen AWT, Swing, JavaFX & SWT 1
A JButton wird bei ActionListener nicht "angenommen" AWT, Swing, JavaFX & SWT 7
T Einfaches Problem mit ActionListener AWT, Swing, JavaFX & SWT 2
K ActionListener mit KeyListener AWT, Swing, JavaFX & SWT 7
K GUI, Button, ActionListener - ein paar Einsteigerprobleme AWT, Swing, JavaFX & SWT 1
W Verschachtelter ActionListener AWT, Swing, JavaFX & SWT 0
N gewünschte ActionListener bei RadioButton mit isSelected geht nicht AWT, Swing, JavaFX & SWT 2
C Probleme mit Buttons und einem ActionListener AWT, Swing, JavaFX & SWT 2
K Swing JMenu und ActionListener AWT, Swing, JavaFX & SWT 4
A Swing ActionListener AWT, Swing, JavaFX & SWT 8
V ActionListener Abhängigkeitenproblem AWT, Swing, JavaFX & SWT 6
M ActionListener für mehrere Klassen AWT, Swing, JavaFX & SWT 4
J ActionListener für Buttons AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben