gpt4 book ai didi

java - Canvas 中的 MouseListener 不工作

转载 作者:行者123 更新时间:2023-11-29 08:06:56 25 4
gpt4 key购买 nike

我在尝试用 Java 制作游戏时遇到问题。我正在尝试将 MouseListener 附加到我的 Canvas 上,但是,当我单击 Canvas 时,没有任何反应。我想我可能将 MouseListener 附加到错误的东西上,但我不知道将它附加到什么上。我试过将它附加到 JFrame 和 Canvas 上。这是我的代码:

import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;

import java.io.*;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.util.Random;

public class Gravity extends Canvas {

public static final int screenw = 1024;
public static final int screenh = 768;

public static Random gen = new Random();

public static Boolean started = false;

public static int[] starx = new int[100];
public static int[] stary = new int[100];
public static Color[] starc = new Color[100];

public static JFrame frame;
public static Gravity canvas;
public static Image buffer;
public static Graphics bg;

public static int[] xh = new int[1000];
public static int[] yh = new int[1000];

public static int i = 0;

public static Image title;

public static ArrayList<Integer> ptx = new ArrayList<Integer>();
public static ArrayList<Integer> pty = new ArrayList<Integer>();
double x = 100;
double y = 100;

public Gravity(){
}

public void paint (Graphics g) {
frame.addMouseListener(new MouseListener(){
public void mouseClicked(MouseEvent e){
started = true;
System.out.println("Mouse was clicked");
}

public void mouseEntered(MouseEvent arg0) {}
public void mouseExited(MouseEvent arg0) {}
public void mousePressed(MouseEvent arg0) {}
public void mouseReleased(MouseEvent arg0) {}
});


buffer = createImage(screenw, screenh);
bg = buffer.getGraphics();

int w = getWidth();
int h = getHeight();

double px = getWidth()/2;
double py = getHeight()/2;

bg.setColor(Color.BLACK);
bg.fillRect(0, 0, w, h); //black background

for (int j=0; j < 100; j++){ //make stars
starx[j] = gen.nextInt(w);
stary[j] = gen.nextInt(h);
starc[j] = new Color(gen.nextInt(100)+156, gen.nextInt(100)+156, gen.nextInt(100)+156);
bg.setColor(starc[j]);
bg.drawLine(starx[j], stary[j], starx[j]+2, stary[j]+2);
bg.drawLine(starx[j], stary[j]+2, starx[j]+2, stary[j]);
}

try {
title = ImageIO.read(new ByteArrayInputStream(Base64.decode(""))); //I have omitted the Base64 code for the image for my title screen
} catch (IOException e) {
e.printStackTrace();
}

bg.drawImage(title, 100, 100, null);
g.drawImage(buffer, 0, 0, null);

while (!started){
try {
Thread.sleep(50);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}

double xvel = -15;
double yvel = 10;

for (int j=0; j < 100; j++){ //store stars
starx[j] = gen.nextInt(w);
stary[j] = gen.nextInt(h);
starc[j] = new Color(gen.nextInt(100)+156, gen.nextInt(100)+156, gen.nextInt(100)+156);
}

Image test = createImage(200,200);
Graphics testg = test.getGraphics();
testg.drawLine(50,50,150,150);

while(true){
g.drawImage(buffer, 0,0, null);
try {
Thread.sleep(33);
} catch (Exception e) {
e.printStackTrace();
}

bg.setColor(Color.BLACK);
bg.fillRect(0, 0, w, h); //black background


for (int j=0; j < 100; j++){ //draw stars
bg.setColor(starc[j]);
bg.drawLine(starx[j], stary[j], starx[j]+2, stary[j]+2);
bg.drawLine(starx[j], stary[j]+2, starx[j]+2, stary[j]);
}

bg.setColor(Color.BLUE);

if (i > 0){
for (int z=0; z < i-1; z++){
bg.drawLine(ptx.get(z), pty.get(z), ptx.get(z+1), pty.get(z+1));
}
}

bg.setColor(Color.CYAN);
bg.fillOval((int)px, (int)py, 25, 25); //planet

bg.setColor(Color.RED);
bg.fillRect((int)(x-5),(int)(y-5),10,10); //ship

double fg = (5*50000)/(Math.pow(dist(x,y,px,py),2));

double m = (y-py)/(x-px);
double ms = Math.sqrt(Math.abs(m));
if (m < 0) ms = -ms;

double xchg = fg;
double ychg = fg*ms;

if (x > px){
xchg = -xchg;
ychg = -ychg;
}

xvel += xchg;
yvel += ychg;

x += xvel;
y += yvel;

ptx.add((int)x);
pty.add((int)y);

i++;
}
}

public static void main(String[] args){

canvas = new Gravity();
frame = new JFrame();
frame.setSize(screenw, screenh);
frame.setResizable(false);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(canvas);

frame.setVisible(true);
}


public static double dist(double x1, double y1, double x2, double y2){
double x = x2-x1;
double y = y2-y1;
return Math.sqrt((x*x)+(y*y));
}
}

最佳答案

一般提示,以点的形式:

  1. 不要将 AWT(例如 Canvas)与 Swing(例如 JFrame)组件混合使用。使用 JPanel 代替 Canvas 并覆盖 paintComponent(Graphics) 而不是 paint(Graphics)
  2. 不要在 EDT 上调用 Thread.sleep(n)。而是使用基于 Swing 的 Timer 来调用 repaint()
  3. 不要对 paint 方法执行长时间运行的操作,尤其是启动无限循环!甚至缓冲图像的创建也应该只在屏幕尺寸发生变化的情况下进行。 (留作“待办事项”- BNI)
  4. 在构造函数或 init() 方法中添加一次 MouseListener,而不是每次调用 paint 时。
  5. 强烈推荐 Nate 的所有带编号的笔记列表。

尝试此代码,并将其与原始代码仔细比较以查看更改。

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Dimension;
import java.awt.event.*;
import java.util.ArrayList;

import java.io.*;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.util.Random;

public class Gravity extends JPanel {

public static final int screenw = 800;
public static final int screenh = 600;

public static Random gen = new Random();

public static int[] starx = new int[100];
public static int[] stary = new int[100];
public static Color[] starc = new Color[100];

public static Image buffer;
public static Graphics bg;

public static int[] xh = new int[1000];
public static int[] yh = new int[1000];

public static int i = 0;

public static ArrayList<Integer> ptx = new ArrayList<Integer>();
public static ArrayList<Integer> pty = new ArrayList<Integer>();
double x = 100;
double y = 100;

Timer timer;

public Gravity(){
// set thre PREFERRED size!
setPreferredSize(new Dimension(screenw, screenh));
addMouseListener(new MouseListener(){
public void mouseClicked(MouseEvent e){
System.out.println("Mouse was clicked");
timer.start();
}

public void mouseEntered(MouseEvent arg0) {}
public void mouseExited(MouseEvent arg0) {}
public void mousePressed(MouseEvent arg0) {}
public void mouseReleased(MouseEvent arg0) {}
});
ActionListener animation = new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
repaint();
}
};
timer = new Timer(50, animation);
}

@Override
public void paintComponent(Graphics g) {
buffer = createImage(screenw, screenh);
bg = buffer.getGraphics();

int w = getWidth();
int h = getHeight();

double px = getWidth()/2;
double py = getHeight()/2;

bg.setColor(Color.BLACK);
bg.fillRect(0, 0, w, h); //black background

for (int j=0; j < 100; j++){ //make stars
starx[j] = gen.nextInt(w);
stary[j] = gen.nextInt(h);
starc[j] = new Color(gen.nextInt(100)+156, gen.nextInt(100)+156, gen.nextInt(100)+156);
bg.setColor(starc[j]);
bg.drawLine(starx[j], stary[j], starx[j]+2, stary[j]+2);
bg.drawLine(starx[j], stary[j]+2, starx[j]+2, stary[j]);
}

g.drawImage(buffer, 0, 0, null);

double xvel = -15;
double yvel = 10;

for (int j=0; j < 100; j++){ //store stars
starx[j] = gen.nextInt(w);
stary[j] = gen.nextInt(h);
starc[j] = new Color(gen.nextInt(100)+156, gen.nextInt(100)+156, gen.nextInt(100)+156);
}

Image test = createImage(200,200);
Graphics testg = test.getGraphics();
testg.drawLine(50,50,150,150);

g.drawImage(buffer, 0,0, null);
try {
Thread.sleep(33);
} catch (Exception e) {
e.printStackTrace();
}

bg.setColor(Color.BLACK);
bg.fillRect(0, 0, w, h); //black background


for (int j=0; j < 100; j++){ //draw stars
bg.setColor(starc[j]);
bg.drawLine(starx[j], stary[j], starx[j]+2, stary[j]+2);
bg.drawLine(starx[j], stary[j]+2, starx[j]+2, stary[j]);
}

bg.setColor(Color.BLUE);

if (i > 0){
for (int z=0; z < i-1; z++){
bg.drawLine(ptx.get(z), pty.get(z), ptx.get(z+1), pty.get(z+1));
}
}

bg.setColor(Color.CYAN);
bg.fillOval((int)px, (int)py, 25, 25); //planet

bg.setColor(Color.RED);
bg.fillRect((int)(x-5),(int)(y-5),10,10); //ship

double fg = (5*50000)/(Math.pow(dist(x,y,px,py),2));

double m = (y-py)/(x-px);
double ms = Math.sqrt(Math.abs(m));
if (m < 0) ms = -ms;

double xchg = fg;
double ychg = fg*ms;

if (x > px){
xchg = -xchg;
ychg = -ychg;
}

xvel += xchg;
yvel += ychg;

x += xvel;
y += yvel;

ptx.add((int)x);
pty.add((int)y);

i++;
}

public static void main(String[] args){
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame frame = new JFrame();

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new Gravity());
frame.setResizable(false);
frame.pack();

frame.setLocationByPlatform(true);
frame.setVisible(true);
}
});
}


public static double dist(double x1, double y1, double x2, double y2){
double x = x2-x1;
double y = y2-y1;
return Math.sqrt((x*x)+(y*y));
}
}

关于java - Canvas 中的 MouseListener 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10556369/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com