2013-06-27, 13:39
  #1
Medlem
Tjenare!

Får inte till det med min MouseListener, den tycks vägra att registrera mina klick.
Kan någon hjälpsam själ spana in min kod och försöka lista ut vad som är fel?

Kod:
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferStrategy;

public class TileMapEditor extends JFrame {
	private final int WIDTH = 320;
	private final int HEIGHT = 320;
	
	private BufferStrategy bs;
	private TileMap tileMap;
	private SimpleMouseListener mouse;

	public static void main(String[] args) {
		new TileMapEditor();
	}
	
	public TileMapEditor() {
		super("Tile Map Editor");
		Canvas canvas = new Canvas();
		
		JPanel panel = (JPanel) getContentPane();
		panel.setPreferredSize(new Dimension(WIDTH, HEIGHT));
		panel.add(canvas);
		
		setSize(WIDTH, HEIGHT);
		setResizable(false);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLocationRelativeTo(null);
		pack();
		setVisible(true);
		setFocusable(true);
		addMouseListener(mouse);
		
		canvas.setBounds(0, 0, WIDTH, HEIGHT);
		canvas.setIgnoreRepaint(true);
		canvas.createBufferStrategy(2);
		bs = canvas.getBufferStrategy();
		canvas.setFocusable(true);
		
		init();
	}
	
	public void init() {
		mouse = new SimpleMouseListener();
		tileMap = new TileMap("map.txt", 32, 10, 10);
		//tileMap.load();
		
		run();
	}
	
	public void run() {
		while(true) {
			update();
			render();
			
			try {Thread.sleep(10);} catch(Exception e) {}
		}
	}
	
	public void update() {
		if(mouse.isPressed()) {
			int x = mouse.getX();
			int y = mouse.getY();
			int button = mouse.getButton();
				
			System.out.println("X: " +x +" Y: " +y +" Button: " +button);
		}
	}
	
	public void render() {
		Graphics2D g = (Graphics2D) bs.getDrawGraphics();
		tileMap.render(g);
		g.dispose();
		bs.show();
	}
}

Kod:
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;

public class SimpleMouseListener implements MouseListener {
	private boolean pressed;
	private int x, y, button;

	public void mouseClicked(MouseEvent e) {}
		
	public void mouseEntered(MouseEvent e) {}
		
	public void mouseExited(MouseEvent e) {}
		
	public void mousePressed(MouseEvent e) {
		pressed = true;
		x = e.getX();
		y = e.getY();
		button = e.getButton();
	}
		
	public void mouseReleased(MouseEvent e) {
		pressed = false;
	}
	
	public boolean isPressed() {
		return pressed;
	}
	
	public int getX() {
		return x;
	}
	
	public int getY() {
		return y;
	}
	
	public int getButton() {
		return button;
	}
}

TileMap och Tile klasserna använder sig för tillfället inte av min MouseListener så jag har exkluderat dessa.
__________________
Senast redigerad av Lukazon 2013-06-27 kl. 13:42.
Citera
2013-06-27, 18:56
  #2
Medlem
Jooncs avatar
Kod:
addMouseListener(mouse);
kommer innan
Kod:
mouse = new SimpleMouseListener();
Flytta upp den senare.

Edit: Vad som händer i första raden är alltså
Kod:
addMouseListener(null);
Du får en referens till objektet först vid instansieringen.

Ett annat tips, java.awt.event.MouseAdapter implementerar MouseListener, MouseMotionListener, MouseWheelListener och EventListener med tomma metoder som kan överlagras. På så vis behöver du inte ha en massa tomma metoder i din kod utan kan bara implementera de du villl ha. Det är alltså generellt mer praktiskt att ärva MouseAdapter än att implementera MouseListener.
__________________
Senast redigerad av Joonc 2013-06-27 kl. 19:06.
Citera
2013-06-27, 19:15
  #3
Medlem
Jooncs avatar
Okej nu svarar jag på saker du inte bett om hjälp med, men

Kod:
	public void run() {
		while(true) {
			update();
			render();
			
			try {Thread.sleep(10);} catch(Exception e) {}
		}
	}

kan ge ojämn hastighet om exekveringstiderna för update() och render() varierar och tar flera millisekunder i anspråk. Ett tips är att registrera tiden vid början av run() (long t = System.currentTimeMillis()) och låta tråden sova beroende på hur lång tid run() tog:
Kod:
Thread.sleep(10 - (System.currentTimeMillis() - t);
Citera
2013-06-27, 22:15
  #4
Medlem
Tack för hjälp och förklaring, nu fungerar det utmärkt!
La även till kodsnutten för att stabilisera run().
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in