Zeichenprogramm-->update() aushebeln

Status
Nicht offen für weitere Antworten.

Paddre

Mitglied
Hi
In der Schule machen wir grad n Zeichenprogramm...es besteht bis dato nur aus Rechtecken und Kreisen und Linien die wir zeichnen können...das Problem ist, dass sobald man entweder ein menü verlässt oder eine ComboBox öffnet und wieder schließt (um das Zeichentool zu ändern) das Bild gelöscht wird...so kann man kein komplettes Bild aus Kreisen und Rechtecken zusammen machen.

Laut unserem tutorial sollten folgende Zeilen das Problem lösen:
Code:
    public void update(Graphics g)
    {
        paint(g);
    }
indem die interne "update()" einfach überschrieben wird...nützt aber nix (zumindest verhindert es nicht das löschen der Bilder :-(

könnt ihr mir sagen warum oder braucht ihr da groß Code zu? (um nicht den ganzen Thread zu füllen ;) )

Sagt mir einfach was ihr braucht ^^[/code]
 

Paddre

Mitglied
habs ma auf das "meiner Meinung nach) nötigste beschränkt:
Code:
public class Frame1 extends JFrame {
    Frame2 jFrame2 = new Frame2();
    JPanel contentPane;
    JPanel jPanel1 = new JPanel();
    int xanf, yanf, xalt, yalt;
    Color zeichenfarbe;
    Stroke nStroke;
    JMenuBar jMenuBar1 = new JMenuBar();
    JMenu jMenu1 = new JMenu();
    JMenuItem jMenuItem1 = new JMenuItem();
    JPanel jPanel2 = new JPanel();
    JComboBox jComboBox1 = new JComboBox();
    XYLayout xYLayout1 = new XYLayout();
    JLabel jLabel1 = new JLabel();
    JSlider jSlider1 = new JSlider();
    JLabel jLabel2 = new JLabel();
    JButton jButton1 = new JButton();
    public Frame1() {

        try {
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            jbInit();
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }

    /**
     * Initialisierung der Komponenten.
     *
     * @throws java.lang.Exception
     */
    private void jbInit() throws Exception {
        contentPane = (JPanel) getContentPane();
        contentPane.setLayout(null);
        this.setJMenuBar(jMenuBar1);
        setSize(new Dimension(600, 500));
        setTitle("Frame-Titel");
        jPanel1.setBackground(Color.white);
        jPanel1.setBounds(new Rectangle(4, 56, 480, 439));
        jPanel1.addMouseListener(new Frame1_jPanel1_mouseAdapter(this));
        jPanel1.addMouseMotionListener(new Frame1_jPanel1_mouseMotionAdapter(this));
        jMenu1.setText("File");
        jMenuItem1.setText("Clear");
        jMenuItem1.addActionListener(new Frame1_jMenuItem1_actionAdapter(this));
        jPanel2.setBounds(new Rectangle(486, 0, 114, 501));
        jPanel2.setLayout(xYLayout1);
        jComboBox1.addItem("Line");
        jComboBox1.addItem("Rectangle");
        jComboBox1.addItem("Oval");
        jComboBox1.addItem("Fan");
        jLabel1.setText("Tools:");
        jSlider1.setValue(1);
        jSlider1.setMinimum(1);
        jSlider1.setMaximum(10);
        jSlider1.setPaintLabels(true);
        jSlider1.setPaintTicks(true);
        jSlider1.addAncestorListener(new Frame1_jSlider1_ancestorAdapter(this));
        jLabel2.setToolTipText("");
        jLabel2.setText("Stroke:");
        jButton1.setText("Change Line Color");
        jButton1.addActionListener(new Frame1_jButton1_actionAdapter(this));
        jButton1.addActionListener(new Frame1_jButton1_actionAdapter(this));
        jMenuBar1.add(jMenu1);
        jMenu1.add(jMenuItem1);
        contentPane.add(jPanel1, null);
        contentPane.add(jPanel2);
        jPanel2.add(jComboBox1, new XYConstraints(2, 58, 102, 19));
        jPanel2.add(jLabel1, new XYConstraints(2, 40, 100, 14));
        jPanel2.add(jSlider1, new XYConstraints( -4, 116, 118, -1));
        jPanel2.add(jLabel2, new XYConstraints(6, 100, 100, 12));
        jPanel2.add(jButton1, new XYConstraints( -10, 152, 127, -1));
        nStroke = new BasicStroke(5);
    }

    public void jPanel1_mouseDragged(MouseEvent e) {
      nStroke = new BasicStroke(jSlider1.getValue());
      Graphics2D g = (Graphics2D) jPanel1.getGraphics();
      g.setColor(zeichenfarbe);
      g.setStroke(nStroke);
      if (jComboBox1.getSelectedIndex() == 0) {
        g.drawLine(xanf, yanf, e.getX(), e.getY());
        xanf = e.getX();
        yanf = e.getY();
      }

      if (jComboBox1.getSelectedIndex() == 1 || jComboBox1.getSelectedIndex() == 2) {
        g.setXORMode(Color.white);

        if (xanf - xalt < 0 && yanf - yalt < 0) { //vorheriges löschen
          if (jComboBox1.getSelectedIndex() == 1) {g.drawRect(xanf, yanf, xalt - xanf, yalt - yanf);}
          if (jComboBox1.getSelectedIndex() == 2) {g.drawOval(xanf, yanf, xalt - xanf, yalt - yanf);}
        }
        if (xanf - xalt > 0 && yanf - yalt < 0) {
          if (jComboBox1.getSelectedIndex() == 1) {g.drawRect(xalt, yanf, xanf - xalt, yalt - yanf);}
          if (jComboBox1.getSelectedIndex() == 2) {g.drawOval(xalt, yanf, xanf - xalt, yalt - yanf);}
        }
        if (xanf - xalt < 0 && yanf - yalt > 0) {
          if (jComboBox1.getSelectedIndex() == 1) {g.drawRect(xanf, yalt, xalt - xanf, yanf - yalt);}
          if (jComboBox1.getSelectedIndex() == 2) {g.drawOval(xanf, yalt, xalt - xanf, yanf - yalt);}
        }
        if (xanf - xalt > 0 && yanf - yalt > 0) {
          if (jComboBox1.getSelectedIndex() == 1) {g.drawRect(xalt, yalt, xanf - xalt, yanf - yalt);}
          if (jComboBox1.getSelectedIndex() == 2) {g.drawOval(xalt, yalt, xanf - xalt, yanf - yalt);}
        }

        xanf = e.getX();
        yanf = e.getY();

        if (xanf - xalt < 0 && yanf - yalt < 0) { //aktuelles zeigen
          if (jComboBox1.getSelectedIndex() == 1) {g.drawRect(xanf, yanf, xalt - xanf, yalt - yanf);}
          if (jComboBox1.getSelectedIndex() == 2) {g.drawOval(xanf, yanf, xalt - xanf, yalt - yanf);}
        }
        if (xanf - xalt > 0 && yanf - yalt < 0) {
          if (jComboBox1.getSelectedIndex() == 1) {g.drawRect(xalt, yanf, xanf - xalt, yalt - yanf);}
          if (jComboBox1.getSelectedIndex() == 2) {g.drawOval(xalt, yanf, xanf - xalt, yalt - yanf);}
        }
        if (xanf - xalt < 0 && yanf - yalt > 0) {
          if (jComboBox1.getSelectedIndex() == 1) {g.drawRect(xanf, yalt, xalt - xanf, yanf - yalt);}
          if (jComboBox1.getSelectedIndex() == 2) {g.drawOval(xanf, yalt, xalt - xanf, yanf - yalt);}
        }
        if (xanf - xalt > 0 && yanf - yalt > 0) {
          if (jComboBox1.getSelectedIndex() == 1) {g.drawRect(xalt, yalt, xanf - xalt, yanf - yalt);}
          if (jComboBox1.getSelectedIndex() == 2) {g.drawOval(xalt, yalt, xanf - xalt, yanf - yalt);}
        }


        if (jComboBox1.getSelectedIndex() == 3) {
          g.setXORMode(Color.white);
          g.drawLine(xanf, yanf, e.getX(), e.getY());
        }

      }
    }


    public void jPanel1_mousePressed(MouseEvent e) {
        xanf = e.getX();
        yanf = e.getY();
        xalt = xanf;
        yalt = yanf;
    }

    public void jPanel1_mouseReleased(MouseEvent e) {
      Graphics2D g = (Graphics2D) jPanel1.getGraphics();
      g.setPaintMode();
      g.setStroke(nStroke);
      g.setColor(zeichenfarbe);
      if (jComboBox1.getSelectedIndex() == 1 || jComboBox1.getSelectedIndex() == 2) {

        xanf = e.getX();
        yanf = e.getY();

        if (xanf - xalt < 0 && yanf - yalt < 0) { //endgültiges zeihnen
          if (jComboBox1.getSelectedIndex() == 1) {g.drawRect(xanf, yanf, xalt - xanf, yalt - yanf);}
          if (jComboBox1.getSelectedIndex() == 2) {g.drawOval(xanf, yanf, xalt - xanf, yalt - yanf);}
        }
        if (xanf - xalt > 0 && yanf - yalt < 0) {
          if (jComboBox1.getSelectedIndex() == 1) {g.drawRect(xalt, yanf, xanf - xalt, yalt - yanf);}
          if (jComboBox1.getSelectedIndex() == 2) {g.drawOval(xalt, yanf, xanf - xalt, yalt - yanf);}
        }
        if (xanf - xalt < 0 && yanf - yalt > 0) {
          if (jComboBox1.getSelectedIndex() == 1) {g.drawRect(xanf, yalt, xalt - xanf, yanf - yalt);}
          if (jComboBox1.getSelectedIndex() == 2) {g.drawOval(xanf, yalt, xalt - xanf, yanf - yalt);}
        }
        if (xanf - xalt > 0 && yanf - yalt > 0) {
          if (jComboBox1.getSelectedIndex() == 1) {g.drawRect(xalt, yalt, xanf - xalt, yanf - yalt);}
          if (jComboBox1.getSelectedIndex() == 2) {g.drawOval(xalt, yalt, xanf - xalt, yanf - yalt);}
        }


      }
    }

    public void update(Graphics g)
    {
        super.paint(g);
    }

ich weiß dass da EINIGES verbesserungswürdig is...aber darum gehts mir grad nich daher spamt mich bitte nich mit irgendsonem Java-Pro-Shit zu danke ;)
 

Marco13

Top Contributor
Bei solchen Fragen neige ich dazu, mit der Suchfunktion des Browsers nach "getGraphics" zu suchen. Die Antwort erübrigt sich dann meistens, bzw. reduziert sich darauf, dem Fragesteller die Empfehlung zu geben, mal mit der Suchfunktion des Forums nach "getGraphics" zu suchen....
 

Paddre

Mitglied
joa wenn ich nich weiß worans liegt weiß ich auch nich wonach ich suchen soll...könnt ja auch sein dass da einfach n Fehler im Code is...

aber gut ich mach mich denn ma auf die suche (hab halt gehofft dass mir leute helfen die das problem schonmal gehabt/gelöst haben und mir direkt sagen können worans liegt)
 

Quaxli

Top Contributor
Eine Lösung wäre folgende:
- Leg' Dir ein BufferedImage in der gleichen Größe, wie die Zeichenfläche an
- in der paint-Methode Deines Panels wird nur das Image gezeichnet
- alle Zeichenvorgänge werden direkt in das Image gemalt, dazu mußt Du Dir vorher
mit getGraphics() das Graphics-Object des Image abholen.

Somit malst Du Deine Kästchen und Kreise direkt in Dein Image, wo sie von den
Zeichenvorgängen der GUI außen rum unberührt bleiben und wo Dir später auch mal das abspeichern erleichterst
 

Drake

Bekanntes Mitglied
Hallo

Schau dir WIRKLICH das erwähnte Tutorial an. Danch entscheidest du dich getGraphics so schnell nicht wieder zu benutzen, ausser du weißt ganz genau welchen Effekt es (nicht) hat.

Nun legst du eine neue Klasse an welche von JPanel erbt und in der du deine Parameter zum Zeichnen setzen kannst.
Platziere ein Objekt dieser da wo du es haben möchtest.
In den JComboBoxen setzt du diese dann und lässt deine erstelle Klasse repainten.

Alternativ würde es auch mit dem vorgeschlagen BufferedImage funktionieren.

mfg
Drake
 

Paddre

Mitglied
ok habs durchgearbeitet und lief alles und so...weß nur nicht so recht das auf meinen code anzupassen...

also ich will schon weg von "getGraphics" (weil alle sagen wie scheiße das is) aber es wäre nett wenn ihr mir hilfe geben könntet wie ich am besten anfange um mich davon zu lösen, ohne den ganzen code komplett umzustrukturieren

der Wille is da...aber das ich hab echt keine Ahnung wie ich da rangehn sollte... (hab das ganze system noch nicht so GANZ raus ;) )
 

Marco13

Top Contributor
Beispiele für Malprogramme finden sich hier im Forum eigentlich schon eigentlich etliche, aber ... eine kurze Antwort ("kurz" wegen der fortgeschrittenen Uhrzeit):

Im Moment malst du deine Objekte direkt in der mousePressed-(etc.)-Methode. Sie müssen aber alle immer in der paintComponent gemalt werden. D.h. dass du (ganz lapidar gesagt) überall da, wo du
Code:
g.drawRect(xalt, yalt, xanf - xalt, yanf - yalt)
aufrufst, das Rechteck nicht direkt zeichnen darfst, sondern die Koordinate (xalt, yanf-yalt...) in einem Reckeck-Objekt speichern mußt. (Evtl. könntest du direkt die Klasse "Rectangle" verwenden, andernfalls kannst du eine eigene Rechteck-Klasse schreiben - das ganze könnte (sollte!?) dann noch schön Objektorientiert sein, so dass z.B. Rechteck und Oval von einer gemeinamen, abstrakten Oberklasse "ZeichenbaresObjekt" erben... aber das nur nebenbei...). In der mouseDragged wird also bei jeder Bewegung das "akutelle" Rechteck verändert (mit den aktuellen Koordinaten gefüllt), z.B. mit sowas wie
Code:
//g.drawRect(xalt, yalt, xanf - xalt, yanf - yalt) // WEG
curentRectangle.setCoordinates(xalt, yalt, xanf - xalt, yanf - yalt)
In der mouseReleased-Methode wird das "aktuelle" Rechteck nochmal mit den aktuellen Koordinaten gefüllt, und dann in eine Liste eingefügt, die alle fertigen Rechtecke enthält. In der paintComponent-Methode mußt du dann nur durch diese Liste mit allen Rechtecken gehen, und sie nacheinander zeichnen. DORT rufst du dann also sowas auf wie
Code:
for (alle Rechtecke r)
{
    g.drawRect(r.x, r.y, r.w, r.h);
}
BTW: Viele der if-Abfragen könntest du dir sparen, wenn du die Breite/Höhe des objektes mit
int w = Math.abs(xanf - xalt);
int h = Math.abs(yanf - yalt);
ausrechnen würdest.
 

Paddre

Mitglied
wir ham heut in info angefangen das auszuarbeiten... auch mit "paintComponent" und so...ma sehn wies hinhaut hab nich sehr viel gepeilt...trotzdem danke
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben