Gå til innhold

mousePressed og mouseReleased event.getY gir feil koordinater


Anbefalte innlegg

Spørsmål løst ved å bruke e.getPointt(); istedefor event.getX og getY. Ikke vet jeg hvorfor, men nå fungerer det ihvertfall.

 

 

Har løst det originale spørsmål, oppdaterer derfor denne tråden med nytt ettersom det ikke var noen svar her uansett :whistle:

 

Jeg har løst dette ved å ta koordinatene og ta +50 på hver av y koordinatene, og +5 på hver av x koordinatene, da stemmer det med hvor musepekeren er. Dette burde da ikke være nødvendig, så lurer på om det er noen løsning :)

 

Jeg har et lett paint program, hvor jeg bruker mousePressed og mouseReleased til å sette xStart, xSlutt, yStart og ySlutt variabler og deretter tegne en form i mellom disse punktene.

 

Problemet derimot er at i høyden blir det feil.

post-200648-1270763124,905_thumb.jpg

Den blå prikken er hvor jeg hadde musepekeren, da den ikke ble med på bildet :) men strekene over ble generert. Altså blir den generert på feil sted i høyden, altså y koordinatene blir feil.

 

Jeg har sjekket at den returnerer rett skjermstørrelse, koden jeg bruker er

s.setyStart(event.getY());
s.setySlutt(event.getY());

 

Henholdsvis i hver sin listener for pressed og releasedfor å sette variablene.

Deretter

Line2D line = new Line2D.Double(settings.xStart, settings.yStart, settings.xSlutt, settings.ySlutt);

 

Problemet er som sagt at den genereres på feil sted, er det noe feil i koden? :hrm:

 

 

Originalt spørsmål, løst nå tho ved å bruke public static variabel.

 

Jeg vet ikke om tittelen stemmer med det jeg prøver å gjøre, men ihvertfall;

 

tidligere har jeg kun laget programmer i en stor klasse. Nå er jeg ute etter å kunne dele det opp i mindre deler og da støter jeg på et problem.

 

Jeg prøver å lage et lett tegne program, og holder på med en funksjon som skal lagre utgangsposisjonen og sluttposisjonen til et museklikk. Jeg har en fil som er hovedprogrammet som kun lager en instans av GUI filen, og har en fil som kalles tegnePanel som tegner nye figurer, og en fil jeg kaller settings.

 

I settings har jeg double xStart, yStart, xSlutt, ySlutt og tilsvarende get og set metoder. Disse instansieres da ved

settings s = new settings();

Problemet er å få tilgang til de samme variablene i både "filen" som tegner og GUI filen. Mouselisteneren ligger i GUI filen, som setter settings.setxStart osv.

 

Men disse blir da ikke videreført til den instansierte settings i filen som tegner. Så selv om i gui versjonen av s så er koordinatene riktige, er de ikke riktige når den prøver å lage figuren, da er de kun 0,0,0,0 som da gir ingen figur.

 

Hvordan løser man dette? Har søkt litt rundt, men vet ikke helt hvordan jeg skal ordlegge meg. Bare å spørre om det er uforståelig.

 

 

Endret av Cemi
Lenke til kommentar
Videoannonse
Annonse

Hadde vært en fordel om du postet koden din. Hvertfall det som gav deg problemer. Da kunne vi nok svart på begge spørsmålene dine.

 

Vil tro at det andre problemet ditt har noe med at du ikke har samme instans av Settings klassen i de to andre klassene dine.

 

Det første problemet mangler vi nok en del opplysninger på. Kan ha noe med at du kanskje har registrert mouseListener til feil container(Frame containeren istedet for Panel containeren). Da vil du få en offset på omtrent 50 pixler i y, og 5 i x. Dette vil da kun gjelde for Vista/W7, men ikke for andre OS som OSX eller Linux, eller på Windows XP (eller W7 med themes).

Lenke til kommentar

Prøv å poste hele koden. Jeg lagde en enkel applikasjon som gjør omtrentlig det du ber om. (Meget dårlig implementering av MousePanel klassen. Aldri tegn direkte på skjermen slik som jeg gjør det med mindre du har en meget god grunn.)

 

 

import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Main {

JFrame frame;
MousePanel pane;

public Main() {
	frame = new JFrame("Paint");
	frame.setBounds(100, 100, 1200, 600);
	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

	pane = new MousePanel();
	frame.setContentPane(pane);
	frame.setVisible(true);

	pane.addMouseListener(new MouseListener() {

		Point start;

		public void mouseClicked(MouseEvent e) {
		}

		public void mousePressed(MouseEvent e) {
			if (start == null)
				start = e.getPoint();
		}

		public void mouseReleased(MouseEvent e) {
			pane.paint(start, e.getPoint());
			start = e.getPoint();
		}

		public void mouseEntered(MouseEvent e) {
		}

		public void mouseExited(MouseEvent e) {
		}
	});
}

public static void main(String[] args) {
	new Main();

}
}

class MousePanel extends JPanel {

public void paint(Point start, Point stop) { // Change this code to use doublebuffering and a BufferedImage instead of drawing directly at the canvas!
	Graphics g = this.getGraphics(); //Evt. cast to Graphics2D
	g.drawLine(start.x, start.y, stop.x, stop.y);
}
}

Endret av Fluesoppen
Lenke til kommentar

Figured at den ikke var veldig nødvendig, men den inneholder:

 

+ get og set metoder for hver enkelt.

 

public static int width = 10;
public static int height = 10;
public static Dimension size = new Dimension(width,height);
public static boolean contour;
public static Color color = Color.blue;
public static String shape = "oval";
public static double xStart = 0;
public static double yStart = 0;
public static double xSlutt = 0;
public static double ySlutt = 0;
public static boolean fill = false;

 

Regner med du vet hva get og set metoder er, men isf.

 

public double getyStart() {
	return yStart;
}
public void setyStart(double yStart) {
	this.yStart = yStart;
}

 

og like for alle bare med andre navn.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...