Erste Schritte handgeschaltete Ampel programieren

BlonderEngel

Mitglied
ich habe ein, für die meisten eher winziges Problem und bitte um hilfe.
Ich bin dabei seit 3 Monaten java zu lernen. Ich möchte betonen das dies KEINE Hausaufgabe ist, sondern eine Aufgabe die mir ein Arbeitskollege gestellt hat! (habe am 01.10 angefangen dual zu studieren)
ich soll eine handgeschaltene Ampel programieren die so aussehen soll:
Anhang anzeigen 3627

Mein code den ich bis jetzt habe sieht so aus:
Java:
 import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;


public class Ampel extends JFrame
{
	Container c;
	JRadioButton[] farben = new JRadioButton[3];
	JButton[] kasten = new JButton[3];

	public Ampel()
	{
		c = getContentPane();
		c.setLayout(new GridLayout(3, 2, 10, 5));
		ButtonGroup ampelWort = new ButtonGroup();
		farben[0] = new JRadioButton("rot");
		farben[1] = new JRadioButton("gelb");
		farben[2] = new JRadioButton("grün");
		ampelWort.add(farben[0]);
		ampelWort.add(farben[1]);
		ampelWort.add(farben[2]);

		kasten[0] = new JButton();
		kasten[1] = new JButton();
		kasten[2] = new JButton();
		
		kasten[0].setBackground(Color.BLACK);
		kasten[1].setBackground(Color.BLACK);
		kasten[2].setBackground(Color.BLACK);
		
		c.add(farben[0]);
		c.add(kasten[0]);
		c.add(farben[1]);
		c.add(kasten[1]);
		c.add(farben[2]);
		c.add(kasten[2]);
	}

		public class ButtonSchaltung implements ActionListener
		{

			@Override
			public void actionPerformed(ActionEvent e)
			{
				
			}
	}

	public static void main(String[] args)
	{

		JFrame Ampel= new Ampel();
		Ampel.setTitle("Ampelschaltung");
		Ampel.setSize(300,300);
		Ampel.setVisible(true);
		Ampel.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

}
doch jetzt komme ich leider nicht weiter.
ich soll mit einem einzigen Listener-Objekt arbeiten, in einer inneren klasse. Bei jedem aktivieren eines JRadioButtons soll der dazugehörige Button auf die richtige Farbe gesetzt werden.
dies soll dann auch bei einem Mausklick auf den noch schwarzen Button funktionieren und dabei soll dann auch analog der richtige JRadioButton aktiviert werden.
wäre um jede anregung und Lösungsansatz froh das ich auf die richtige Spur komme und dann selbst weiter machen kann.
 
S

SlaterB

Gast
keine Vorstellung was zu tun ist?
wenn gewisse Befehle fehlen ist das eine Sache, obwohl die auch nachgeschlagen werden können,
aber der Grundplan?
z.B. als erstes feststellen welder Button gedrückt wurde, dann reagieren indem etwa Farben gesetzt werden usw?

den ActionListener registrieren musst du auch noch
 

BlonderEngel

Mitglied
ich habe mir schon gedanken gemacht über den index und einer Switch anweisung heraus zu finden welcher JRaidioButton betätigt wurde aber wie ich es dann mache das dann die Farbe des JButtons geändert wird, da stehe ich auf dem Schlauch.
oder ist der Ansatz falsch?
 

insane80

Aktives Mitglied
Du könntest Dir vom ActionEvent die Source zurückgeben lassen, also z. B. welcher Button angeklickt wurde und darüber alles weitere steuern.
Ist denke ich besser als per Switch-Anweisung.
 
S

SlaterB

Gast
kopiere doch in jedes switch alle drei Befehle
Java:
        kasten[0].setBackground(Color.BLACK);
        kasten[1].setBackground(Color.BLACK);
        kasten[2].setBackground(Color.BLACK);
nur mit den richtigen Farben,
extra noch herauszufinden welche Ampel vorher aktiv war ist zwar intelligenter, aber hier fast sinnlos im Vergleich des Aufwands

> Ist denke ich besser als per Switch-Anweisung.
da kommt man nicht drumherum, nur aus der Source kann man nichts erschaffen man muss schon unterscheiden:
war es x? dann ..
war es y? dann ..
war es z? dann ..
also drei if oder ein switch

die Alternative wäre höchstens dre einzelne Listener
 

BlonderEngel

Mitglied
Danke für die Tips, ich habe es jetzt so umgesetzt:

Java:
 import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.swing.*;

public class Ampel extends JFrame
{
	Container c;
	JRadioButton[] farben = new JRadioButton[3];
	JButton[] kasten = new JButton[3];

	public Ampel()
	{
		c = getContentPane();
		c.setLayout(new GridLayout(3, 2, 10, 5));
		ButtonGroup ampelWort = new ButtonGroup();
		farben[0] = new JRadioButton("rot");
		farben[1] = new JRadioButton("gelb");
		farben[2] = new JRadioButton("grün");
		ampelWort.add(farben[0]);
		ampelWort.add(farben[1]);
		ampelWort.add(farben[2]);

		farben[0].addItemListener(new ButtonSchaltung());
		farben[1].addItemListener(new ButtonSchaltung());
		farben[2].addItemListener(new ButtonSchaltung());

		farben[0].setMnemonic(0);
		farben[1].setMnemonic(1);
		farben[2].setMnemonic(2);

		kasten[0] = new JButton();
		kasten[1] = new JButton();
		kasten[2] = new JButton();

		kasten[0].setBackground(Color.BLACK);
		kasten[1].setBackground(Color.BLACK);
		kasten[2].setBackground(Color.BLACK);

		kasten[0].addActionListener(new ButtonFarben());
		kasten[1].addActionListener(new ButtonFarben());
		kasten[2].addActionListener(new ButtonFarben());

		kasten[0].setMnemonic(0);
		kasten[1].setMnemonic(1);
		kasten[2].setMnemonic(2);

		farben[0].setSelected(true);
		c.add(farben[0]);
		c.add(kasten[0]);
		c.add(farben[1]);
		c.add(kasten[1]);
		c.add(farben[2]);
		c.add(kasten[2]);
	}

	public class ButtonSchaltung implements ItemListener
	{

		@Override
		public void itemStateChanged(ItemEvent e)
		{
			JRadioButton farben = (JRadioButton) e.getSource();
			System.out.println(farben.getText() + " current state: " + e.getStateChange() + " " + farben.getMnemonic());

			switch (farben.getMnemonic())
			{
			case 0:
				kasten[0].setBackground(Color.RED);
				kasten[1].setBackground(Color.BLACK);
				kasten[2].setBackground(Color.BLACK);
				break;
			case 1:
				kasten[0].setBackground(Color.BLACK);
				kasten[1].setBackground(Color.ORANGE);
				kasten[2].setBackground(Color.BLACK);
				break;
			case 2:
				kasten[0].setBackground(Color.BLACK);
				kasten[1].setBackground(Color.BLACK);
				kasten[2].setBackground(Color.GREEN);

				break;
			}
		}

	}

	public class ButtonFarben implements ActionListener
	{
		@Override
		public void actionPerformed(ActionEvent e)
		{
			JButton kasten = (JButton) e.getSource();

			switch (kasten.getMnemonic())
			{
			case 0:
				farben[0].setSelected(true);
				break;
			case 1:
				farben[1].setSelected(true);
				break;
			case 2:
				farben[2].setSelected(true);
				break;
			}

			
		}

	}

	public static void main(String[] args)
	{

		JFrame Ampel = new Ampel();
		Ampel.setTitle("Ampelschaltung");
		Ampel.setSize(300, 300);
		Ampel.setVisible(true);
		Ampel.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

}
 

BlonderEngel

Mitglied
Ja, habe er zuerst einmal so programmiert das es überhaupt läuft, aber jetzt habe ich beides mit je einem listender gelöst. Speichere das dann in einer variable. Das heißt es läuft alles so wie es soll
Jetzt. Stee morgen zuf Vollständigkeit meine komplette lösung ein.
Danke fürs schnelle helfen.
 

Ähnliche Java Themen

Neue Themen


Oben