Events

Status
Nicht offen für weitere Antworten.

speedy-j

Mitglied
Hallo Leute,

habe das Forum nach passenden Beiträgen durchsucht, konnte aber so schnell keine passende Lösung für mein Prob. finden. Bin noch relativ neu in Java und möchte mich mit Events und Lsitener vertraut machen. Ich möchte eine Logische Trennung nach dem MVC Prinzip vornehmen. Ich habe einen Button der soll beim drücken ein Textfeld, Label oder eine andere Komponente ändern. Irgendwie bekomme ich das aber nicht hin. Kann mir da Jemand evtl ein Paar Tipps geben.

Danke für Eure Bemühungen
 
ActionListener beim Button registrieren, und wenn das Event (Method eactionPerformed des Listeners wird aufgerufen) auftritt das Textfeld, Label oder etc. abändern?

Deine Frage lässt viel Spielraum offen, wie sie zu verstehen ist...
 
Buttons haben das bereits implementiert. Dafür sind die ActionListener zuständigl. Du musst also dem Button einen ActionListener hinzufügen und darin führst du dann aus, was du willst:

Code:
button.addActionListener(new ActionListener(){
          public void actionPerformed(ActionEvent evt){
                  // hier änderst du die anderen Komponenten
          }
});

(ohne Gewähr der syntaktischen Korrektheit)
 
Danke für die schnellen Antworten,

ich habe das soweit auch hinbekommen, aber wenn ich dem Button ein Listener zufüge, dann kann ich nicht auf ein Label oder ein Textfeld zugreifen. Die Variable jlbl_OK in Zeile 44 kennt er nicht. Was mache ich falsch und wie kann ich später die Funktionen auslagern um eine Trennung von Gui und Logik zu garantieren?

Danke

Code:
package gui;
import java.awt.*;
import java.awt.event.*;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;

public class MainFrameGui extends JFrame  implements ActionListener{
	/**
	 * 
	 */
	private static final long serialVersionUID = -7978469965404274136L;
	
		

	public MainFrameGui(){
		 
		  //addWindowListener(new WindowClosingAdapter(true));
		  //setLayout(new FlowLayout());
		
		  JPanel jpl_main = new JPanel();
		  JLabel jlbl_Ok = new JLabel("Name:", SwingConstants.LEFT);
		  
		  JTextField jtf_namen = new JTextField(30);
		  jtf_namen.setToolTipText("Geben Sie ihren Namen ein");
		  JButton jbtn_push = new JButton("Name");
		  jbtn_push.addActionListener(this);
		  jpl_main.add(jtf_namen);
		  jpl_main.add(jlbl_Ok);
		  jpl_main.add(jbtn_push);
		  this.add(jpl_main);
		  this.pack();
		  this.setVisible(true);
		  
	}

	public void actionPerformed(ActionEvent event) {
		// TODO Auto-generated method stub
		jlbl_Ok.setText("Anderer Text");
		System.exit(0);
		
		
	}
 
Deine Komponenten sind namentlich nur im Konstruktor bekannt. Damit kannst du natürlich von nirgendwoher drauf zugreifen. Definier diese als Klassenvariablen und es geht.
 
Code:
package gui;
import java.awt.*;
import java.awt.event.*;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;

public class MainFrameGui extends JFrame  implements ActionListener{
   /**
    *
    */
   private static final long serialVersionUID = -7978469965404274136L;
   
  // ********
  // Das Label muss dem gesammten Objekt bekannt gemacht werden
   private JLabel jlbl_Ok;

   public MainFrameGui(){
      
        //addWindowListener(new WindowClosingAdapter(true));
        //setLayout(new FlowLayout());
      
        JPanel jpl_main = new JPanel();

        // ******
        // Keine lokale Definition von jlbl_Ok mehr!
        jlbl_Ok = new JLabel("Name:", SwingConstants.LEFT);
       
        JTextField jtf_namen = new JTextField(30);
        jtf_namen.setToolTipText("Geben Sie ihren Namen ein");
        JButton jbtn_push = new JButton("Name");
        jbtn_push.addActionListener(this);
        jpl_main.add(jtf_namen);
        jpl_main.add(jlbl_Ok);
        jpl_main.add(jbtn_push);
        this.add(jpl_main);
        this.pack();
        this.setVisible(true);
       
   }

   public void actionPerformed(ActionEvent event) {
      // TODO Auto-generated method stub
      jlbl_Ok.setText("Anderer Text");
      System.exit(0);
      
      
   }

[Edit: Hupfdule, du meintest wohl Objektvariablen? :wink: ]
 
Danke für die schnellen Antworten

Ihr seid Klasse :applaus:

Gruss

Vielleicht noch ein Frage, sollte man diese Funktionen (Events) bei Größeren Projekten auslagern und wenn ja wie ist die eleganteste Lösung ?
 
wie meinst du das auslagern? in einer anderen klasse? wenn ja das würde ich nicht tun. so oder so mußt du ehh den button mit den actionlistener registrieren. du kannst die methoden die du ausführen möchtest auslagern, mehr aber auch nicht.
 
Wenn du es wirklich 100 % umsetzten willst, dann schreib dein programm zuerst als reine "Konsolen-Applikation". Wenn das fertig ist, mach dir eine GUI drum herum, die nur die Schnittstellen deiner Applikation benutzt.

Ist zwar erstmal etwas lästig aber so geht es am besten und nachher wird es umso leichter zu pflegen und zu erweitern !
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben