Swing Control und Events

Status
Nicht offen für weitere Antworten.
T

Tiger

Gast
Hallo,

ich habe eine simple frage nach der besten strategie:
ich habe ein control gemacht, bestehend aus einem button und einem label und füge dies in ein JFrame ein, aber wie kann ich jetzt zB das event für den button setzen, da dies ja auch ggf. vom JFrame anhängen könnte. Eine lösung für mich war, dass ich einfach im JFrame mit einer schleife nach dem button gesucht habe (mit getName()) und dann das event dort hinzugefügt, allerdings halte ich diese art und weise für nicht besonders elegant. wie macht man es richtig?

liebe grüße
T
 

Java@home

Aktives Mitglied
Hallo,

ich habe eine simple frage nach der besten strategie:
ich habe ein control gemacht, bestehend aus einem button und einem label und füge dies in ein JFrame ein, aber wie kann ich jetzt zB das event für den button setzen, da dies ja auch ggf. vom JFrame anhängen könnte. Eine lösung für mich war, dass ich einfach im JFrame mit einer schleife nach dem button gesucht habe (mit getName()) und dann das event dort hinzugefügt, allerdings halte ich diese art und weise für nicht besonders elegant. wie macht man es richtig?

liebe grüße
T
Leider habe ich nicht ganz verstanden was du genau meinst???:L
Aber wenn ich es richtig verstanden habe, geht es dir darum, dass nach dem drücken auf den Button etwas passiert!? Wenn das der Fall ist, gibt es dort mehrere Möglichkeiten, du kannst z.B den MouseListener in deiner Klasse implements, dann musst du dessen Methoden überschreiben und dort kannst du auch bestimmen was nach dem klick auf den Button passiert, so in etwa kannst du das machen
Java:
@Override
		public void actionPerformed(ActionEvent e) {
			if(e.getSource().equals(b1))
			System.out.println("Button1");

			if(e.getSource().equals(b2))
			System.out.println("Button2");
		}
Das ist aber noch nicht alles, wen ich dich aber richtig verstanden habe und dich das interessiert, kann ich dir gerne andere Mögligkeiten zeigen:)
MFG
 
T

Tiger

Gast
danke erstmal für deine schnelle antwort, in der tat ist es nicht ganz das was ich meinte, hier einander versuch mein problem zu erklären:
Ich habe eine klasse Menu gemacht, welche von JToolBar erbt; in der klasse Menu habe ich zwei Buttons.
Ich habe jetzt eine weitere klasse Main (=JFrame) gemacht, in der ich die klasse als control einfüge. Das funktioniert auch soweit.
Meine frage ist jetzt, Menu ist sehr allgemein nur basierend auf zwei buttons. Wie kriege ich jetzt die events dort rein? Klar kann ich die wie von dir gezeigt, direkt in die klasse Menu einbauen, aber in dieser klasse kenne ich "die anderen dinge nicht", zB sets in denen etwas gespeichert werden soll. Sagen wir in der klasse Main habe ich zusätzlich ein Set und immer wenn man auf einen der beiden buttons drückt soll ein element hinzugefügt werden, dass kann ich allerdings nur dann machen, wenn ich das event innerhalb von der Main* klasse definiere, nicht in Menu.

Meine lösung dafür war nun, wie schon gesagt, das event in Main zu definieren in dem ich mir über newMenu.getComponents() alle controls hole und dann dem entsprechenden button das event anhänge. das halte ich aber für sehr unelegant...

verstehst du was ich meine?

*Main meint übrigens nicht die public static funktion, sondern ist mein klassen name :p
 
T

Tiger

Gast
okay stückweiter,

ich kann also über getParent() aus Menu Main greifen, allerdings nur variablen und funktionen die public sind -- wie krieg ich private elemente?:)
 

Java@home

Aktives Mitglied
Also ich kann mit deinem Text leider nichts anfangen:bahnhof:(mag sein, dass es an mir liegt), aber du kannst ja evtl. den Code mal zeigen und ich werde mal :rtfm:, villeicht verstehe ich das dann besser!
MFG
 
T

Tiger

Gast
Main-Klasse
[Java]
public class Main extends JFrame {

private static final long serialVersionUID = 1L;
protected int k=10;
private JTextArea bla;
public Main() {
setVisible(true);
setSize(500,500);
setLayout(new BorderLayout());

Menu newMenu = new Menu();
getContentPane().add(newMenu, BorderLayout.NORTH);
bla = new JTextArea();
bla.setText("dds");
getContentPane().add(bla, BorderLayout.CENTER);
System.out.println(k);
}

public static void main (String[] args) {
Main newMain = new Main();
}
}
[/code]

Menu-Klasse
Java:
public class Menu extends JToolBar {

	private static final long serialVersionUID = 1L;
	private int counter;
	public Menu () {
		super();
		JButton setSettings = new JButton();
		setSettings.setName("setSettings");
		setSettings.setText("Settings");
		JButton addSource = new JButton();
		addSource.setName("addSource");
		addSource.setText("add Source");
		setLayout(new FlowLayout(FlowLayout.LEFT));
		//setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
		add(setSettings);
		add(addSource);
		
		setVisible(true);
		
		setSettings.addActionListener(new ActionListener() {
		      
      		public void actionPerformed(ActionEvent e) {
      			counter++;
      			System.out.println("klick");
      			if ((Main)getParent() != null)
      			{
      				((Main)getParent()).k=counter;
      				System.out.println(((Main)getParent()).k);
      			}
      			
      		}
       });
		
	}
}

soweit bin ich jetzt, allerdings kriege ich jetzt immer einen error wenn ich auf den button "setSettings" klicke:
Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: javax.swing.JPanel cannot be cast to GUI2.Main
at GUI2.Menu$1.actionPerformed(Menu.java:52)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

woran liegt das?
 

Landei

Top Contributor
weil der Parent deiner Komponente nicht das Main-Fenster, sondern dessen ContenPane ist (da fügst du deine Komponente ja auch hinzu)

Warum machst du in Menu nicht einfach zwei Methoden, in denen du die ActionListener einfach an die Buttons weiterleitest?
Java:
class Menu {

private JButton setSettings;

...

public void addSettingsActionListener(ActionListener al) {
   setSettings.addActionListener(al);
}
...
}

Dann kannst du dir einfach in Main ordentlichen Listene schreiben, die auch auf alles nötige Zugriff hat.

Mit der getParent()-Technik musst du vorsichtig sein: Da verschiebst du die Komponente später vielleicht mal auf einen Unterpanel oder so, und schon fliegt dir das Ding um die Ohren...
 

Java@home

Aktives Mitglied
Soooooooooooooooo
Java:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;

public class Main extends JFrame {
	 
        private int k = 10;
	public int getK() { return k; }

	private JTextArea bla;
	
	private JButton setSettings, addSource;
    
    public Main() {
        this.setVisible(true);
        this.setSize(500,500);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLayout(new BorderLayout());
        
        setSettings = new JButton();
        setSettings.addActionListener(new MyActionListener());
        setSettings.setName("setSettings");
        setSettings.setText("Settings");
        addSource = new JButton();
        addSource.addActionListener(new MyActionListener());
        addSource.setName("addSource");
        addSource.setText("add Source");
        
        bla = new JTextArea();
        bla.setText("dds");
        this.getContentPane().add(bla, BorderLayout.CENTER);
        
        JPanel panel = new JPanel();
        panel.add(setSettings);
        panel.add(addSource);
        this.getContentPane().add(panel, BorderLayout.NORTH);
       
    }
    
    public static void main (String[] args) {
        new Main();
    }
    
    class MyActionListener implements ActionListener {

		@Override
		public void actionPerformed(ActionEvent e) {
			if(e.getSource().equals(setSettings))
				k ++;
				System.out.println("klick " + getK());
		}
	}
    
}
    
}
Wobei du die Getter nicht mal brauchst!
MFG
 
Zuletzt bearbeitet:
T

Tiger

Gast
ahja :) jetzt bin ich viel schlauer.

den weg von Landei finde ich sehr sympathisch -- macht man denn das auch wirklich so? oder ist nicht clever?

und dir natürlich auch danke Java@home :)

liebe grüße
Tiger
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
L JavaFX Lösungsvorschläge für dieses coole Control AWT, Swing, JavaFX & SWT 8
B Java FX In control.TreeCell-Implementierung Binding erzeugen AWT, Swing, JavaFX & SWT 0
Yjuq JavaFX Custom Control - Image resize AWT, Swing, JavaFX & SWT 0
L JavaFX Control Pseudo Class AWT, Swing, JavaFX & SWT 1
D javafx.scene.control.TreeView als dropdown Menü AWT, Swing, JavaFX & SWT 6
D JavaFX Control zur Anzeige von eBooks AWT, Swing, JavaFX & SWT 5
L JavaFX Custom control mit Hover Effekt AWT, Swing, JavaFX & SWT 2
M JavaFX Parameter für Custom Control in FXML übergeben? AWT, Swing, JavaFX & SWT 4
S JavaFX Passendes "control" für ein Spielschein AWT, Swing, JavaFX & SWT 10
yvesdaeschle Outline Control gesucht AWT, Swing, JavaFX & SWT 5
yvesdaeschle List Control mit "card"-Ansicht AWT, Swing, JavaFX & SWT 7
A SWT Tooltip soll nicht verschwinden, solange User mit Maus auf Control ist AWT, Swing, JavaFX & SWT 5
G SWT Control.print(gc) funktioniert in Win, in Linux nicht AWT, Swing, JavaFX & SWT 4
L SWT Control.setVisible? AWT, Swing, JavaFX & SWT 2
yvesdaeschle SWT OutlookBar Control AWT, Swing, JavaFX & SWT 3
lumo SWT Absolute position einer Composite/Control AWT, Swing, JavaFX & SWT 5
M SWT pack() von org.eclipse.swt.widgets.Control AWT, Swing, JavaFX & SWT 8
G Control für Tabreiter (TabbedPane) AWT, Swing, JavaFX & SWT 8
D Widget/Control während Laufzeit durch ein anderes ersetzen AWT, Swing, JavaFX & SWT 3
M Gain Control: Problem mit float ! AWT, Swing, JavaFX & SWT 2
G mouse events AWT, Swing, JavaFX & SWT 6
Heldderschatten Java Events und Interfaces AWT, Swing, JavaFX & SWT 18
T Swing Änderung des ActionListener Events nach Klick auf JButton AWT, Swing, JavaFX & SWT 2
D Swing Events vom JLayer abfangen AWT, Swing, JavaFX & SWT 2
D Transparentes Hauptfenster Events AWT, Swing, JavaFX & SWT 1
M Swing Hinter die Kulissen von Events (addActionListener) AWT, Swing, JavaFX & SWT 6
N JTextArea Events weiterleiten AWT, Swing, JavaFX & SWT 3
R SWT Eigene Events erstellen und werfen AWT, Swing, JavaFX & SWT 59
S Mouse Events in einer sortierten JTable unterscheiden AWT, Swing, JavaFX & SWT 18
C Swing Simulation von Drag and Drop Events AWT, Swing, JavaFX & SWT 3
J Events und Sleep? AWT, Swing, JavaFX & SWT 4
C MouseMotionListener fired keine Events mehr wenn in Button AWT, Swing, JavaFX & SWT 2
E JFace ListSelectionDialog & Mouse-Events? AWT, Swing, JavaFX & SWT 2
N Variablen in Events AWT, Swing, JavaFX & SWT 4
P AWT MouseListener unklare abhandlung von Events AWT, Swing, JavaFX & SWT 3
L Swing Auslöser eines Events finden? AWT, Swing, JavaFX & SWT 6
R JTable - eigener Editor - Mouse events AWT, Swing, JavaFX & SWT 2
C keine weiteren Events während Drag&Drop Operation möglich? AWT, Swing, JavaFX & SWT 5
Weltall 7 AWT Maus-Events werden doppelt ausgeführt AWT, Swing, JavaFX & SWT 12
0 Events werden nicht ausgelöst AWT, Swing, JavaFX & SWT 2
V Swing Auslösen von zwei Events hintereinander AWT, Swing, JavaFX & SWT 4
MrMilti Gezeichnete Java2D Elemente mit Events versehen AWT, Swing, JavaFX & SWT 3
R Events - Nur auf eines reagieren AWT, Swing, JavaFX & SWT 3
T JComboBox: ActionListener/ItemListener wie nur auf bestimmte Events reagieren? AWT, Swing, JavaFX & SWT 7
B Swing setDefaultButton geht nicht - Komponente fängt Events ab AWT, Swing, JavaFX & SWT 5
R Key und Mouse Events AWT, Swing, JavaFX & SWT 2
K Alle Events abfangen mit GlassPane AWT, Swing, JavaFX & SWT 7
T SWT - Table Events AWT, Swing, JavaFX & SWT 3
hdi Events nicht plattform-unabhängig? AWT, Swing, JavaFX & SWT 14
M SWT: eigene Events AWT, Swing, JavaFX & SWT 9
G Reihenfolge von Events AWT, Swing, JavaFX & SWT 4
D Events bei Tabs in einem Editor AWT, Swing, JavaFX & SWT 2
F Probleme mit MouseWheel events in SWT AWT, Swing, JavaFX & SWT 13
M Globale Events in Windows abfangen AWT, Swing, JavaFX & SWT 2
T Hilfe zu Events? AWT, Swing, JavaFX & SWT 6
S Events abfangen, nicht durchlassen AWT, Swing, JavaFX & SWT 2
T Events unterdrücken AWT, Swing, JavaFX & SWT 8
G An die Quelle einen events kommen AWT, Swing, JavaFX & SWT 2
M Problem mit verschachtelten Events und kein ausweg in sicht AWT, Swing, JavaFX & SWT 3
W Vom JPanel bekomme ich keine Events AWT, Swing, JavaFX & SWT 5
V Events an untere Layers weitergeben AWT, Swing, JavaFX & SWT 2
V events skippen AWT, Swing, JavaFX & SWT 14
M Events auslagern? AWT, Swing, JavaFX & SWT 6
F Events AWT, Swing, JavaFX & SWT 8
N SWT: GUI Windows Events AWT, Swing, JavaFX & SWT 8
I Globale Tastatur-Events abfragen AWT, Swing, JavaFX & SWT 3
D Events werden zu oft aufgerufen AWT, Swing, JavaFX & SWT 4
G Events AWT, Swing, JavaFX & SWT 2
K Mouse Events der Scrollbar/pane AWT, Swing, JavaFX & SWT 2
S Events fremdauslösen AWT, Swing, JavaFX & SWT 17
K Doppelte Events AWT, Swing, JavaFX & SWT 4
A Combobox Focus-Events, Tab in Tabelle AWT, Swing, JavaFX & SWT 7
D Events, Listener, GUI . Größeres Projekt AWT, Swing, JavaFX & SWT 4
A Vielschichtige GUI und Events? AWT, Swing, JavaFX & SWT 4
V JList mit Events Steuern ? AWT, Swing, JavaFX & SWT 15
S Rechner zu schnell für Events? AWT, Swing, JavaFX & SWT 14
G JTable und Events AWT, Swing, JavaFX & SWT 4
S Events bei 2 gleichen Jtree abfangen AWT, Swing, JavaFX & SWT 3
ShapeShifter JButton erzeugt zwei Events AWT, Swing, JavaFX & SWT 4
B Eigenes Events AWT, Swing, JavaFX & SWT 3
T JScrollPane-Events AWT, Swing, JavaFX & SWT 2
M JTable und Events AWT, Swing, JavaFX & SWT 4
K JComboBox: Endlosschleife durch Events AWT, Swing, JavaFX & SWT 4
K [JComboBox] ENTER löst zwei events aus? AWT, Swing, JavaFX & SWT 2
M Glasspane und dispatchen von Events AWT, Swing, JavaFX & SWT 6
H Events manuell aufrufen AWT, Swing, JavaFX & SWT 4
F JComboBox setEditable( true ) auf Tastatur Events reagieren AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben