Java ActionPerformed方法无法从其他类工作

Java ActionPerformed方法无法从其他类工作,java,swing,class,jframe,Java,Swing,Class,Jframe,我正在尝试将中的RedSquare类的对象添加到CatchMeV2类的JFrame中。有什么问题 public class CatchMeV2 implements ActionListener{ int width = 400; int height = 450; public static void main(String[] args) { JFrame frame = new JFrame(); frame.setVisible(true); frame.set

我正在尝试将中的RedSquare类的对象添加到CatchMeV2类的JFrame中。有什么问题

public class CatchMeV2 implements ActionListener{
int width = 400;
int height = 450;

public static void main(String[] args) {
    JFrame frame = new JFrame();
    frame.setVisible(true);
    frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
    frame.setResizable(false);
    frame.setSize(400, 400);
    frame.setTitle("CatchMe.V2");
    RedSquare r = new RedSquare();
    frame.add(r);

}

@Override
public void actionPerformed(ActionEvent e) {

    }
}

public class RedSquare extends JPanel implements ActionListener {
int x = 20; int y = 20;
int velX = 4; int velY = 4;
public RedSquare(){
    addActionListener(this);
}
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.setColor(Color.green);
    g.fillRect(x, y, 50, 50);
    repaint();
}

@Override
public void actionPerformed(ActionEvent e) {
    x += velX;
    y += velY;
    if (x < 0) {
        velX = 0;
        x = 0;
    }
    if (x > 400 - 50) {
        velX = 0;
        x = 400 - 50;
    }
    if (y < 0) {
        velY = 0;
        y = 0;
    }
    if (y > 400 - 40) {
        velY = 0;
        y = 400 - 40;
    }
    repaint();
    }
}
公共类CatchMeV2实现ActionListener{
整数宽度=400;
内部高度=450;
公共静态void main(字符串[]args){
JFrame=新JFrame();
frame.setVisible(true);
frame.setDefaultCloseOperation(关闭时退出);
frame.setresizeable(false);
框架。设置尺寸(400400);
frame.setTitle(“CatchMe.V2”);
RedSquare r=新的RedSquare();
帧。添加(r);
}
@凌驾
已执行的公共无效操作(操作事件e){
}
}
公共类RedSquare扩展JPanel实现ActionListener{
整数x=20;整数y=20;
int velX=4;int velX=4;
公共红场({
addActionListener(此);
}
公共组件(图形g){
超级组件(g);
g、 setColor(Color.green);
g、 fillRect(x,y,50,50);
重新油漆();
}
@凌驾
已执行的公共无效操作(操作事件e){
x+=velX;
y+=0;
if(x<0){
velX=0;
x=0;
}
如果(x>400-50){
velX=0;
x=400-50;
}
if(y<0){
f=0;
y=0;
}
如果(y>400-40){
f=0;
y=400-40;
}
重新油漆();
}
}
actionPerformed方法没有任何作用。有人能帮忙吗?还是有一个简单的方法可以做到这一点?
背景:我试图用一个类来制作一个游戏。我这样做了,但问题是我一次只能接受一个关键输入,而且它是滞后的。我的老师说如果我把它分成不同的班级,它就不会落后。这是真的吗?

您不能将非可视组件添加到
JPanel
中,因此您需要从组件扩展
RedSquare
类,例如
JPanel
和重写
paintComponent()
方法

public class CatchMeV2 {

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        frame.setSize(400, 400);
        frame.setTitle("CatchMe.V2");
        RedSquare r = new RedSquare();
        frame.setContentPane(r);
        frame.setVisible(true);
    }
}

class RedSquare extends JPanel implements ActionListener {

    public RedSquare() {

    }

    @Override    
    protected void paintComponent(Graphics g) {
        super.paintComponent(g); // don't forget to call super method
        g.setColor(Color.green);
        g.fillRect(20, 20, 50, 50);
    }

    @Override
    public void actionPerformed(ActionEvent e) {

    }
}
更新>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

您不能使用对面板执行的操作,它仅适用于按钮或类似的操作。如果您想对面板上的单击执行操作,则需要使用ImplementMouseSistner。并将操作代码放入mouseclick方法中。运行此示例

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

public class CatchMeV2 {

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        frame.setResizable(false);
        frame.setSize(400, 400);
        frame.setTitle("CatchMe.V2");
        RedSquare r = new RedSquare();
        frame.add(r);
    }
}

class RedSquare extends JPanel implements MouseListener {

    int x = 20;
    int y = 20;
    int velX = 4;
    int velY = 4;

    public RedSquare() {
        addMouseListener(this);
    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g); 
        g.fillRect(x, y, 50, 50);
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        System.out.println("hi");
        x += velX;
        y += velY;
        if (x < 0) {
            velX = 0;
            x = 0;
        }
        if (x > 400 - 50) {
            velX = 0;
            x = 400 - 50;
        }
        if (y < 0) {
            velY = 0;
            y = 0;
        }
        if (y > 400 - 40) {
            velY = 0;
            y = 400 - 40;
        }
        this.repaint();
    }

    @Override
    public void mousePressed(MouseEvent e) {}

    @Override
    public void mouseReleased(MouseEvent e) {}

    @Override
    public void mouseEntered(MouseEvent e) {}

    @Override
    public void mouseExited(MouseEvent e) {}


}
导入java.awt.Graphics;
导入java.awt.event.MouseEvent;
导入java.awt.event.MouseListener;
导入javax.swing.JFrame;
在关闭时导入静态javax.swing.JFrame.EXIT_;
导入javax.swing.JPanel;
公共类CatchMeV2{
公共静态void main(字符串[]args){
JFrame=新JFrame();
frame.setVisible(true);
frame.setDefaultCloseOperation(关闭时退出);
frame.setresizeable(false);
框架。设置尺寸(400400);
frame.setTitle(“CatchMe.V2”);
RedSquare r=新的RedSquare();
帧。添加(r);
}
}
类RedSquare扩展JPanel实现MouseListener{
int x=20;
int y=20;
int-velX=4;
int=4;
公共红场({
addMouseListener(这个);
}
受保护组件(图形g){
超级组件(g);
g、 fillRect(x,y,50,50);
}
@凌驾
公共无效mouseClicked(MouseEvent e){
System.out.println(“hi”);
x+=velX;
y+=0;
if(x<0){
velX=0;
x=0;
}
如果(x>400-50){
velX=0;
x=400-50;
}
if(y<0){
f=0;
y=0;
}
如果(y>400-40){
f=0;
y=400-40;
}
这个。重新绘制();
}
@凌驾
public void mousePressed(MouseEvent e){}
@凌驾
公共无效MouseEvent e{}
@凌驾
公共无效mouseenterned(MouseEvent e){}
@凌驾
公共无效mouseExited(MouseEvent e){}
}

当时,您只想用鼠标点击移动方块,这样您仍然可以使用awt鼠标事件,但当您使用键时,您必须使用
键绑定

阅读Oracle教程图形2D和工作代码自定义绘制示例Resquare不是一个组件,它是从swing组件[jpanel]扩展而来的@我怎样才能改进呢?谢谢。如果RedSquare扩展了JFrame,它会工作吗。@MertKarakas是的,但是你不能将它添加到面板中,但是你可以创建。但是更好的办法是将面板用于这个而不是JFrame。不要将JFrame paintcomponent方法覆盖面板方法而不是覆盖1+,请检查我的编辑(希望这些有帮助)。另外请注意
paintComponent()
受保护,不公开。关于这个问题的讨论,请参阅。谢谢大家@我还有一个问题。我在actionperformed方法中编写了一个简单的代码,但它不起作用?为什么?愚蠢的问题我需要添加一个actionListener抱歉!