Iloczyn logiczny iloczynów logicznych (koniunkcja koniunkcji) w wyrażeniu warunkowym

0

Witam. Czy ktoś mi może wyjaśnić co jest nie tak z następującym kodem:

(48<mouseX && mouseX<60) && (48<mouseY && mouseY<60) ? g.fillOval(48, 48, 12, 12) : g.fillOval(50, 50, 8, 8);

wiem, że to coś z koniunkcją w wyrażeniu ale o co dokładnie chodzi? Zastąpiłem to wyrażenie następującą konstrukcją:

if(mouseX<60&&mouseX>48){
        if(48<mouseY && mouseY<60) {
            g.fillOval(48, 48, 12, 12);
        }else g.fillOval(50, 50, 8, 8);
    }else g.fillOval(50, 50, 8, 8); 

w tym wypadku działa, choć jest mniej elegancko.
I jeszcze pytanie: czy można jakoś efektywniej sprawdzić czy dana zmienna liczbowa zawiera się w danym zakresie? Bo takie coś raczej nie przejdzie :D :

if(48<mouseX<60) {...}
0
(48<mouseX && mouseX<60 && 48<mouseY && mouseY<60) ? g.fillOval(48, 48, 12, 12) : g.fillOval(50, 50, 8, 8);
0

Niestety nadal nic z tego. Program nie łączy napisów "mouseX" i "mouseY" w wyrażeniu ?: ze zmiennymi o tych nazwach. W wyrażeniu if() nie ma już tego problemu. Wrzucę cały kod, może coś umyka mojemu rozumowaniu. Zadaniem programu jest jedynie zwiększanie kropki kiedy najeżdża się na nią kursorem.

import java.awt.*;
import java.awt.event.*;


public class Kropa extends Frame implements MouseMotionListener{
	Frame okno;
	int mouseX=0, mouseY=0;
	
	Kropa(String name){
		super(name);
		this.setSize(300, 200);
		addMouseMotionListener(this);
	}
	
	public void mouseDragged(MouseEvent arg0){}

	public void mouseMoved(MouseEvent me){
		mouseX=me.getX();
		mouseY=me.getY();
		repaint();
	}
	
	public void paint(Graphics g){
		g.setColor(Color.red);
		//(48 < mouseX && mouseX < 60) && (48 < mouseY && mouseY < 60) ? g.fillOval(48, 48, 12, 12) : g.fillOval(50, 50, 8, 8);
		if(mouseX<60&&mouseX>48){
			if(48<mouseY && mouseY<60) {
				g.fillOval(48, 48, 12, 12);
			}else g.fillOval(50, 50, 8, 8);
		}else g.fillOval(50, 50, 8, 8);
	}

	public static void main(String[] args){
		Kropa okno = new Kropa("moje okno");
		okno.setVisible(true);
	}

}
1

Po pierwsze jest to przykład na to, że "elvis" (operator ?:) jest złem, bo gmatwa kod.
Po drugie napisz odpowiednią metodę i ją przetestuj:

private boolean isInLine(int mousePos, int start, int end){
    return start < mousePos && mousePos < end;
}
private boolean isOutLine(int mousePos, int start, int end){
    return start > mousePos || mousePos > end;
}

Na tej podstawie możesz przygotować sobie metodę obliczającą czy kursor znajduje się w danym obszarze.

Koniecznie dopisz testy. Dopiero wtedy zacznij klepać dalszy kod.

1

Abstrahując od czytelności operatora trójargumentowego, próbujesz go zupełnie niewłaściwie użyć. Powinieneś go użyć tak (tylko część koniecznych zmian):

g.fillOval((48 < mouseX && mouseX < 60) && (48 < mouseY && mouseY < 60)?48:50, 48, 12, 12);
0

Już zaczynam łapać. Zmyliło mnie zdanie w Kompendium Shildta: "Operator trójargumentowy ma za zadanie zastąpić pewne proste konstrukcje if-then-else". Kluczowe jest tu słowo "pewne" :D Konstrukcja wykonuje kod, ale musi zwracać wartość różną od void.

Dzięki panowie.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.