Hallo,
ich hab zwei kleine Probleme mit meinem Programm:
Ich möchte einen Kreis auf ein JPanel zeichnen und diesen immer in Richtung des Mauszeigers verschieben sobald man mit der Maus klickt. Das geht auch, das Problem ist nur, dass mein JPanel nicht repaintet wird. Die Methoden dafür hab ich implementiert, trotzdem geht es nicht.
Weiter möchte ich den Kreis ein- bzw. ausblenden sobald ich den dafür vorgesehen JButton drücke. Wenn ich diese jedoch betätige bekomme ich immer einen NullPointer. Bei diesem Vorgang wird eigentlich nur der Wahrheitswert show auf false bzw. true gesetzt
Der ungefähr gleiche Code funktioniert wenn ich nur eine Klasse hab, die abstrakte und vererbte Klassen brauche ich aber, da ich später neben Kreisen gerne auch noch andere geometrische Formen erstellen möchte.
Könnte sich jemand den Code durchschauen und mir sagen was die Probleme verursacht? Ich kann in meinem Programm die Fehler einfach nicht erkennen.
Meine Main-Klasse:
Die abstrakte Klasse:
Der Kreis:
ich hab zwei kleine Probleme mit meinem Programm:
Ich möchte einen Kreis auf ein JPanel zeichnen und diesen immer in Richtung des Mauszeigers verschieben sobald man mit der Maus klickt. Das geht auch, das Problem ist nur, dass mein JPanel nicht repaintet wird. Die Methoden dafür hab ich implementiert, trotzdem geht es nicht.
Weiter möchte ich den Kreis ein- bzw. ausblenden sobald ich den dafür vorgesehen JButton drücke. Wenn ich diese jedoch betätige bekomme ich immer einen NullPointer. Bei diesem Vorgang wird eigentlich nur der Wahrheitswert show auf false bzw. true gesetzt
Der ungefähr gleiche Code funktioniert wenn ich nur eine Klasse hab, die abstrakte und vererbte Klassen brauche ich aber, da ich später neben Kreisen gerne auch noch andere geometrische Formen erstellen möchte.
Könnte sich jemand den Code durchschauen und mir sagen was die Probleme verursacht? Ich kann in meinem Programm die Fehler einfach nicht erkennen.
Meine Main-Klasse:
Code:
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class myGF extends JFrame {
private GeometrieForm gf;
private Kreis kreis;
JPanel panel;
/**
* Launch the application
* @param args
*/
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
myGF frame = new myGF();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame
*/
public myGF() {
super();
setBounds(100, 100, 500, 375);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
try {
initGUI();
} catch (Throwable e) {
e.printStackTrace();
}
//
}
private void initGUI() throws Exception {
System.currentTimeMillis();
setTitle("Geometrie Formen");
panel = new JPanel(){
public void paintComponent(Graphics g) {
paintComponents(g);
if (kreis == null) {
kreis = new Kreis(100, 100, 100, 10);
}
kreis.malen(g);
}
};
panel.addMouseListener(new MouseAdapter() {
public void mouseClicked(final MouseEvent e) {
bewegen(e);
}
});
panel.setLayout(new FlowLayout());
getContentPane().add(panel, BorderLayout.CENTER);
final JButton button_zeigen = new JButton();
button_zeigen.addMouseListener(new MouseAdapter() {
public void mouseClicked(final MouseEvent e) {
gf.zeigen();
}
});
button_zeigen.setText("zeigen");
panel.add(button_zeigen);
final JButton button_verstecken = new JButton();
button_verstecken.addMouseListener(new MouseAdapter() {
public void mouseClicked(final MouseEvent e) {
gf.verstecken();
}
});
button_verstecken.setText("verstecken");
panel.add(button_verstecken);
}
protected void bewegen(MouseEvent e) {
int x = e.getX();
int y = e.getY();
int bewegung = 1;
panel.repaint(kreis.getXPos(), kreis.getYPos(), kreis.getDurchmesser() + bewegung,
kreis.getDurchmesser() + bewegung);
kreis.gehen(x, y);
panel.repaint(kreis.getXPos(), kreis.getYPos(), kreis.getDurchmesser() + bewegung,
kreis.getDurchmesser() + bewegung);
}
}
Die abstrakte Klasse:
Code:
import java.awt.Graphics;
public abstract class GeometrieForm {
protected int xPos;
protected int yPos;
protected int schrittweite;
protected boolean show = false;
protected void zeigen() {
show = true;
}
protected void verstecken() {
show = false;
}
protected abstract void malen(Graphics g);
protected int getXPos() {
return xPos;
}
protected int getYPos() {
return yPos;
}
}
Der Kreis:
Code:
import java.awt.Graphics;
import java.awt.event.MouseEvent;
public class Kreis extends GeometrieForm {
private int durchmesser;
public Kreis(final int x, final int y, final int d, final int s) {
xPos = x;
yPos = y;
durchmesser = d;
schrittweite = s;
show = true;
}
@Override
protected void malen(Graphics g) {
if (show) {
g.drawOval(xPos, yPos, durchmesser, durchmesser);
}
}
public void gehen(final int x, final int y) {
if (xPos < x) {
xPos = xPos + schrittweite;
}
if (xPos > x) {
xPos = xPos - schrittweite;
}
if (yPos < y) {
yPos = yPos + schrittweite;
}
if (yPos > y) {
yPos = yPos - schrittweite;
}
}
public int getDurchmesser() {
return durchmesser;
}
}