Java ActionPerformed方法无法从其他类工作
我正在尝试将中的RedSquare类的对象添加到CatchMeV2类的JFrame中。有什么问题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
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抱歉!