Variablen zurücksetzen

petterapamm

Aktives Mitglied
Guten Morgen,
Auf folgender Zeichenflaeche lassen sich Objekte zeichnen, mit der Maus markieren und verschieben. Mit der Methode "auswaehlen" wird ein Objekt, das an der Position wo mit der Maus geklickt wurde liegt, ausgewählt, also als "ausgewaehltesObjekt" definiert, und kann nun verschoben werden. Mit dem Klicken auf ein anderes Objekt lässt sich wiederum dieses auswählen und verschieben.
Jedoch ist es nicht möglich, nachdem man einmal ein Objekt ausgewählt hat, gar keines zu selektieren.
Dies sollte doch möglich sein, indem man zum Beispeil die Variabel "ausgewaehltesObjekt" in irgendeiner Weise "zurücksetzt". Und zwar z.B. nachdem die Bedingungen in der "auswaehlen" Methode zum Auswählen, also das dort wo geklickt wurde, ein Objekt liegt, nicht zutreffen - dann sollte ausgewaehltesObjekt "nichts" mehr sein ("zurückgesetzt"). Man klickt also irgendwo - irgendwo wo kein Objekt ist - auf die Zeichenfläche und es wird das Objekt was selektiert war, deselektiert.
Mein Ansatz ist als Kommentar gekennzeichnet.

Der Quellcode der Zeichenfläche:

Java:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.ArrayList;
import java.util.Iterator;
import javax.swing.JPanel;
import java.awt.event.*;

public class Zeichenflaeche1 extends JPanel{

    private int x1, y1, x2, y2, x3, y3, x4, y4;
    private ArrayList<Bestandteil> formen;
    private Bestandteil ausgewaehltesObjekt;
    private int xVerschiebung;
    private int yVerschiebung;
    
    public Zeichenflaeche1(){
        formen = new ArrayList();
       
        addMouseListener(
        new MouseAdapter(){
            public void mousePressed(MouseEvent e){
                x1 = e.getX();
                y1 = e.getY();
                auswaehlen();
            }
            
            public void mouseReleased(MouseEvent e){
                x2 = e.getX();
                y2 = e.getY();
                repaint();
            }
        }
        );
        
        addMouseMotionListener(
        new MouseMotionAdapter(){
            public void mouseDragged(MouseEvent e){
                x3 = e.getX();
                y3 = e.getY();
                verschieben(ausgewaehltesObjekt);
            }
            
            public void mouseMoved(MouseEvent e){
                x4 = e.getX();
                y4 = e.getY();
            }
        }
        );
    }
    
    public Dimension getPreferredSize(){
        
        return new Dimension( 400, 400 );
    }
    
    public int anzahlObjekte(){
        
        return formen.size();
    }
    
    public void paintComponent(Graphics g){
        
        super.paintComponent( g );
        Graphics2D g2d = (Graphics2D)g;
        
        if (anzahlObjekte()>0){
            for (Iterator i = formen.iterator(); i.hasNext();){
                Bestandteil aktuellesTeil = (Bestandteil) i.next();
                if(aktuellesTeil == ausgewaehltesObjekt){
                    g2d.setColor(Color.red);
                }
                else{
                    g2d.setColor(Color.black);
                }
                g2d.draw(aktuellesTeil.gibAktuelleFigur());
            }
        }
    }
    
    public void auswaehlen(){
        if(anzahlObjekte() > 0){
            for (Iterator i = formen.iterator(); i.hasNext();){
                Bestandteil aktuellesTeil = (Bestandteil) i.next();
                if(aktuellesTeil.xPosition < x1 && aktuellesTeil.yPosition < y1 && aktuellesTeil.xPosition+aktuellesTeil.breite > x1 && aktuellesTeil.yPosition+aktuellesTeil.tiefe > y1){ 
                    ausgewaehltesObjekt = aktuellesTeil;
                    xVerschiebung = ausgewaehltesObjekt.xPosition;
                    yVerschiebung = ausgewaehltesObjekt.yPosition;
                }
//                 else{hier müsste ausgewaehltesObjekt zurückgesetzt werden
//                 }
                        
                    
                
            }
        }
    }
    
    public void verschieben(Bestandteil ausgewaehltesObjekt){
        
        if(anzahlObjekte() > 0){
            ausgewaehltesObjekt.xPosition = xVerschiebung +x3-x1;
            ausgewaehltesObjekt.yPosition = yVerschiebung +y3-y1;
            repaint();
        }
    }
    
    public void ObjektHinzufuegen(Bestandteil bestandteil){
        
        formen.add(bestandteil);
        repaint();
    }
    
    public void aktualisiereListe(ArrayList objekte){
        formen = objekte;
        repaint();
    }
    
     
}

Danke für eure Hilfe
MfG

petterapamm
 
Zuletzt bearbeitet:
Java:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.ArrayList;
import java.util.Iterator;
import javax.swing.JPanel;
import java.awt.event.*;

public class Zeichenflaeche1 extends JPanel{

    private int x1, y1, x2, y2, x3, y3, x4, y4;
    private ArrayList<Bestandteil> formen;
    private Bestandteil ausgewaehltesObjekt;
    private Bestandteil behilfsobjekt;
    private int xVerschiebung;
    private int yVerschiebung;
    
    public Zeichenflaeche1(){
        formen = new ArrayList();
       
        addMouseListener(
        new MouseAdapter(){
            public void mousePressed(MouseEvent e){
                x1 = e.getX();
                y1 = e.getY();
                auswaehlen();
            }
            
            public void mouseReleased(MouseEvent e){
                x2 = e.getX();
                y2 = e.getY();
                repaint();
            }
        }
        );
        
        addMouseMotionListener(
        new MouseMotionAdapter(){
            public void mouseDragged(MouseEvent e){
                x3 = e.getX();
                y3 = e.getY();
                verschieben(ausgewaehltesObjekt);
            }
            
            public void mouseMoved(MouseEvent e){
                x4 = e.getX();
                y4 = e.getY();
            }
        }
        );
    }
    
    public Dimension getPreferredSize(){
        
        return new Dimension( 400, 400 );
    }
    
    public int anzahlObjekte(){
        
        return formen.size();
    }
    
    public void paintComponent(Graphics g){
        
        super.paintComponent( g );
        Graphics2D g2d = (Graphics2D)g;
        
        if (anzahlObjekte()>0){
            for (Iterator i = formen.iterator(); i.hasNext();){
                Bestandteil aktuellesTeil = (Bestandteil) i.next();
                if(aktuellesTeil == ausgewaehltesObjekt){
                    g2d.setColor(Color.red);
                }
                else{
                    g2d.setColor(Color.black);
                }
                g2d.draw(aktuellesTeil.gibAktuelleFigur());
            }
        }
    }
    
    public void auswaehlen(){
        if(anzahlObjekte() > 0){
            for (Iterator i = formen.iterator(); i.hasNext();){
                Bestandteil aktuellesTeil = (Bestandteil) i.next();
                if(aktuellesTeil.xPosition < x1 && aktuellesTeil.yPosition < y1 && aktuellesTeil.xPosition+aktuellesTeil.breite > x1 && aktuellesTeil.yPosition+aktuellesTeil.tiefe > y1){ 
                    ausgewaehltesObjekt = aktuellesTeil;
                    xVerschiebung = ausgewaehltesObjekt.xPosition;
                    yVerschiebung = ausgewaehltesObjekt.yPosition;
                }
                else {ausgewaehltesObjekt = null;
                }
                        
                    
                
            }
        }
    }
    
    public void verschieben(Bestandteil ausgewaehltesObjekt){
        
        if(anzahlObjekte() > 0){
            ausgewaehltesObjekt.xPosition = xVerschiebung +x3-x1;
            ausgewaehltesObjekt.yPosition = yVerschiebung +y3-y1;
            repaint();
        }
    }
    
    public void ObjektHinzufuegen(Bestandteil bestandteil){
        
        formen.add(bestandteil);
        repaint();
    }
    
    public void aktualisiereListe(ArrayList objekte){
        formen = objekte;
        repaint();
    }
    
   
    
}

Wenn ich "ausgewaehltesObjekt" - in Zeile 92 - nulle, wirkt sich das folgendermaßen aus:

Wenn ich 2 Objekte zeichne
1. Ist es nur möglich das als zweites gezeichnete auszuwählen. Das zu erst gezeichnete Objekt lässt sich nicht auswählen. Das Klicken auf es bewirkt nichts.
2. Man kann wenn man das Zweite ausgewählt hat, irgendwo auf die Zeichenfläche klicken und das Objekt ist nicht mehr selektiert (deselektieren funktioniert also immerhin schon). Mit erneutem Klicken auf das Objekt wird es wieder ausgewählt.

Wenn man nun ein drittes Objekt erstellt, lässt sich nur noch dieses selektieren und zum Beispiel verschieben. Die anderen beiden kann man nicht mehr auswählen.
 
ja gut , mit nullen machst du die variable komplett null , das heisst da steht nichts mehr drin , ich glaube du willst eher die variable bereinigen , also dass du im prinzip ( zum leichteren denken ) das objekt der klasse form löschst und nicht die ganze formklasse oder ?
 
Die Klasse Bestandteil ist eine abstrakte Superklasse, in der später Methoden und Attribute der Unterklassen generalisiert werden sollen. Diese Unterklassen erzeugen und definieren die verschiedenen, auf der Zeichenfläche darstellbaren Objekte.

Klasse Bestandteil:
Java:
import java.awt.Shape;

public abstract class Bestandteil
{   
    protected int xPosition;
    protected int yPosition;
    protected int breite;
    protected int tiefe;
    protected int orientierung;
    
    public Bestandteil() 
    {        
        xPosition = 80;
        yPosition = 80;
    }
    
     abstract Shape gibAktuelleFigur();
    
}

Beispiel Unterklasse Stuhl:

Java:
import java.awt.Shape;
import java.awt.geom.GeneralPath;
import java.awt.geom.Rectangle2D;
import java.awt.geom.AffineTransform;

public class Stuhl extends Bestandteil
{

    public Stuhl() 
    {
        breite = 45;
        tiefe  = 40;
    }
    
    
    public Shape gibAktuelleFigur() 
    { 

        GeneralPath stuhl = new GeneralPath();
        stuhl.moveTo(0 , 0);
        stuhl.lineTo(breite, 0);
        stuhl.lineTo(breite+(breite/20+1), tiefe);
        stuhl.lineTo(-(breite/20+1), tiefe);
        stuhl.lineTo(0 , 0);

        stuhl.moveTo(0 , (breite/10+1));
        stuhl.lineTo(breite, (breite/10+1));    

        AffineTransform t = new AffineTransform();
        t.translate(xPosition, yPosition);
        Rectangle2D umriss = stuhl.getBounds2D();
        t.rotate(Math.toRadians(orientierung),umriss.getX()+umriss.getWidth()/2,umriss.getY()+umriss.getHeight()/2);
        return  t.createTransformedShape(stuhl);
    }  
    
}
 
Zuletzt bearbeitet:
Setzt nicht das objekt null , sondern versuch mal
Java:
    protected int xPosition;
    protected int yPosition;
    protected int breite;
    protected int tiefe;
    protected int orientierung;

vom jeweiligen objekt zu nullen

hierbei würde sich eine Methode reset() auf der klasse Bestandteil anbieten.

die sähe dann so aus :

Java:
public void reset(){

    this.xPosition = null;
    this.yPosition = null;
    this.breite = null;
    this.tiefe = null;
    this.orientierung = null;

}

( das this nur zur verdeutlichung dass die variablen des objekts genullt werden , müsste auch weggelassen werden können )
 
Zuletzt bearbeitet:
Das wird mit Sicherheit nicht funktionieren:
Java:
protected int xPosition;
und
Java:
this.xPosition = null;
 
danke für den hinweis ^^ die sind ja protected , dann wird daraus nichts.

jo , bin am ende meines wissens , kann dir leider nicht weiter helfen , weiss nix mehr ^^
 
Dann setze sie halt einfach 0 ... wobei wenn du ihm 0 gibst hat es ja einen wert... und wenn du tatsächlich einfach das objekt eliminierst dann haben wir ja den bekannten fehler hmmm... weiss da vllt jmd andres weiter ?
 
Ich habe das Problem gelöst 😉 ... und es war ein logischer Fehler.

Das Nullen war schon der richtig Ansatz (Danke an Nicer und Final_Striker :applaus🙂, da man ja immerhin das zuletzt erzeugte Objekt schon selektieren und deselektieren konnte.

Java:
public void auswaehlen(){
        if(anzahlObjekte() > 0){
            for (Iterator i = formen.iterator(); i.hasNext();){
                Bestandteil aktuellesTeil = (Bestandteil) i.next();
                if(aktuellesTeil.xPosition < x1 && aktuellesTeil.yPosition < y1 && aktuellesTeil.xPosition+aktuellesTeil.breite > x1 && aktuellesTeil.yPosition+aktuellesTeil.tiefe > y1){ 
                    ausgewaehltesObjekt = aktuellesTeil;
                    xVerschiebung = ausgewaehltesObjekt.xPosition;
                    yVerschiebung = ausgewaehltesObjekt.yPosition;
                }
                else {ausgewaehltesObjekt = null;
                }
      
                    
                
            }
        }
    }

Wenn man klickt, läuft die gesamte Schleife einmal durch um zu überprüfen, ob der Klick in dem Bereich des zuerst erzeugten Objektes liegt. Befand sich der Klick nicht in dem Bereich des Objektes, wird ausgewaehltesObjekt genullt. Nun läuft die Schleife ein zweites Mal durch um zu überprüfen, ob der Klick in dem Bereich des als zweites erzeugten Objektes liegt. Befand sich der Klick nicht in dem Bereich dieses Objektes, wird ausgewaehltesObjekt auch genullt. Das heißt, wenn ein Objekt ausgewählt war, wird dieses nun korrekterweise deselektiert.
Klickt man jetzt auf das zuerst erzeugte Objekt, läuft die Schleife durch und setzt, da der Mausklick in dem Bereich des Objekts war, ausgewähltesObjekt = aktuellesTeil. Nun läuft allerdings die Schleife, da sich in der ArrayList ja zwei Objekte befinden, ein weiteres mal durch und setzt nun ausgewaehltesObjekt, da sich der Mausklick nicht in dem Bereich des als zweites erzeugten Objektes befindet, wieder null.
Somit wird, obwohl man auf das zuerst erzeugte Objekt geklickt hat, gar kein Objekt markiert. Das zuletzt erzeugte Objekt lässt sich logischerweise immer markieren, da es der letzte Eintrag in der ArrayList ist und somit bestimmt ob ausgewaehltesObjekt aktuellesTeil oder null ist.

Trotzdem Dank an Nicer, Final_Striker und alle die sich die Zeit genommen haben, sich mit meinem Problem zu beschäftigen.

MfG
petterapamm
 

Neue Themen


Zurück
Oben