Butto Text ändern

Malaxo

Erfahrenes Mitglied
Also ich hab ein problem und zwar habe ich 9 Buttons mit dem Buchstaben 'f' dur eine schlaufe gesetzt. Nun will ich beim draufklicken auf den Button (b1) das sich der buchstabe 'f' in ein 'x' verwandelt... doch es funktioniert nicht hab 0 ahnung wiso.... hab auch schon die schleife entfehrnt und nur mit 1 button statt mit 9 versucht aber geht nicht ich schaffs einfach nicht.... kann mir da bitte jemand helfen?

PS: bin Neueinsteiger in Java also bitte einfach erklären.
Danke schon mal für eure mühe und hilfe

mfg

malaxo


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

import javax.swing.*;

public class gui extends JFrame implements ActionListener {
	protected JButton b1 = new JButton("f");
	protected JButton neustart = new JButton("Neustart");
	protected JButton beenden = new JButton("Beenden");
	String Chars = "X";
  public static void main(String[] args) {
  	new gui();
  }

  public gui() {
  	initGUI();
  	setSize(800,600);
  	setVisible(true);
  }
  
  private void initGUI() {
  	int x;
  	x=0;
  	getContentPane().setLayout(new BorderLayout());
  	neustart.addActionListener(this);
  	getContentPane().add (neustart, BorderLayout.NORTH);
  	setSize(150,50);
  	beenden.addActionListener(this);
  	getContentPane().add (beenden, BorderLayout.SOUTH);
  	setSize(150,50);
  	JPanel feld = new JPanel(new GridLayout(3,3));
	do{
  		JButton b1 = new JButton ("f");
 	  	feld.add	(b1, GridLayout.class);
	  	x++;
  	  	}
  	  	while(x!=9);
  	getContentPane().add (feld, BorderLayout.CENTER);
  }
  public void actionPerformed(ActionEvent e) {
  		b1.addActionListener(this);
        b1.setText("X");
    }
}
 
Moin,
verschiebe einfach diese Zeile

b1.addActionListener(this);

in die initGUI() Methode.
Grund: Der ActionListener muss ZUERST zugewiesen werden und dafür sorgen, dass die actionPerformed() aufgerufen wird. So wie es jetzt ist, wird ja actionPerformed nie aufgerufen, weil die Zuweisung des ActionListeners fehlt bzw. ausgerechnet innerhalb der actionPerformed passiert.
Im übrigen empfiehlt es sich - in Hinblick auf weitere Buttons o.ä. - für jede Komponente einen eigenen, meist anonymen ActionListener zu implementieren. Das ermöglicht eine einfachere Behandlung von Actions. Ansonsten musst Du z.B. erst die Source abfragen. Also wenn Du jetzt 2 Buttons hättest, müsstest Du erst prüfen, welcher von beiden gedrückt wurde.

Code:
b1.addActionListener(new java.awt.event.ActionListener()
{
  public void actionPerformed(ActionEvent e)
  {
    jb1_actionPerformed(e);
  }
});
b2.addActionListener(new java.awt.event.ActionListener()
{
  public void actionPerformed(ActionEvent e)
  {
    jb2_actionPerformed(e);
  }
});

// und irgendwoanders in der Klasse:
void jb1_actionPerformed(ActionEvent e)
{
// tu was Du willst
}

void jb2_actionPerformed(ActionEvent e)
{
// tu was Du willst
}
 
hm... hab den code jetzt so geändert:


Code:
  private void initGUI() {
  	int x;
  	x=0;
  	getContentPane().setLayout(new BorderLayout());
  	neustart.addActionListener(this);
   	getContentPane().add (neustart, BorderLayout.NORTH);
  	setSize(150,50);
  	beenden.addActionListener(this);
  	getContentPane().add (beenden, BorderLayout.SOUTH);
  	setSize(150,50);
  	JPanel feld = new JPanel(new GridLayout(3,3));
  	  private void initGUI() {
  	int x;
  	x=0;
  	getContentPane().setLayout(new BorderLayout());
  	neustart.addActionListener(this);
   	getContentPane().add (neustart, BorderLayout.NORTH);
  	setSize(150,50);
  	beenden.addActionListener(this);
  	getContentPane().add (beenden, BorderLayout.SOUTH);
  	setSize(150,50);
  	JPanel feld = new JPanel(new GridLayout(3,3));
  	b1.addActionListener(this);
  	do{
  		JButton b1 = new JButton ("");
 	  	feld.add	(b1, GridLayout.class);
	  	x++;
  	  	}
  	  	while(x!=9);
  	getContentPane().add (feld, BorderLayout.CENTER);
  }
  public void actionPerformed(ActionEvent e) {
        b1.setText("X");
    }
}
  	do{
  		JButton b1 = new JButton ("");
 	  	feld.add	(b1, GridLayout.class);
	  	x++;
  	  	}
  	  	while(x!=9);
  	getContentPane().add (feld, BorderLayout.CENTER);
  }
  public void actionPerformed(ActionEvent e) {
        b1.setText("X");
    }
}

die Zeile

b1.addActionListener(this);

in die initGUI() Methode getan.
Doch es ändert sich trozdem nichts wen man auf den Button klickt:-S
 
Hallo!

Meinst du vielleicht so was:

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

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

public class JButtonExample extends JFrame {

	private JButton[] buttons = new JButton[10];

	public JButtonExample() {
		super("JButtonExample");
		setDefaultCloseOperation(EXIT_ON_CLOSE);

		Container c = getContentPane();
		c.setLayout(new FlowLayout());

		ActionHandler handler = new ActionHandler(this);

		for (int i = 0; i < buttons.length; i++) {
			JButton btn = (buttons[i] = new JButton("F" + i));
			btn.addActionListener(handler);
			c.add(btn);
		}

		pack();
		setVisible(true);
	}

	public static void main(String[] args) {
		new JButtonExample();
	}

	class ActionHandler implements ActionListener {

		private JFrame frm;

		public ActionHandler(JFrame frm) {
			this.frm = frm;
		}

		public void actionPerformed(ActionEvent e) {
			Object src = e.getSource();
			if (src instanceof JButton) {
				JButton btn = (JButton) src;
				btn.setText(btn.getText().replace('F', 'X'));
				frm.pack();
			}
		}

	}
}

Gruß Tom
 
Hallo!

Bitte schön:

Code:
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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



public class GUI extends JFrame implements ActionListener {
	protected JButton neustart = new JButton("Neustart");
	protected JButton beenden = new JButton("Beenden");
	protected JPanel feld;
	String Chars = "X";

	public static void main(String[] args) {
		new GUI();
	}

	public GUI() {
		initGUI();
		setSize(800, 600);
		setVisible(true);
	}

	private void initGUI() {
		int x;
		x = 0;
		getContentPane().setLayout(new BorderLayout());
		neustart.addActionListener(this);
		getContentPane().add(neustart, BorderLayout.NORTH);
		setSize(150, 50);
		beenden.addActionListener(this);
		getContentPane().add(beenden, BorderLayout.SOUTH);
		setSize(150, 50);
		feld = new JPanel(new GridLayout(3, 3));
		do {
			JButton b1 = new JButton("F");
			b1.addActionListener(this);
			feld.add(b1, GridLayout.class);

			x++;
		} while (x != 9);
		getContentPane().add(feld, BorderLayout.CENTER);
	}
	public void actionPerformed(ActionEvent e) {
		Object src = e.getSource();
		if (src == beenden) {
			System.exit(0);
		}
		if (src == neustart) {
			Component[] components = feld.getComponents();
			for (int i = 0; i < components.length; i++) {
				((JButton) components[i]).setText("F");
			}
		}
		if (src instanceof JButton) {
			JButton btn = (JButton) src;
			btn.setText("X");
		}
	}
}

Gruß Tom
 
Original geschrieben von Malaxo
hm... hab den code jetzt so geändert:

die Zeile

b1.addActionListener(this);

in die initGUI() Methode getan.
Doch es ändert sich trozdem nichts wen man auf den Button klickt:-S

Sigh!
Asche auf mein und Dein Haupt. Auf meins, weil ich es nicht gesehen habe, auf Deins weil Du etwas unglückliche Variablenbezeichnungen verwendet hast:

Code:
public class gui extends JFrame implements ActionListener {
	protected JButton b1 = new JButton("f");

und etwas weiter in der initGUI:

Code:
do{
  		JButton b1 = new JButton ("f");
 	  	feld.add	(b1, GridLayout.class);
	  	x++;
  	  	}
  	  	while(x!=9);

D.h. wenn Du vor der do-while-Schleife

b1.addActionListener(this);

einfügst, wird nur dem einen b1, den Du in der Klasse definiert hast, der ActionListener hinzugefügt. Doch genau dieser wird gar nicht dem feld hinzugefügt, weil in der do-while-Schleife eine neue Variable b1 gleichen Typs angelegt und verwendet wird!
Also wenn schon, gehört

b1.addActionListener(this);

in die do-while-Schleife:
Code:
do{
  		JButton b1 = new JButton ("f");
                b1.addActionListener(this);
 	  	feld.add	(b1, GridLayout.class);
	  	x++;
  	  	}
  	  	while(x!=9);

Das nur so zur Erklärung, Thomas' Code wird schon funktionieren, hab ihn allerdings nicht ausprobiert.

Abschliessend ein wichtiger Rat:
VERMEIDE EINE DOPPELTE VERGABE VON VARIABLENNAMEN
(Siehe b1 in Deinem Programm)
Eine doppelte Vergabe von Variablennamen birgt ein enormes Fehlerpotential, wie man oben schön sehen kann...
 
@Tom du hast noch eine kleine make drin ;-)

aber die ist weg jetzt.... wen man bei deinem programm auf NEUSTART drückt kommt im NEUSTART button auch ein X :-)


um das zu vermeiden =

Code:
else  {
			JButton btn = (JButton) src;
			btn.setText("X");
		}

das 'if' in ein else ändern und den rest löschen......


PS: 1000 dank für deine zusatzfunktionen (Beenden & Neustart)

*g*

schlussändlich sollte aus dem programm das ich mache ein Tic Tac Toe game werden:-)

thx für eure hilfe ........ fragen kommen bestimmt noch welche:-)
 
Zurück