paint verwenden

  • Themenstarter Themenstarter hermie
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
H

hermie

Gast
Hallo,

ich möchte gerne drei verschiedene geometrische Formen zeichnen lassen die ich dann immer wieder verwenden kann. Ich würde gerne für jede Figur eine Klasse schreiben. über das objekt der Klasse soll zb die Groesse der geometrischen figur verändert werden. Ich weiss nicht wie ich das mit der methode paint machen kann da ja nur Graphics als Parameter übergeben werden kann.
 
In "paintComponent" malen wir einfach nur die Figur, ohne uns um die Grösse zu kümmern.
Wenn wir die Grösse der Figur ändern, dann rufen wir einfach repaint auf und
"paintComponent" malt dann automatisch die Figur neu (mit der neuen Grösse):
Code:
/*
 * DrawShape.java
 */
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class DrawShape extends JFrame {
    private JPanel panel;
    private JToolBar toolbar;
    private JTextField sizeField;
    private Circle circle;
    private int SW = 14;//stroke width (Strichdicke)
    public DrawShape() {
        super("DrawShape");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(400, 300);
        setLocationRelativeTo(null);
        circle = new Circle(50, 50, 90);
        panel = new JPanel() {
            private Stroke stroke = new BasicStroke(SW);
            @Override
            protected void paintComponent(final Graphics g) {
                super.paintComponent(g);
                ((Graphics2D)g).setStroke(stroke);
                g.setColor(Color.RED);
                circle.draw(g);
            }
        };
        getContentPane().add(panel);
        toolbar = new JToolBar();
        sizeField = new JTextField(String.valueOf(circle.getDiameter()));
        sizeField.selectAll();
        toolbar.add(new JLabel("Type size and press Enter: "));
        toolbar.add(sizeField);
        add(toolbar, BorderLayout.NORTH);
        sizeField.addActionListener(new ActionListener() {
            public void actionPerformed(final ActionEvent e) {
                int d = Integer.parseInt(sizeField.getText());
                if(d < SW){
                    d = SW;
                    sizeField.setText(String.valueOf(d));
                }
                /*
                 Die multi-arg Version von repaint erlaubt uns, das Cliprechteck
                 der Komponente zu schrumpfen (den Bereich des Bildschirmes,
                 der durch den Malvorgang beeinflusst wird), damit der Malvorgang
                 leistungsfähiger werden kann. Wir verwenden diese Technik, um zu
                 vermeiden, Bildabschnitte neu zu malen, die nicht
                 geändert haben. Die keine-arg Version dieser Methode malt immer
                 die gesamt Fläche der Komponente neu.

                 Wenn wir das Cliprechteck schrumpfen, rufen wir repaint nicht einmal,
                 sondern zweimal auf. Der erste Aufruf malt den Bereich der Komponente neu,
                 in dem die Figur vorher war (das ererbte Verhalten ist,
                 den Bereich mit der gegenwärtigen Hintergrundfarbe zu füllen.).
                 Der zweite Aufruf malt den Bereich der Komponente neu, in dem die
                 Figur zur Zeit ist.

                 Wir können repaint innerhalb des gleichen Eventhandlers mehrfach aufrufen,
                 aber Swing nimmt diese Informationen und malt die Komponente in
                 einem einzigen Vorgang neu.
                 */
                panel.repaint(circle.getX() - SW/2, circle.getY() - SW/2, circle.getDiameter() + SW,
                        circle.getDiameter() + SW);
                circle.setDiameter(d);
                panel.repaint(circle.getX() - SW/2, circle.getY() - SW/2, circle.getDiameter() + SW,
                        circle.getDiameter() + SW);
                sizeField.selectAll();
            }
        });
    }
    public static void main(final String[] args) {
        Runnable gui = new Runnable() {
            public void run() {
                new DrawShape().setVisible(true);
            }
        };
        //GUI must start on EventDispatchThread:
        SwingUtilities.invokeLater(gui);
    }
}
class Circle {
    private int x;
    private int y;
    private int diameter;
    public Circle(final int x, final int y, final int diameter) {
        this.x = x;
        this.y = y;
        this.diameter = diameter;
    }
    public void draw(final Graphics g) {
        g.drawOval(x, y, diameter, diameter);
    }
    public int getDiameter() {
        return diameter;
    }
    public void setDiameter(int durchmesser) {
        this.diameter = durchmesser;
    }
    public int getX() {
        return x;
    }
    public void setX(int x) {
        this.x = x;
    }
    public int getY() {
        return y;
    }
    public void setY(int y) {
        this.y = y;
    }
}
 
Vielen Dank erstmal für die Antwort!!
Ich wollte eigentlich einen Kreis ein Dreieck und ein Rechteck erstellen.
Es sollen in einer Zeile jeweils zehn dieser geometrischen Figuren stehen wobei die Reihenfolge zufällig gewählt wird.
nachdem 10 mal die 1 gedrückt wurde soll die nächste zeile drunter erstellt werden. usw...
 
...wobei tiefgründige Informationen über Ziel, Zweck und
Funktionalitäten des Produktes sicher hilfreich wären,
denn eine oberflächliche Beschreibung, wie du sie vorschlägst,
führt wohl immer zu Missverständnissen :wink:
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben