2017-12-31 26 views
0

Wenn ich versuche, etwas wie ein Quadrat an der Stelle zu zeichnen, an der meine Maus geklickt hat, wird das Quadrat mehrere Pixel entfernt vom Mausklick gemalt. Nicht nur das, aber wenn sich das Fenster öffnet, scheint es nicht als 1080 von 720 zu erscheinen (der schwarze Hintergrund ist tatsächlich verdeckt und du musst die Größe des Fensters anpassen), Könnte das etwas damit zu tun haben?Formen, die nicht an den richtigen Stellen malen, woanders mit 20-40 Pixel malen (mit MouseListener)

Ich habe versucht zu vergleichen, wo meine Maus geklickt und die Position das Quadrat bekam, aber sie waren die gleichen. Durch Klicken auf eine Stelle wird das Quadrat dorthin verschoben ... Oder sollte es ... (Unter Windows 10). Jede Hilfe ist dankbar, danke.

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

public class Core extends JComponent implements MouseListener, ActionListener 
{ 
private Timer timer; 
private Player player; 


public Core() 
{ 
    timer = new Timer(3, this); 
    timer.start(); 
    player = new Player(500, 500, 30, 30, 1); 
} 

public static void main(String[] args) 
{ 
    JFrame window = new JFrame(); 
    Core game = new Core(); 
    window.add(game); 
    window.addMouseListener(game); 
    window.pack(); 
    window.setSize(1080, 720); 
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    window.setVisible(true); 
} 

public void paintComponent(Graphics g) 
{ 
    Graphics2D g2 = (Graphics2D) g; 
    g2.fillRect(0,0,1080,720); 

    if(timer.isRunning()) 
     player.paint(g2); 


} 


@Override 
public void mouseClicked(MouseEvent e) 
{ 

    player.setNewPosition(e.getX(), e.getY()); 


} 

@Override 
public void mousePressed(MouseEvent e) 
{ 

} 

@Override 
public void mouseReleased(MouseEvent e) 
{ 

} 

@Override 
public void mouseEntered(MouseEvent e) 
{ 

} 

@Override 
public void mouseExited(MouseEvent e) 
{ 

} 

@Override 
public void actionPerformed(ActionEvent e) 
{ 
    repaint(); 
} 
} 

import java.awt.*; 

public class Player 
{ 
private int x,y,width,length,speed; 
private int newX, newY; 

public Player(int x, int y, int width, int length, int speed) 
{ 
    this.x = x; 
    this.y = y; 
    this.width = width; 
    this.length = length; 
    this.speed = speed; 
    newX = x; 
    newY = y; 
} 

public void setNewPosition(int newX, int newY) 
{ 
    this.newX = newX; 
    this.newY = newY; 
} 

public void move() 
{ 
    if(x > newX) 
     x -= speed; 
    else if(x < newX) 
     x += speed; 
    if(y > newY) 
     y -= speed; 
    else if(y < newY) 
     y += speed; 
} 


public void paint(Graphics2D g2) //paint method 
{ 
    g2.setColor(Color.blue); 
    move(); 
    g2.fillRect(x, y, width, length); 
} 
} 
+1

Die 'MouseListener' sollte gegen die' core' Klasse registriert werden, nicht der Rahmen. Denken Sie daran, dass das 'MouseEvent' relativ zu der Komponente ist, für die das Ereignis generiert wurde, dh die Koordinaten befinden sich im Koordinatenraum der Quelle – MadProgrammer

Antwort

1

ändern

public static void main(String[] args) 
{ 
    JFrame window = new JFrame(); 
    Core game = new Core(); 
    window.add(game); 
    window.addMouseListener(game); 
    window.pack(); 
    window.setSize(1080, 720); 
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    window.setVisible(true); 
} 

Um etwas mehr wie ...

public static void main(String[] args) 
{ 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      JFrame window = new JFrame(); 
      Core game = new Core(); 
      game.addMouseListener(game); 
      window.add(game); 
      window.pack(); 
      window.setSize(1080, 720); 
      window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      window.setVisible(true); 
     } 
    }); 
} 

Die Koordinaten der MouseEvent verwendet werden die source relativ seine ‚s-Koordinate Raum

Persönlich würde ich die MouseListener im Core Konstruktor registrieren, aber Sie bekommen die Idee