in actionPerformed() Koordinaten ändern

julius92

Mitglied
Hallo, ich will mit dem Programm ChoiceRadio eine Ereignisverarbeitung realsieren, welche dafür sorgt, dass bei Anwahl eines Radiobuttons das Oval an der entsprechenden Position (links oben, rechts oben,
usw.) im rechten Bereich angezeigt wird.

Leider schaffe ich es nicht die Koordinaten in der actionPerformed()-Methode zu ändern, sodass der grüne Punkt in eine andere Ecke "springt".

Hat jmd ne Idee?

Java:
import java.awt.*;

import javax.swing.*;

import java.awt.event.*;

public class ChoiceRadio extends JApplet implements ActionListener {
	MyCan can = new MyCan();
	
	JRadioButton lo, ro, lu, ru;
	int width = 50;
	int heigth = 50;

	int positionX;
	int positionY;

	

	public int getPositionX() {
		return positionX;
	}

	public void setPositionX(int positionX) {
		this.positionX = positionX;
	}

	public int getPositionY() {
		return positionY;
	}

	public void setPositionY(int positionY) {
		this.positionY = positionY;
	}

	JPanel pane = new JPanel();
	JPanel pan1 = new JPanel();

	public void init() {
		pane.setLayout(new GridLayout(1, 2, 10, 10));
		pan1.setLayout(new GridLayout(4, 2, 20, 20));
		ButtonGroup bg = new ButtonGroup();

		lo = new JRadioButton("links oben", true);
		ro = new JRadioButton("rechts oben", false);
		lu = new JRadioButton("links unten", false);
		ru = new JRadioButton("rechts unten", false);

		bg.add(lo);
		bg.add(ro);
		bg.add(lu);
		bg.add(ru);

		pan1.add(lo);
		pan1.add(ro);
		pan1.add(lu);
		pan1.add(ru);

		lo.addActionListener(this);
		ro.addActionListener(this);
		lu.addActionListener(this);
		ru.addActionListener(this);

		pane.add(pan1);
		pane.add(can);
		setContentPane(pane);
	}

	public class MyCan extends Canvas {
		public void paint(Graphics g) {
			super.paint(g);
			g.setColor(Color.green);
			g.fillOval(getPositionX(), getPositionY(), width, heigth);

		}

	}

	public void actionPerformed(ActionEvent evt) {
		Object source = evt.getSource();
		if (source == ro) {
			setPositionX(50);
			setPositionY(0);

		} else if (source == lo) {
			setPositionX(0);
			setPositionY(0);

		} else if (source == lu) {
			setPositionX(0);
			setPositionY(100);

		} else
			setPositionX(50);
		setPositionY(100);
		repaint();

	}
}
 
Zuletzt bearbeitet:
Was meinst du mit, du schaffst es nicht? Denke bitte immer an eine vollständige Fehlerbeschreibung.
Was passiert stattdessen?
Was hast du schon versucht?
Was genau soll passieren? (schon beantwortet)

Ich denke das Problem liegt darin, dass du beim letzten else die Klammern vergessen hast.
 
Was meinst du mit, du schaffst es nicht? Denke bitte immer an eine vollständige Fehlerbeschreibung.
Was passiert stattdessen?
Was hast du schon versucht?
Was genau soll passieren? (schon beantwortet)

Ich denke das Problem liegt darin, dass du beim letzten else die Klammern vergessen hast.

Es passiert eigentlich nichts. Der grüne Punkte ist zwar da, nimmt aber irgendwelche (denke ich) default-Koordinaten an und ändert seine Position nie, wenn man den RadioButton wechselt.

Versucht habe ich einiges. Z.B. über Graphics g. Ich denke aber über die x und y Variablen ist es am sinnvollsten.
 
Der letzte Teil in deiner actionPerformed
Java:
else
            setPositionX(50);
        setPositionY(100);
        repaint();

Das else bezieht sich nur auf das setPositionX(50);
Daher wir IMMER setPositionY(100) aufgerufen. Du überschreibst da deine alte Position.

So läuft es einwandfrei:
Java:
public void actionPerformed(ActionEvent evt)
	{
		Object source = evt.getSource();
		if (source == ro)
		{
			setPositionX(50);
			setPositionY(0);

		}
		else if (source == lo)
		{
			setPositionX(0);
			setPositionY(0);

		}
		else if (source == lu)
		{
			setPositionX(0);
			setPositionY(100);

		}
		else
		{
			setPositionX(50);
			setPositionY(100);
		}
		can.repaint();
	}
 
Zuletzt bearbeitet:
njans hat gesagt.:
...

So läuft es einwandfrei:
Java:
public void actionPerformed(ActionEvent evt)
	{
		Object source = evt.getSource();
		if (source == ro)
		{
			setPositionX(50);
			setPositionY(0);

		}
		else if (source == lo)
		{
			setPositionX(0);
			setPositionY(0);

		}
		else if (source == lu)
		{
			setPositionX(0);
			setPositionY(100);

		}
		else
		{
			setPositionX(50);
			setPositionY(100);
		}
		can.repaint();
	}
wäre ein switch nicht besser geeignet (Performance) ???
Und ja, ich weiß, dass man einen switch nicht an einem Object anwenden kann,
aber man kann es an einem String ( toString() ) anwenden !!!
 
Dann hättest du das Problem, dass du dein Objekt in einen String umwandeln musst. Von dem String muss noch .equals(Object) aufgerufen werden. Da ist, denke ich mal, eineelse if Reihe besser geeignet 😉
 
Irgendwie muss der switch case die Eingabe mit dem angegebenen "Case String" vergleichen. Ich weiß es nicht aber das wäre die einzige Möglichkeit, die mir einfiele, wie der switch case das bewerkstelligt.
 
Besonders objekt-orientiert ist dein Programm nicht, aber nun ja...

Daher kommen mir switch-Anweisungen etwas suspekt vor und sollten durch polymorphe Aufrufe ersetzt werden. Aber da du eine actionperformed für alle JRadioButtons hast...

Das habe ich zwar nicht gemacht, aber zumindest die Aufrufe durch den Aufruf EINER Methode ersetzt.

Java:
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javafx.scene.control.RadioButton;

import javax.swing.ButtonGroup;
import javax.swing.JApplet;
import javax.swing.JPanel;
import javax.swing.JRadioButton;

public class ChoiceRadio extends JApplet implements ActionListener {
	MyCan can = new MyCan();

	JRadioButton lo, ro, lu, ru;
	int width = 50;
	int heigth = 50;

	int positionX;
	int positionY;

	public int getPositionX() {
		return positionX;
	}

	public void setPositionX(int positionX) {
		this.positionX = positionX;
	}

	public int getPositionY() {
		return positionY;
	}

	public void setPositionY(int positionY) {
		this.positionY = positionY;
	}

	JPanel pane = new JPanel();
	JPanel pan1 = new JPanel();

	public void init() {
		pane.setLayout(new GridLayout(1, 2, 10, 10));
		pan1.setLayout(new GridLayout(4, 2, 20, 20));
		ButtonGroup bg = new ButtonGroup();

		lo = new JRadioButton("links oben", true);
		ro = new JRadioButton("rechts oben", false);
		lu = new JRadioButton("links unten", false);
		ru = new JRadioButton("rechts unten", false);

		bg.add(lo);
		bg.add(ro);
		bg.add(lu);
		bg.add(ru);

		pan1.add(lo);
		pan1.add(ro);
		pan1.add(lu);
		pan1.add(ru);

		lo.addActionListener(this);
		ro.addActionListener(this);
		lu.addActionListener(this);
		ru.addActionListener(this);

		pane.add(pan1);
		pane.add(can);
		setContentPane(pane);
	}

	public class MyCan extends Canvas {
		public void paint(Graphics g) {
			super.paint(g);
			g.setColor(Color.green);
			g.fillOval(getPositionX(), getPositionY(), width, heigth);

		}

		public void change(int x, int y) {
			positionX = x;
			positionY = y;
			repaint();
		}

	}

	public void actionPerformed(ActionEvent evt) {
		JRadioButton source = (JRadioButton) evt.getSource();
		if (source == ro) {
			ChoiceRadio.this.change(50, 0);
		} else if (source == lo) {
			ChoiceRadio.this.change(0, 0);

		} else if (source == lu) {
			ChoiceRadio.this.change(0, 100);

		} else {
			ChoiceRadio.this.change(50, 100);
		}

	}

	private void change(int x, int y) {
		can.change(x, y);
	}
}
 
So, hab es jetzt noch mal geändert und nun kein if oder switch mehr

Java:
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ButtonGroup;
import javax.swing.JApplet;
import javax.swing.JPanel;
import javax.swing.JRadioButton;

public class ChoiceRadio extends JApplet {
	class MyActionListener implements ActionListener {
		private MyCan can;
		private int x;
		private int y;

		public MyActionListener(MyCan can, int x, int y) {
			this.can = can;
			this.x = x;
			this.y = y;
		}

		@Override
		public void actionPerformed(ActionEvent e) {
			can.change(x, y);
		}

	}

	MyCan can = new MyCan();

	JRadioButton lo, ro, lu, ru;
	int width = 50;
	int heigth = 50;

	int positionX;
	int positionY;

	public int getPositionX() {
		return positionX;
	}

	public void setPositionX(int positionX) {
		this.positionX = positionX;
	}

	public int getPositionY() {
		return positionY;
	}

	public void setPositionY(int positionY) {
		this.positionY = positionY;
	}

	JPanel pane = new JPanel();
	JPanel pan1 = new JPanel();

	public void init() {
		pane.setLayout(new GridLayout(1, 2, 10, 10));
		pan1.setLayout(new GridLayout(4, 2, 20, 20));
		ButtonGroup bg = new ButtonGroup();

		lo = new JRadioButton("links oben", true);
		lo.addActionListener(new MyActionListener(can, 0, 0));
		ro = new JRadioButton("rechts oben", false);
		ro.addActionListener(new MyActionListener(can, 50, 0));
		lu = new JRadioButton("links unten", false);
		lu.addActionListener(new MyActionListener(can, 0, 100));
		ru = new JRadioButton("rechts unten", false);
		ru.addActionListener(new MyActionListener(can, 50, 100));

		bg.add(lo);
		bg.add(ro);
		bg.add(lu);
		bg.add(ru);

		pan1.add(lo);
		pan1.add(ro);
		pan1.add(lu);
		pan1.add(ru);

		pane.add(pan1);
		pane.add(can);
		setContentPane(pane);
	}

	public class MyCan extends Canvas {
		public void paint(Graphics g) {
			super.paint(g);
			g.setColor(Color.green);
			g.fillOval(getPositionX(), getPositionY(), width, heigth);

		}

		public void change(int x, int y) {
			positionX = x;
			positionY = y;
			repaint();
		}

	}
}
 

Zurück
Oben