Buttons und ihre Events?

Yuri-Li

Grünschnabel
Hey :)
Ich habe ne Frage zum Thema Buttons.
Wir haben 3 Buttons, wenn wir einen anklickt so wird dieser fixiert. Wenn aber insgesamt zwei Buttons fixiert sind, soll er er schauen ob die Buttons den gleichen Text beinhalten und wenn ja Friede Freude Eierkuchen, wenn aber nicht soll er beide Buttons lösen.
Mir ist schon klar das ich das ganze mit einer IF Anweisung veranstalte ich weiß nur noch nicht wie und wohin das müsste, außerdem weiß ich nicht wie ich ihm sagen soll, dass er nach zwei Buttons kein dritten mehr anklicken darf.
Kann mir einer sagen wie das ungefähr geht?

So sieht zurzeit mein Quellcode aus:
Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Buttons
{
   public Buttons
        {
        JFrame fenster = new JFrame();
        fenster.setLayout(new BorderLayout());
        
        JPanel hauptPanel = new JPanel();
        hauptPanel.setBorder(new EtchedBorder());
             
        final JButton Wort01 = new JButton("Hallo");
        Wort01.setBackground(new Color(238, 238, 238));
        Wort01.addActionListener(new ActionListener()
        { public void actionPerformed(ActionEvent event01)
            {   
                Wort01.setEnabled(false);
            }
        } );
        hauptPanel.add(Wort01);

        final JButton Wort02 = new JButton("Hallo");
        Wort02.setBackground(new Color(238, 238, 238));
        Wort02.addActionListener(new ActionListener()
        { public void actionPerformed(ActionEvent event02)
            {   
                Wort02.setEnabled(false);
            }
        } );
        hauptPanel.add(Wort02);

        final JButton Wort03 = new JButton("Tschau");
        Wort03.setBackground(new Color(238, 238, 238));
        Wort03.addActionListener(new ActionListener()
        { public void actionPerformed(ActionEvent event03)
            {   
                Wort03.setEnabled(false);
            }
        } );
        hauptPanel.add(Wort03);

     }
}

lg
Yuri
 
So, ich weiss nicht ob du das so gelernt hast oder anwenden musst. Aber die Methode mit dem addActionListener(new ActionListener()) etc. wo du dann die ganzen Befehle reinschreibst, erscheint mir etwas unübersichtlich und unpraktisch^^

Ich hab das so gelöst, dass du den ActionListener implementierst und dann bei jedem Button schreibst "Wort01.addActionListener(this);". Zuästzlich hast du dann die Methode actionPerfomed(ActionEvent e) in deiner Klasse.
Die Methode hat einen Parameter e und darüber kannst du herausfinden welcher Button gedrückt wurde und was die Buttons für einen Text haben.

Achja, ich habe noch einige Sachen hinzugefügt. z.B. musst du den hauptPanel am Schluss auch noch zum fenster hinzufügen, sonst wird gar nichts angezeigt und ebenfalls fenster.setVisible(true) machen.

Naja hier mal der Code. Wenn du noch Fragen hast, frag einfach ;)
Das Ganze liesse sich mit Methoden vereinfachen, ist aber aus Verständlichkeitsgründen schön ausprogrammiert.

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

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.border.EtchedBorder;

public class Buttons implements ActionListener {

	private JFrame fenster = new JFrame();
	private final JButton Wort02 = new JButton("Hallo");
	private final JButton Wort01 = new JButton("Hallo");
	private final JButton Wort03 = new JButton("Tschau");

	public Buttons() {
		fenster.setLayout(new BorderLayout());
		fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		JPanel hauptPanel = new JPanel();
		hauptPanel.setBorder(new EtchedBorder());

		Wort01.setBackground(new Color(238, 238, 238));
		Wort01.addActionListener(this);
		hauptPanel.add(Wort01);

		Wort02.setBackground(new Color(238, 238, 238));
		Wort02.addActionListener(this);
		hauptPanel.add(Wort02);

		Wort03.setBackground(new Color(238, 238, 238));
		Wort03.addActionListener(this);
		hauptPanel.add(Wort03);
		fenster.add(hauptPanel);

		fenster.pack();
		fenster.setVisible(true);
	}

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

	@Override
	public void actionPerformed(ActionEvent e) {
		Object source = e.getSource();
		if (source == Wort01) {
			Wort01.setEnabled(false);
			if (Wort02.isEnabled() && Wort03.isEnabled()
					&& Wort02.getText().equals(Wort03.getText())) {
				JOptionPane.showMessageDialog(fenster,
						"Friede Freude Eierkuchen;)");
			} else {
				Wort02.setEnabled(true);
				Wort03.setEnabled(true);
			}

		} else if (source == Wort02) {
			Wort02.setEnabled(false);
			if (Wort01.isEnabled() && Wort03.isEnabled()
					&& Wort01.getText().equals(Wort03.getText())) {
				JOptionPane.showMessageDialog(fenster,
						"Friede Freude Eierkuchen;)");
			} else {
				Wort01.setEnabled(true);
				Wort03.setEnabled(true);
			}
		} else if (source == Wort03) {
			Wort03.setEnabled(false);
			if (Wort01.isEnabled() && Wort02.isEnabled()
					&& Wort01.getText().equals(Wort02.getText())) {
				JOptionPane.showMessageDialog(fenster,
						"Friede Freude Eierkuchen;)");
			} else {
				Wort01.setEnabled(true);
				Wort02.setEnabled(true);
			}
		}
	}
}
 
@java123: Bei großen GUIs wird es sehr unübersichtlich immer den ActionListener als this hinzuzufügen. Ich halte das eher für eine sehr unschöne Praxis. Wenn man den ActionListener als anonyme Klasse nimmt, weiß man immerhin worum es gerade geht und muss nicht die source des Events überprüfen und hat ewige if-else Abfragen.

Es ist also durchaus richtig was Yuri-Li da gemacht hat.
 
Jedem das Seine. Ich finde jetzt eher die Methode von Yuri-Li unübersichtlich. Klar die if-else Überprüfungen sind nicht sehr schön, dafür hat man alle Befehle die bei einem Buttoklick aufgerufen werden auf einen Blick.

Wie auch immer. @Yuri-Li: Du kannst einfach mit button.getText und button.isEnabled überprüfen ob die Buttons den gleichen Text haben und ob sie deaktiviert sind oder nicht. Das kannst du auch so bei deiner Methode einbauen.
 
Hey ^^
Danke für eure Hilfe, ich hab es jetzt etwas anders gemacht als ihr, aber durch euch bin ich erst darauf gekommen ^^
Vielen Dank

Yuri
 

Neue Beiträge

Zurück