Hallo,
ich hab mir ein kleines Programm geschrieben, das mir einen Kreis auf ein JPanel zeichnen soll.
Ich hab mir das dabei so vorgestellt: Sobald ich auf den Button "Kreis" und danach auf den Button "zeigen" klicke erscheint der Kreis.
Das sollte so eigentlich auch alles passen.
Auf einer awt-Oberfläche geht ein so ähnliches Programm mal ohne Probleme. Nur bei meinem Swing-Programm wird der Kries nicht gezeichnet.
Weiter bekomme ich immer eine NullPointerException, wenn ich auf den Button "zeigen" klicke bevor ich auf den Button "Kreis" klicke. Der Grund ist mir klar (der Kries wird erst erstellt wenn ich auf den Button "Kreis" klicke), nur wie umgehe ich das am besten? Ich würde später gerne noch andere Objekte wie z.B ein Rechteck oder ein Dreieck zeichnen können. Deswegen wollte ich den Button drinnen lassen.
Hier mal mein Programm:
ich hab mir ein kleines Programm geschrieben, das mir einen Kreis auf ein JPanel zeichnen soll.
Ich hab mir das dabei so vorgestellt: Sobald ich auf den Button "Kreis" und danach auf den Button "zeigen" klicke erscheint der Kreis.
Das sollte so eigentlich auch alles passen.
Auf einer awt-Oberfläche geht ein so ähnliches Programm mal ohne Probleme. Nur bei meinem Swing-Programm wird der Kries nicht gezeichnet.
Weiter bekomme ich immer eine NullPointerException, wenn ich auf den Button "zeigen" klicke bevor ich auf den Button "Kreis" klicke. Der Grund ist mir klar (der Kries wird erst erstellt wenn ich auf den Button "Kreis" klicke), nur wie umgehe ich das am besten? Ich würde später gerne noch andere Objekte wie z.B ein Rechteck oder ein Dreieck zeichnen können. Deswegen wollte ich den Button drinnen lassen.
Hier mal mein Programm:
Code:
import java.awt.BorderLayout;
import java.awt.Dimension;
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;
import javax.swing.SwingUtilities;
public class GeoForm extends JFrame {
private Kreis kreis;
final private JButton jButton_zeigen = new JButton("Zeigen");
final private JButton jButton_verstecken = new JButton("Verstecken");
final private JButton jButton_exit = new JButton("Exit");
final private JButton jButton_kreis = new JButton("Kreis");
private JPanel jPanel1;
private JPanel jPanel2;
private JPanel jPanel3;
public static void main(final String[] args) {
final Runnable gui = new Runnable() {
public void run() {
new GeoForm(500, 300);
}
};
SwingUtilities.invokeLater(gui);
}
public GeoForm(final int w, final int h) {
setPreferredSize(new Dimension(w, h));
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocation(300, 300);
pack();
gui();
setVisible(true);
}
//Graphische Oberflaeche erstellen
public void gui() {
setLayout(new BorderLayout());
{
jPanel1 = new JPanel() {
@Override
protected void paintComponent(final Graphics g) {
super.paintComponents(g);
//Kreis zeichnen wenn nicht vorhanden und Button gedrueckt
jButton_kreis.addMouseListener(new MouseAdapter() {
public void mouseClicked(final MouseEvent e) {
if (kreis == null) {
kreis = new Kreis(100, 100, 100, 10);
}
kreis.malen(g);
}
});
}
};
jPanel1.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(final MouseEvent e) {
bewegen(e);
}
});
getContentPane().add(jPanel1, BorderLayout.SOUTH);
}
{
jPanel2 = new JPanel(new FlowLayout());
jButton_zeigen.addMouseListener(new MouseAdapter() {
public void mouseClicked(final MouseEvent e) {
zeigen(e);
}
});
jPanel2.add(jButton_zeigen, null);
jButton_verstecken.addMouseListener(new MouseAdapter() {
public void mouseClicked(final MouseEvent e) {
verstecken(e);
}
});
jPanel2.add(jButton_verstecken, null);
jButton_exit.addMouseListener(new MouseAdapter() {
public void mouseClicked(final MouseEvent e) {
exit(e);
}
});
jPanel2.add(jButton_exit, null);
getContentPane().add(jPanel2, BorderLayout.CENTER);
}
{
jPanel3 = new JPanel(new FlowLayout());
jButton_kreis.addMouseListener(new MouseAdapter() {
public void mouseClicked(final MouseEvent e) {
}
});
jPanel3.add(jButton_kreis, null);
getContentPane().add(jPanel3, BorderLayout.NORTH);
}
}
protected void verstecken(final MouseEvent e) {
kreis.verstecken();
}
protected void zeigen(final MouseEvent e) {
kreis.zeigen();
}
protected void bewegen(final MouseEvent e) {
final int x = e.getX();
final int y = e.getY();
final int bewegung = 1;
jPanel1.repaint(kreis.getXPos(), kreis.getYPos(), kreis.getDurchmesser() + bewegung,
kreis.getDurchmesser() + bewegung);
kreis.gehen(x, y);
jPanel1.repaint(kreis.getXPos(), kreis.getYPos(), kreis.getDurchmesser() + bewegung,
kreis.getDurchmesser() + bewegung);
}
protected void exit(final MouseEvent e) {
System.exit(0);
}
}
class Kreis {
private int xPos;
private int yPos;
private int durchmesser;
private int schrittweite;
private boolean show = false;
public Kreis(final int x, final int y, final int d, final int s) {
xPos = x;
yPos = y;
durchmesser = d;
schrittweite = s;
show = true;
}
public void zeigen() {
show = true;
}
public void verstecken() {
show = false;
}
public void malen(final 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 getXPos() {
return xPos;
}
public int getYPos() {
return yPos;
}
public int getDurchmesser() {
return durchmesser;
}
}