【发布时间】:2014-11-20 08:09:39
【问题描述】:
我正在尝试制作一个对象试图追逐另一个对象的游戏。但是在 JFrame 中只显示了 1 个对象。你能帮帮我吗?
主类:
package catchbutterfly;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import java.util.Random;
public class CatchButterFly extends JPanel implements ActionListener, KeyListener {
Timer tm = new Timer(5, this);
Random generator = new Random();
int x = 400, y = 800, velX = 0, velY = 0;
public static void main(String[] args) {
JFrame frame = new JFrame("Catch The ButterFly");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
int width = (int) screenSize.getWidth();
int height = (int) screenSize.getHeight();
frame.setSize(width, height);
frame.setVisible(true);
JPanel panel = new JPanel();
Graphics g = panel.getGraphics();
Catcher t = new Catcher();
Butterfly fly = new Butterfly();
frame.add(t);
frame.add(fly);
}
public void actionPerformed(ActionEvent e) {
}
public void keyTyped(KeyEvent e) {
}
public void keyPressed(KeyEvent e) {
}
public void keyReleased(KeyEvent e) {
}
}
随着键盘输入移动的椭圆类:
package catchbutterfly;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import java.util.Random;
public class Catcher extends JPanel implements ActionListener, KeyListener{
Timer tm = new Timer(5, this);
Random generator = new Random();
int x = 400, y = 800, velX = 0, velY = 0;
public Catcher(){
tm.start();
addKeyListener(this);
setFocusable(true);
setFocusTraversalKeysEnabled(false);
System.out.println("obje catcher olustu");
}
public void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(Color.RED);
g.fillOval(x, y, 50, 50);
tm.start();
}
public void actionPerformed(ActionEvent e) {
if(x < 0){
velX = 0;
x = 0;
}
if(x > 1366 - 50){
velX = 0;
x = 1366 - 50;
}
if(y < 0){
velY = 0;
y = 0;
}
if(y > 670){
velY = 0;
y = 0;
}
x = x + velX;
y = y + velY;
repaint();
}
public void keyPressed(KeyEvent e) {
int code = e.getKeyCode();
if(code == KeyEvent.VK_LEFT){
velX = -4;
velY = 0;
}
if(code == KeyEvent.VK_UP){
velX = 0;
velY = -4;
}
if(code == KeyEvent.VK_RIGHT){
velX = 4;
velY= 0;
}
if(code == KeyEvent.VK_DOWN){
velX = 0;
velY = 4;
}
}
public void keyTyped(KeyEvent e) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
public void keyReleased(KeyEvent e) {
velX = 0;
velY = 0;
}
}
移动 x += 4 的正方形类(未显示):
package catchbutterfly;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
import javax.swing.JPanel;
import javax.swing.Timer;
public class Butterfly extends JPanel implements ActionListener, KeyListener {
Timer tm = new Timer(5, this);
int x = 800, y = 500, velX = 4, velY = 4;
public Butterfly(){
tm.start();
}
public void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(Color.BLUE);
g.fillOval(x, y, 50, 50);
tm.start();
}
public void actionPerformed(ActionEvent e) {
if(x < 0 || x > 1366 - 50){
velX = -velX;
}
if(y < 0 || y > 670){
velY = -velY;
}
x = x + velX;
y = y + velY;
}
public void keyTyped(KeyEvent e) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
public void keyPressed(KeyEvent e) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
public void keyReleased(KeyEvent e) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
}
【问题讨论】:
-
frame.add(t); ---> JFrame 有 BorderLayout,请参阅 Oracle trail about Layout manager in AWT/Swing,
-
Swing JComponents 中不要使用 NullLayout 和 KeyListener
-
mKorbel 我真的是Java 初学者,我不明白你在说什么。你能再解释一下吗?
-
BorderLayout 有第 5 个区域,您可以只将一个 JComponent 放在其中一个区域(实际上您使用 CENTER == frame.add(t); ),必须使用另一个区域(不在 BOrderLayout 中按比例调整大小)或另一个 LayoutManager
-
您的蝴蝶和捕手是两个不同的 JPanel,因此如果您使用 add 方法添加两者而不指定任何布局或区域,它将转到 JFrame 的中心,并且只有您添加的 Jpanel 可见最后,第二件事,如果您使用两个 JPanel,如何捕捉蝴蝶,您只需要一个 Jpanel 即可使游戏正常运行。
标签: java swing object graphics jframe