Java Actionlistener tut nicht

plusnoir

Cadet 3rd Year
Registriert
Apr. 2009
Beiträge
36
Hallo,

habe folgendes Problem. Habe den anliegenden Code aus einem Tutorial. Hier soll Animation geübt werden.

Code besteht aus zwei Teilen:

1.
Code:
package star;

import javax.swing.*;
import javax.swing.JFrame;


public class Star extends JFrame {

	public Star() {
		add(new Board());

		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setSize(300, 300);
		setLocationRelativeTo(null);
		setTitle("Star");
		setVisible(true);
		setResizable(true);

	}

	public static void main(String[] args) {

		new Star();
	}

}

2.
Code:
package star;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.Timer;

public class Board extends JPanel implements ActionListener {

	Image Star;
	Timer Timer;
	int x, y;

	public Board() {
		setBackground(Color.BLACK);

		ImageIcon ii = new ImageIcon(this.getClass().getResource("/star.png"));
		Star = ii.getImage();

		setDoubleBuffered(true);

		x = y = 10;

		Timer = new Timer(5, this);
		Timer.start();

	}

	public void paint(Graphics g) {
		super.paint(g);

		Graphics2D g2d = (Graphics2D) g;
		g2d.drawImage(Star, 120, 120, this);
		Toolkit.getDefaultToolkit().sync();
		g.dispose();
	}

	public void actionPerformed(ActionEvent e) {
		x = +1;
		y = +1;

		if (y > 240) {
			x = -45;
			y = -45;

		}
		repaint();
	}

}

Nun zu meinem Problem. Wenn ich alles richtig verstanden habe, erwartet das Programm ein Actionevent um die x,y-Koordinaten zu verändern. Leider passiert nichts wenn ich kompiliere und Tasten drücke. Also welche Art von Event erwartet es? Ist es hier im Code schon endgültig implementiert, oder muss ich den Event noch definieren? Wenn nicht. Welche Taste solls denn sein die das Event auslöst?

Und eine kleine zweite Frage hätt ich auch noch. In der Klasse Board in der paint-Methode steht g.dispose(); . Was bedeutet das?

Wäre euch sehr verbunden wenn ihr mir als Antwort nicht Links zu der unendlich langen Java-API posten würdet.

Ansonsten danke im voraus.
 
Code:
button.addActionListerner(this);

Das muss bei "Board()" rein.
Du brauchst halt einen Button, dessen Namen du oben einfügst im Codebeispiel von mir. Oder irgendeine andere Komponente auf deinem Frame.
 
Hab das jetzt so gemacht funxt aber trotzdem net.

Code:
package star;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.Timer;

public class Board extends JPanel implements ActionListener {

	Image Star;
	Timer Timer;
	int x, y;

	public Board() {
		setBackground(Color.BLACK);
		JButton uno = new JButton();
		add(uno);
		uno.setBounds(new Rectangle(100, 100, 70, 70));
		uno.addActionListener(this);

		ImageIcon ii = new ImageIcon(this.getClass().getResource("/star.png"));
		Star = ii.getImage();

		setDoubleBuffered(true);

		x = y = 10;

		Timer = new Timer(5, this);
		Timer.start();

	}

	public void paint(Graphics g) {
		super.paint(g);

		Graphics2D g2d = (Graphics2D) g;
		g2d.drawImage(Star, 120, 120, this);
		Toolkit.getDefaultToolkit().sync();
		g.dispose();
	}

	public void actionPerformed(ActionEvent e) {
		x = +1;
		y = +1;

		if (y > 240) {
			x = -45;
			y = -45;

		}
		repaint();
	}

}


Oder stimmts net?
 
Implements ActionListener, pfui Code!

Implementiere doch bitte explizit den Listener in einer anonymen Klasse und schmeiß das JPanel implements ActionListener raus.

Code:
        uno.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                myActionPerformed(evt);
            }
        });

Wozu soll eigentlich der Timer gut sein?

Achja... dispose() weist die VM explizit an das Graphics Objekt im Speicher freizugeben, statt auf finalize zu warten.
 
Zuletzt bearbeitet:
Verstehst du überhaupt irgendwas vom Programmieren? Die Methode actionPerformed ändert zwar die Variablen x und y, aber diese werden nirgendwo ausgelesen oder verwendet.
 
Schön dass man auch freundlich antworten kann.

1. ja ich versteh was. Bin aber Anfänger und genau deshalb stell ich auch fragen.

2. und danke ist mir garnet aufgefallen dass die nicht ausgelesen werden.

hat das genie vllt auch lösungsvorschläge?!
 
Du hast das zwar mit Sicherheit sehr viel unfreundlicher verstanden, als ich das gemeint habe (und zwar als sachliche Frage), aber wenn du so fragst: Ja, ich hab Vorschläge.

Du könntest die Zeile
Code:
g2d.drawImage(Star, 120, 120, this);
ändern in
Code:
g2d.drawImage(Star, x, y, this);
Das würde die Grafik dann immer an einer leicht verschobenen Stelle zeichnen. Ich weiß zwar nicht, was du mit dem Programm eigentlich vor hast, aber ich tippe darauf. Und wahrscheinlich hab ich recht, denn wie ich ja nun weiß, bin ich ein Genie :freak:.

(Und außerdem hab ich das Gefühl, dass das eine Hausaufgabe ist im Sinne von "Modifizieren Sie folgendendes Programm derart, dass mit einem Klick auf einen Button die Grafik an anderer Stelle gezeichnet wird")
 
Zuletzt bearbeitet:
Zurück
Oben