boolean stellt sich auf true

hallo
Ich habe ein Programm geschrieben, dass ein Koordinatensystem anzeigt( Aktueller Stand siehe Bild).problembild.png

Jetzt Möchte ich Programmieren, dass man in diesem System linien malen kann. Das Problem ist, dass der beginn der Linie immer bei 0,0 liegt.
Ich konnte das Problem darauf eingrenzen, dass die Variabele ready sich immer auf true stellt. Ich habe auch schon per steuerung f im Programm nach irgendwelchen zeilen gesucht die so nicht sein sollten und das ganze auf true stellen konnte aber nichts finden.
Hier die beiden klassen die sehr wahrscheinlich das Problem darstellen:
Code:
public class Draw extends JLabel{

    
    static boolean pressed = false;
    static boolean paused = false;
    static int x ,y;
    static int pX,pY,ptX,ptY;
    static boolean ready = false;
    static int color;//1 = red; 2 = green; 3 = blue
    
    int[] paintX = new int[200];
    int[] paintY = new int[200];
    int[] paintX2 = new int[200];
    int[] paintY2 = new int[200];
    int[] colors = new int[200];
    
    static boolean found;
    
protected void paintComponent(Graphics g) {
        
        super.paintComponent(g);

        //background
        g.setColor(Color.LIGHT_GRAY);
        g.fillRect(0, 0, 1000, 1000);
        
        //field lines
        
        g.setColor(Color.black);
        
        for(int i = 0; i<9;i++) {
            
            g.drawLine(200 + i * 200,0,200+i * 200,1000);
            
            g.drawLine(0, 200 + i * 200, 1000, 200 + i * 200);
        }
        
        //Say cordi
        if(pressed && paused == false) {
        if(y < 59)
            g.drawString(""+x +", "+y, x-30, y+25);
        else
        g.drawString(""+x +", "+y, x-30, y-50);
        }
        
        //paint
        
        if(ready == false) {
        if(color == 1) {
        g.setColor(Color.red);
        }
        if(color == 2) {
        g.setColor(Color.green);
        }
        if(color == 3) {
        g.setColor(Color.blue);
        }
        g.drawLine(pX,pY,ptX,ptY);
        }
        
        for(int i = 0;i<200;i++) {
            
            if(colors[i] == 0) {
                
                if(found == false && ready == false) {
                paintX[i] = pX;
                paintY[i] = pY;
                paintX2[i] = ptX;
                paintY2[i] = ptY;
                colors[i] = color;
                }
                
            }
            else {
                if(colors[i] == 1) {
                    g.setColor(Color.red);
                    }
                    if(colors[i] == 2) {
                    g.setColor(Color.green);
                    }
                    if(colors[i] == 3) {
                    g.setColor(Color.blue);
                    }
                    g.drawLine(paintX[i],paintY[i],paintX2[i],paintY2[i]);
                
            }
        }
        
        
        
        //paused
        
        if(paused) {
            
            g.setColor(Color.gray);
            g.fillRect(0,0,1000,1000);
            
            g.setColor(Color.black);
            Font arial = new Font("Arial",Font.BOLD,50);
            g.setFont(arial);
            g.drawString("press any Button to continue", 130, 400);
            
            
        }
        
        repaint();

}
}

public void mouseClicked(MouseEvent e) {
    
        if (SwingUtilities.isRightMouseButton(e)) {
            
            Draw.paused = true;
            new Gui();
            
        }
        
    }

    
    public void mousePressed(MouseEvent e) {
    
        
        
    }

    
    public void mouseReleased(MouseEvent e) {
        
        if(Draw.ready = false) {
        Draw.pX = e.getX();
        Draw.pY = e.getY();
        System.out.println(""+ e.getX()+", " + e.getY());
        Draw.ready = true;
        }
        else {
            
            System.out.println("second"+ e.getX()+", " + e.getY());
            Draw.ptX = e.getX();
            Draw.ptY = e.getY();
            Draw.ready = false;
        }
        
    }

    
    public void mouseEntered(MouseEvent e) {
        Draw.pressed = true;
    }

    
    public void mouseExited(MouseEvent e) {
        Draw.pressed = false;
    }

}

Schonmal Vielen dank für eure hilfe.
 
Ich habe deien Code nicht komplett angeguckt. Verdächtig kommt mir vor, dass du so viele static-Variablen hast. Das ist normalerweise nicht nötig.
Ein klarer Fehler liegt hier vor:
if(Draw.ready = false)
Ein einfaches Gleichheitszeichen ist eine Zuweisung und kein Vergleich.
Solche Fehler kannst du vermeiden, wenn du stattdessen schreibst
Code:
if(!Draw.ready)
 
oh ja tatsächlich, da habe ich nen fehler gemacht. Das habe ich nicht extra nachgeschaut weil ich gedacht gabe der zeigt mir sowas an.
Danke für die schnelle hilfe.
 
Ich verstehe dein Problem ehrlich gesagt nicht ganz. Aber die Stelle kommt mir schon verdächtig vor:
Java:
public void mouseEntered(MouseEvent e) {
        Draw.pressed = true;
    }

mouseEntered ist, wenn der Mauszeiger die Komponente "betritt". Sollte diese Zeile nicht eher in mousePressed?
 
Eventuell hilft dir diese kleine Demo:

Java:
public class LinesDemo extends JFrame {
    public LinesDemo() {
        setTitle("Lines Demo");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        add(new LinesCanvas());

        pack();
    }

    private class LinesCanvas extends JComponent {
        private List<Line2D.Double> lines = new ArrayList<>();
        private Line2D.Double line;

        protected LinesCanvas() {
            setPreferredSize(new Dimension(500, 500));

            addMouseMotionListener(new MouseAdapter() {
                @Override
                public void mouseDragged(MouseEvent e) {
                    line.setLine(line.getP1(), e.getPoint());
                    repaint();
                }
            });

            addMouseListener(new MouseAdapter() {
                @Override
                public void mousePressed(MouseEvent e) {
                    line = new Line2D.Double(e.getPoint(), e.getPoint());
                }

                @Override
                public void mouseReleased(MouseEvent e) {
                    lines.add(line);
                    line = null;
                }
            });
        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);

            Graphics2D g2d = (Graphics2D)g;
            g2d.setColor(Color.BLACK);

            for (Line2D.Double iter : lines) {
                g2d.draw(iter);
            }
            if (line != null) {
                g2d.draw(line);
            }
        }
    }

    public static void main(String... args) {
        SwingUtilities.invokeLater(() -> new LinesDemo().setVisible(true));
    }
}
 
Mein eigentliches Problem habe ich dank fhoffmann schon gelößt. Die Variabele heißt zwar pressed, aber nur weil ich die schon für was anderes deklariert hatte, dann aber nichtmehr brauchte und weil das Programm auch nicht so kompliziert ist keine lust hatte die noch zu verändern.
Die sorgt daür, dass wenn der zeiger das fenster verlässt, dass die koordinaten,die sich über meinem Mauszeiger befinden verschwinden.
Trotzdem danke für die Demo, da waren ein paar sachen drin die ich bisher viel umständlicher gemacht habe 😉
 
Du solltest in Zukunft auf jeden Fall auf "static" verzichten. Die braucht man in den seltensten Fällen und auf diese sollte es auch beschränkt bleiben. D.h. dein nächstes Programm hat nur eine static Methode und das ist die main().
 
Du solltest in Zukunft auf jeden Fall auf "static" verzichten. Die braucht man in den seltensten Fällen und auf diese sollte es auch beschränkt bleiben. D.h. dein nächstes Programm hat nur eine static Methode und das ist die main().

Mein Problem, weshalb ich die Variabelen static gemacht habe ist, dass ich die Variabelen von anderen Klassen verändere und wenn die Variabelen nicht static sind gibt der mir einen error aus.
 
Mein Problem, weshalb ich die Variabelen static gemacht habe ist, dass ich die Variabelen von anderen Klassen verändere und wenn die Variabelen nicht static sind gibt der mir einen error aus.
Das sind allerdings Designfehler. Wenn du den Zustand einer Klasse ändern oder darauf zugreifen willst, dann stelle entsprechende Methoden dafür bereit. "Static" hat damit allerdings weniger zu tun, eher etwas mit Zugriffsmodifikatoren.
 
Mit dem Schlüsselwort "static" machst du aus einer Instanzvariablen eine Klassenvariable. Während bei einer Instanzvariablen der zugewiesene Wert für jede Instanz der Klasse ein anderer sein kann, hat eine Klassenvariable für alle Instanzen der Klasse den selben Wert. Siehe auch hier, oberer Teil des Beitrags: https://www.java-forum.org/thema/va...-nicht-korrekt-uebergeben.187838/post-1217478

Du kannst (und solltest) das gerne auch mal ausprobieren:
Java:
public class Foo {
    public int nonStaticVar; // Instanzvariable
    public static int staticVar; // Klassenvariable
}

Java:
public static void main(String[] args) {

    Foo foo1 = new Foo();
    Foo foo2 = new Foo();

    foo1.nonStaticVar = 12;
    foo1.staticVar = 34; // hier sollte besser Foo.staticVar stehen, aber dies dient zur Verdeutlichung

    System.out.println(foo1.nonStaticVar);
    System.out.println(foo1.staticVar);

    foo2.nonStaticVar = 56;
    foo2.staticVar = 78; // hier sollte besser Foo.staticVar stehen, aber dies dient zur Verdeutlichung

    System.out.println(foo1.nonStaticVar);
    System.out.println(foo1.staticVar);
    System.out.println(foo2.nonStaticVar);
    System.out.println(foo2.staticVar);
}
 
Ach so jetzt habe ichs verstanden. Ich habe bisher noch garnicht mit verschiedenen Instanzen gearbeitet, weshalb ich das problem an static auch nicht verstanden habe. Klingt aber eigentlich logisch. Welchen vorteil gibt es denn wenn man mit mehreren Instanzen arbeitet? Kann man dann zwischen denen wechseln?
 
Welchen vorteil gibt es denn wenn man mit mehreren Instanzen arbeitet?
I.d.R. arbeitet man immer mit Instanzen von Klassen und mehrere Instanzen einer Klasse hast du immer, wenn es mehr als ein "Ding" von dieser Klasse in deinem Programm gibt. Hm, klingt jetzt irgendwie dumm 😉

Nehmen wir einfach platt die Klasse Auto. Wenn du einen Parkplatz modellierst, der mehrere Autos enthalten kann, dann schreibst du ja nicht für jedes Auto eine Klasse (class Auto1, class Auto2, class Auto3) sondern instantiierst einfach mehrere Autos.
Java:
Parkplatz parkplatz = new Parkplatz();
for (int i = 0; i < 10; i++) {
    parkplatz.add(new Auto(i)); // wir unterstellen mal einen Auto-Konstuktor der ein int entgegennimmt
}

// anschließend enthält der Parkplatz 10 Autos

Kann man dann zwischen denen wechseln?
Man kann vieles, was auch immer du damit meinst.


Versuch dein Programm erst mal so zu schreiben, dass das einzige "static" bei der main() steht. Dann bist du auf dem richtigen Weg.
 

Zurück
Oben