Button drücken und dann weiter?

  • Themenstarter Themenstarter schmalhans
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
S

schmalhans

Gast
Hallo,

zu allererst muss ich gleich vorneweg sagen. Das ich gerade die ersten Stunden mit JAVA verbringe. Ich bin in anderen Sprachen (C, etc) gut belesen.

Ich spiele gerade mit den SWING Kompenten rum, nur eines versteh ich nicht:

Wie sieht der Syntax aus, wenn ich einen Button drücke und da soll dann was passieren???
Ich glaub ich raff diesen ActionListener nicht ganz.


Wie würde es z.b. gehen, den Text des Buttons der gerade gedrückt wurde zu verändern???


Danke schon jetzt.

Gruß
schmalhans
 
also, um die Aktion festzulegen, die ein Button ausführen soll, wenn der geklickt wurde, musst Du ihm eine Klasse zuweisen (addActionListener), welche das Interface 'ActionListener' implementiert. Dadurch hat die Klasse die Methode "actionPerformed" welche beim klicken aufgerufen wird.

Um nun z.b. den Text des Buttons zu ändern musst Du die Methode "setText" aufrufen:
Code:
class RenameAction implements ActionListener {
  public void actionPerformed(ActionEvent e) {
    if ( e.getSource() instanceof JButton ) {
      ((JButton)e.getSource()).setText("Neuer Text!!!");
    }
  }
}
 
Danke, für die schnelle Antwort.

Sehe ich das dann richtig, dass man für jede Action die ausgeführt werden soll, eine eigene Klasse erstellt werden muss? Da hat man ja bei z.b. 15 Buttons, 15 Klassen.

Oder hab ich das falsch verstanden?
 
Nein, dass muss man nicht machen. Man kann auch diese ActionKlasse jedem der Buttons zuweisen.
Dann macht es aber in den meisten Fällen Sinn, mittels if-else zu prüfen, um welchen Button es sich handelt und für jeden Button eine andere Action auszuführen, also, z.B.:

Code:
JButton b1 = new JButton( "Save" );
b1.setActionCommand("ACTION_SAVE");
JButton b2 = new JButton( "Abort" );
b2.setActionCommand("ACTION_ABORT");

Code:
public void actionPerformed(ActionEvent e) { 
  if ( "ACTION_SAVE".equals(e.getActionCommand()) ) {
    // do the Save-Action
  } else if ("ACTION_ABORT".equals(e.getActionCommand())) {
    // do the Abort-Action
  }
}
 
Ah... Ok. Gut zu wissen. 🙂

Nu hab ich mal ausprobiert, wenn ich auf den Button drücke, soll er mir ein ein Textfeld "Hallo" schreiben. Nur leider funktionert das nicht, er macht nix, wenn ich drücke.
Ich würde nur gerne wissen, wo der Fehler liegt. Ist eigentlich doch eindeutig.

Hier der Syntax:

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

import javax.swing.JFrame;


/**
 * @author b0552
 *
 * Folgendes auswählen, um die Schablone für den erstellten Typenkommentar zu ändern:
 * Fenster&Benutzervorgaben&Java&Codegenerierung&Code und Kommentare
 */
public class Ding extends JFrame implements ActionListener {

	private javax.swing.JPanel jContentPane = null;

	private javax.swing.JTextField jTextField = null;
	private javax.swing.JButton jButton = null;
	/* (Kein Javadoc)
	 * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
	 */
	public void actionPerformed(ActionEvent arg0) 
	{
		if("GO".equals(jButton.getActionCommand()))
		{
			jTextField.setText("Hallo");
		}

	}

	public static void main(String[] args) {
	}
	/**
	 * This is the default constructor
	 */
	public Ding() {
		super();
		initialize();
	}
	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		this.setSize(300, 200);
		this.setContentPane(getJContentPane());
	}
	/**
	 * This method initializes jContentPane
	 * 
	 * @return javax.swing.JPanel
	 */
	private javax.swing.JPanel getJContentPane() {
		if (jContentPane == null) {
			jContentPane = new javax.swing.JPanel();
			jContentPane.setLayout(null);
			jContentPane.add(getJTextField(), null);
			jContentPane.add(getJButton(), null);
		}
		return jContentPane;
	}
	/**
	 * This method initializes jTextField
	 * 
	 * @return javax.swing.JTextField
	 */
	private javax.swing.JTextField getJTextField() {
		if(jTextField == null) {
			jTextField = new javax.swing.JTextField();
			jTextField.setBounds(44, 19, 123, 44);
		}
		return jTextField;
	}
	/**
	 * This method initializes jButton
	 * 
	 * @return javax.swing.JButton
	 */
	private javax.swing.JButton getJButton() {
		if(jButton == null) {
			jButton = new javax.swing.JButton();
			jButton.setBounds(135, 94, 124, 44);
			jButton.setText("test");
			jButton.setActionCommand("GO");
		}
		return jButton;
	}
}
 
Die Zeile fehlt noch:
Code:
jButton.addActionListener(this);
 
hab ich auch schon probiert. Nur leider macht er nix.
Kann es sein, dass ich nen Fehler mach bei der Ausführung des Programms?

da bei mir, sobald ich ne Visual-Class erstelle, eine Taskfenster mit der Java-Tasse offen ist.
Ich verwende Websphere Studio.
 
So läufts bei mir - Änderungen sind dokumentiert:

Code:
class Ding extends JFrame implements ActionListener {

  private javax.swing.JPanel jContentPane = null;

  private javax.swing.JTextField jTextField = null;
  private javax.swing.JButton jButton = null;
  /* (Kein Javadoc)
       * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
   */
  public void actionPerformed( ActionEvent arg0 ) {
    if( "GO".equals( jButton.getActionCommand() ) ) {
      jTextField.setText( "Hallo" );
    }

  }

  public static void main( String[] args ) {
    new Ding(); // Eingefügt
  }

  /**
   * This is the default constructor
   */
  public Ding() {
    super();
    initialize();
  }

  /**
   * This method initializes this
   *
   * @return void
   */
  private void initialize() {
    this.setSize( 300, 200 );
    this.setContentPane( getJContentPane() );
    this.setVisible( true ); // Eingefügt
  }

  /**
   * This method initializes jContentPane
   *
   * @return javax.swing.JPanel
   */
  private javax.swing.JPanel getJContentPane() {
    if( jContentPane == null ) {
      jContentPane = new javax.swing.JPanel();
      jContentPane.setLayout( null );
      jContentPane.add( getJTextField(), null );
      jContentPane.add( getJButton(), null );
    }
    return jContentPane;
  }

  /**
   * This method initializes jTextField
   *
   * @return javax.swing.JTextField
   */
  private javax.swing.JTextField getJTextField() {
    if( jTextField == null ) {
      jTextField = new javax.swing.JTextField();
      jTextField.setBounds( 44, 19, 123, 44 );
    }
    return jTextField;
  }

  /**
   * This method initializes jButton
   *
   * @return javax.swing.JButton
   */
  private javax.swing.JButton getJButton() {
    if( jButton == null ) {
      jButton = new javax.swing.JButton();
      jButton.setBounds( 135, 94, 124, 44 );
      jButton.setText( "test" );
      jButton.setActionCommand( "GO" );
      jButton.addActionListener( this ); // Eingefügt
    }
    return jButton;
  }
}
 
Oh man, ich bin ein Blinder!!!

Es hat folgendes gefehlt:

Code:
public static void main(String[] args) {
		new Ding(); // <----- hat gefehlt bei mir
	}

Ich bedanke mich sehr! Jetzt hab ich wenigstens mal so nen kleinen Überblick wie
die Action-Behandlung bei JAVA funktioniert. Klasse und schnelle Antworten! DANKE!
 
Doch noch ein Anliegen. :roll:

Und zwar wollt ich nun einen 2. Button einfügen, um die actionPerformed()-Funktion noch etwas auszutesten.
Nun gibs folgendes Problem:

Ich habe den 2. Button folgender Maßen eingefügt:

Code:
	private javax.swing.JButton getJButton1() {
		if(jButton1 == null) {
			jButton1 = new javax.swing.JButton();
			jButton1.setBounds(252, 204, 124, 29);
			jButton1.setText("Test");
			jButton1.setActionCommand("TEST");
			jButton.addActionListener(this);
		}
		return jButton1;
	}


Und mein actionPerformed() sieht so aus:

Code:
	public void actionPerformed(ActionEvent e) 
	{
		if("GO".equals(e.getActionCommand()))
		{
			jTextField.setText("Hallo");
		}
		else if("TEST".equals(e.getActionCommand()))
		{
			jTextField.setText("TEST");
		}
		else
		{
			jTextField.setText("NIX");
		}
	}

Aber er ändert den Inhalt des Textfeldes nicht, es funktionert nur mit dem 1. Button.
Was mach ich hier falsch?
 
Ha! Hab den Fehler gefunden!
War ein einfacher Schreibfehler:

jButton1.addActionListener(this); <-- so muss es lauten

Hab die "1" vergessen.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben