JButton - Paint-Methode - Zeichnen

zeugwart

Grünschnabel
Hallo zusammen,

wie kann es anders sein, ich bräuchte mal ein bisschen Hilfe ;-)

Zum Problem:

Ich muss unteranderem ne kleine Gui erschaffen in der ich dynamisch rumzeichnen kann :)

Nun diese habe ich auch, wenn ich auf einen Knopf drücke wird neu gezeichnet(davor alle
Objekte neu berechnet). Danach ist eine Figur im Zweifelsfall um 1 Pixel weiterbewegt.
Diese soll aber bis zum Grund fallen, der is 400 Pixel tief.

Die grosse Frage ist nun, wie stell ich es an, dass ich nicht 400 mal auf den Knopf
drücken muss :confused:

MfG :)
 
benutz doch einfach ne for-Schleife

Java:
for(int i=0; i<400; i++)
{
    System.out.println(i);
}
Liefert als Ausgabe: 0,1,2,3 ....
 
Hi,

schön wärs, aber die Forschleife wird schön ignoriert.

Um es n bisschen konkreter zu bekommen...
Ich habe eine grosse Klasse in der sich folgendes befindet:

PaintInSwing()
- erstellt JFrame
- addet Zeichenkomponente
- addet Kontrollkomponenten

KontrollKomponenten
-addet Knöpfe usw.

Zeichenkomponente ( Innere Klasse)
- Zeichnet alles was in einem aktuellen Behälter liegt

Jetzt ein Auszug aus KontrollKomponenten - die Knöpfe
Java:
        final JButton paintNow = new JButton("Einzelschritt");
        panel.add(paintNow);
        paintNow.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                    //For SChleife bleibt ohne Wirkung
                    paintingComponent.repaint();
            }
        });

        final JButton paintNow2 = new JButton("X Schritte");
        panel.add(paintNow2);
        paintNow2.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                paintNow.doClick(20);
            }
        });
So hab mir nun gedacht, das ich die Einzelschritte irgendwie mit nem 2. Knopf ausführen lassen kann, geht aber nicht - da wird einfach nicht neu gezeichnet.
Obwohl ich sehe, das der Knopf x mal gedrückt wird...
Jetzt versuch ich es irgendwie über SwingWorker... Hab aber bisher noch keine Ahnung von nichts, und muss Morgen fertig sein...
Die Lösung interessiert mich aber Übermorgen auch noch :D

Soweit mal - den Grossteil des Codes hab ich mir irgendwoher geschnickt um zu verstehen :)
Ich beschäftige mich erst seit 2 Tagen mit Swing - man möge mir meine Naivität verzeien ;-)

MfG
 
Hallo,

Könntest du mal den Code zeigen, mit dem die Componente gezeichnet wird?

MFG

zEriX
 
Ok - aber nicht lachen :D

Java:
    class NaivePaintingComponent extends JComponent {
        private Shape shape;

        private Color c;

        private Eimer e = new Eimer();

        private CreateFall fall = new CreateFall();

        private Vector<Figur> fig = (Vector) e.getFiguren();

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g;

            // zeichencode

            g2d.setColor(Color.BLACK);
            g2d.fillRect(0, 0, 250, 400);
            g2d.setColor(Color.WHITE);
            g2d.fillRect(1, 0, 248, 399);
            g2d.setColor(Color.RED);
            g2d.drawLine(1, 80, 248, 80);

            e = fall.fallAndCreate(e);
            fig = (Vector) e.getFiguren();

            if (e.getObjectToMove() != null) {

                Figur f = e.getObjectToMove();

                if (f instanceof Kreis) {
                    Kreis k = (Kreis) f;
                    int x = (int) (k.getPunkt().getX().intValue());
                    int y = (int) (k.getPunkt().getY().intValue());
                    int rad = (int) (k.getRadius().intValue());
                    
                    y = y - rad;
                    x = x - rad;
                    rad = rad * 2;
                    g.fillOval(x, y, rad, rad);

                } else {
                    Polygon p = (Polygon) f;
                    int[] x = new int[p.getPunkte().length];
                    int[] y = new int[p.getPunkte().length];
                    int r = 0;
                    for (Punkt pkt : p.getPunkte()) {
                        // Jede Strecke Zeichnen
                        x[r] = (int) (pkt.getX().intValue());
                        y[r] = (int) (pkt.getY().intValue());
                        r++;
                    }
                    g.fillPolygon(x, y, p.getPunkte().length);
                }

            }

            fig = (Vector) e.getFiguren();

            for (Figur f : fig) {
                // Jede Figur Zeichnen
                if (f instanceof Kreis) {
                    Kreis k = (Kreis) f;
                    int x = (int) (k.getPunkt().getX().intValue());
                    int y = (int) (k.getPunkt().getY().intValue());
                    int rad = (int) (k.getRadius().intValue());
                    
                    y = y - rad;
                    x = x - rad;
                    rad = rad * 2;
                    g.fillOval(x, y, rad, rad);

                } else {
                    Polygon p = (Polygon) f;
                    int[] x = new int[p.getPunkte().length];
                    int[] y = new int[p.getPunkte().length];
                    int r = 0;
                    for (Punkt pkt : p.getPunkte()) {
                        // Jede Strecke Zeichnen
                        x[r] = (int) (pkt.getX().intValue());
                        y[r] = (int) (pkt.getY().intValue());
                        r++;
                    }
                    g.fillPolygon(x, y, p.getPunkte().length);
                }
            }

            // #############################################################

        }

        public void setColor(Color c) {
            this.c = c;
        }

        public void setShape(Shape shape) {
            this.shape = shape;
        }
    }

Gruss,
zeugwart
 
Ok. Ich versuch es dir mal zu erkären. Bei der Figur die du zeichnest, schreibst du keine festen Koordinaten rein, sondern Variablen, die auf einen Wert gestellt sind. Du kannst du dann nachher beliebig verändern (z. b. hochzählen) und deine Figur wird immer an eine neue Stelle gezeichnet.

MFG

zEriX
 
Hi,
naja ich such nur nach ner Möglichkeit die repaint() 1000 mal aufzurufen :)
Wenn ich einen Knopf drücke wird das Ding ja neu erstellt und gemalt
ich will nur nicht so oft den Knopf drücken. Also würde ich gern das Ereignis welches hinter dem Knopf liegt X mal aufrufen, z.B indem ich es in die EreignisQueue einreihe oder ähnliches...
Wie das geht weis ich aber nicht...

mfg
 
Na du könntest du einfach eine for-Schleife nutzen.
In dieser Vorschleife zählst du einfach die Variablen für die Coordinaten hoch und machst ein repaint(). Das müsste ohne Probleme funktionieren.

MFG

zEriX
 
Hi,

wie gesagt Swing interessiert sich irgendwie nicht so richtig für Schleifen...
Hab in meiner Not den nächst bestesten ;) Code aus der Insel geschnickt und den für meine
Zwecke angepasst, was genau da abläuft muss ich mir wohl mal genauer erklären lassen :)

Java:
    class Fall extends SwingWorker<Long, Object> {
        @Override
        public Long doInBackground() {
            while (!stop) {
                paintingComponent.repaint();
            }
            return null;
        }
        @Override
        protected void done() {
        }
    }
Glaub das ich da so ne Art neuen Thread gestartet habe, der irgendwie mit dem Swing
synchronisiert ist :eek: :suspekt:, der kann jetzt plötzlich ständig neu zeichenen.
In der Zeichenkomonente hab' ich noch nen kleinen Bremsblock eingebaut - sonst fällt das
Ganze doch ein bisschen schnell zu Boden :D

CU,
zeugwart
 
Zurück