【问题标题】:ActionPerformed method not working from another classActionPerformed 方法不适用于另一个类
【发布时间】:2014-12-24 14:45:29
【问题描述】:

我试图将 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();
    }
}

actionPerformed 方法不做任何事情。任何人都可以帮忙吗?或者有没有简单的方法来做到这一点? 背景:我试图通过使用一个类来制作游戏。我做到了,但问题是我一次只能输入 1 个键输入并且它是滞后的。我的老师说,如果我把它分成不同的班级,它就不会落后。是真的吗?

【问题讨论】:

  • 阅读 Oracle 教程 Graphics2d 和自定义绘画以获取工作代码示例
  • redsquare 不是从 swing 组件 [jpanel] 扩展而来的组件
  • @FastSnail 我该如何改进它?

标签: java swing class jframe


【解决方案1】:

您不能将非可视组件添加到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) {

    }
}

更新>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >

你不能使用对面板执行的操作,它只能用于按钮或类似的操作。如果你想通过点击面板做一些事情,那么你需要使用实现 mouselistner 。并将操作代码放在 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) {}


}

那时你只想通过鼠标点击移动方块,所以你仍然可以使用 awt 鼠标事件但是当你使用键时你必须使用key binding

【讨论】:

  • 谢谢。如果 RedSquare 扩展 JFrame 会起作用吗?
  • @MertKarakas 是的,但是你不能将它添加到面板,但你可以创建。但更好的是使用面板而不是 jframe。不要覆盖 jframe 的paintcomponent方法而不是覆盖面板方法跨度>
  • 1+,请检查我的编辑(希望这些对您有帮助)。另请注意paintComponent() 受保护,不公开。有关此问题的讨论,请参见 this Q&A
  • 谢谢大家。 @dic19 我还有一个问题。我在 actionPerfomed 方法中写了一个简单的代码,但它不起作用?为什么?
  • 愚蠢的问题我需要添加一个 actionListener 对不起!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-21
  • 1970-01-01
  • 2020-02-29
  • 1970-01-01
  • 2012-11-13
相关资源
最近更新 更多