Hallo, ich habe folgendes Problem: Möchte zeitgesteuert (über einen Timer) einen Kreis zeichnen lassen, der sich in der Größe verändert (die Größenveränderung ist im untenstehenden Listing noch nicht drin, in der Methode "zeichneKreis()" sind erstmal feste Werte drin, aber das ist erstmal egal - nicht das Problem.)
Die Lösungsidee war: Von "...main..." aus wird die Klasse GrafikSpielerei aufgerufen. Sie ist von JFrame abgeletet und enthält auch den Timer. Sie ruft die Methode "zeichneKreis()" in der Klasse "Kreis" auf, die von JPanel abgeleitet ist. Wie gesagt, es ist ohnehin noch nicht fertig. Mein Problem ist, dass schon die Klasse "GrafikSpielerei" aus "main" offenbar nicht aufgerufen wird, jedenfalls kommt eine Fehlermeldung (JavaException usw.) Debuggen hat mir auch nichts gebracht. Das zweite Problem ist, dass mir nicht klar ist, an welcher Stelle genau ich den timer aufrufen muss ("timer1.start();").
Ich mach wahrscheinlich einige dicke Denkfehler, aber ich seh gerade den Wald vor Bäumen nicht
Wer kann mir ein wenig auf die Sprünge helfen?
Vielen Dank, Olaf
-------------------------------------------------------------------------------------------------
package de.grafikspielerei;
public class GrafikMain{
public static void main(String[] args) {
new GrafikSpielerei("Animierter Kreis");
}
}
package de.grafikspielerei;
import javax.swing.JFrame;
import javax.swing.Timer;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class GrafikSpielerei extends JFrame {
class TimerListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
kreisZeichnen();
}
}
private Timer timer1;
private Kreis meinkreis;
//Konstruktor
public GrafikSpielerei(String titel) {
super(titel);
setSize(400,400);
add(meinkreis);
timer1 = new Timer(2000, new TimerListener());
//timer1.start();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
private void kreisZeichnen() {
meinkreis.zeichneKreis(100,100,10,10);
}
}
package de.grafikspielerei;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.awt.Color;
import javax.swing.JPanel;
import javax.swing.border.BevelBorder;
public class Kreis extends JPanel {
private BufferedImage bild;
private Color farbe;
public Kreis() {
setSize(400,400);
setBorder(new BevelBorder(BevelBorder.LOWERED));
bild = new BufferedImage(getWidth(), getHeight(),BufferedImage.TYPE_INT_RGB)
Graphics g = bild.getGraphics();
g.setColor(Color.WHITE);
g.fillRect(0, 0, getWidth(),getHeight());
g.dispose();
farbe = Color.BLACK;
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(bild, 0, 0, this);
}
public void zeichneKreis(int x1, int y1, int breite, int hoehe) {
Graphics g = bild.getGraphics();
g.setColor(farbe);
g.drawOval(x1, y1, breite, hoehe);
//g.drawOval(mittelpunktWidth-x1, mittelpunktHeigth-y1, x1*2, y1*2);
}
}
Die Lösungsidee war: Von "...main..." aus wird die Klasse GrafikSpielerei aufgerufen. Sie ist von JFrame abgeletet und enthält auch den Timer. Sie ruft die Methode "zeichneKreis()" in der Klasse "Kreis" auf, die von JPanel abgeleitet ist. Wie gesagt, es ist ohnehin noch nicht fertig. Mein Problem ist, dass schon die Klasse "GrafikSpielerei" aus "main" offenbar nicht aufgerufen wird, jedenfalls kommt eine Fehlermeldung (JavaException usw.) Debuggen hat mir auch nichts gebracht. Das zweite Problem ist, dass mir nicht klar ist, an welcher Stelle genau ich den timer aufrufen muss ("timer1.start();").
Ich mach wahrscheinlich einige dicke Denkfehler, aber ich seh gerade den Wald vor Bäumen nicht
Wer kann mir ein wenig auf die Sprünge helfen?
Vielen Dank, Olaf
-------------------------------------------------------------------------------------------------
package de.grafikspielerei;
public class GrafikMain{
public static void main(String[] args) {
new GrafikSpielerei("Animierter Kreis");
}
}
package de.grafikspielerei;
import javax.swing.JFrame;
import javax.swing.Timer;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class GrafikSpielerei extends JFrame {
class TimerListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
kreisZeichnen();
}
}
private Timer timer1;
private Kreis meinkreis;
//Konstruktor
public GrafikSpielerei(String titel) {
super(titel);
setSize(400,400);
add(meinkreis);
timer1 = new Timer(2000, new TimerListener());
//timer1.start();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
private void kreisZeichnen() {
meinkreis.zeichneKreis(100,100,10,10);
}
}
package de.grafikspielerei;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.awt.Color;
import javax.swing.JPanel;
import javax.swing.border.BevelBorder;
public class Kreis extends JPanel {
private BufferedImage bild;
private Color farbe;
public Kreis() {
setSize(400,400);
setBorder(new BevelBorder(BevelBorder.LOWERED));
bild = new BufferedImage(getWidth(), getHeight(),BufferedImage.TYPE_INT_RGB)
Graphics g = bild.getGraphics();
g.setColor(Color.WHITE);
g.fillRect(0, 0, getWidth(),getHeight());
g.dispose();
farbe = Color.BLACK;
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(bild, 0, 0, this);
}
public void zeichneKreis(int x1, int y1, int breite, int hoehe) {
Graphics g = bild.getGraphics();
g.setColor(farbe);
g.drawOval(x1, y1, breite, hoehe);
//g.drawOval(mittelpunktWidth-x1, mittelpunktHeigth-y1, x1*2, y1*2);
}
}
Comment