首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java Paint()问题

Java Paint()问题
EN

Stack Overflow用户
提问于 2011-07-11 19:56:21
回答 3查看 273关注 0票数 2

在这里的第一篇文章,如果我完全不了解所有的规则,请原谅我。

我有一些问题,我对Java还比较陌生,我以前读过这个社区并得到过一些帮助。

我现在有问题,在JFrame上画多个球,我有一些其他学生的解决方案,但没有成功。一个学生现在已经开始工作了,但是通过在框架类中画出我觉得不正确的所有东西,并且把repaint()放到has ()中,这也是错误的。如果有人能指出正确的方向,我会非常感激的。

丹尼尔

代码:Gamejava

代码语言:javascript
复制
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package myanimie;


import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

/**
 *
 * @author Dan
 */
public class Game extends JFrame implements Runnable {


    private Ball myBall = new Ball();
    private Paddle myPad = new Paddle();
    final JPanel jp = new JPanel();
    final JPanel jp1 = new JPanel();
    final JPanel jp2 = new JPanel();



    public Game()
    {
        setVisible(true);        
        setResizable(false);
        setTitle("First Test Animation");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setAlwaysOnTop(true);
        setSize(640,480);


    }

public void run()
    {
    move();
    }

    public void paint(Graphics g)
    {
        super.paint(g);
        myBall.paint(g);
    }

    public void move()
    {

      myBall.start();
      repaint();

        try
        {
            Thread.sleep(50);
        }
        catch (InterruptedException e)
        {
            System.exit(0);
        }
    }
    }

Ball.java

代码语言:javascript
复制
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package myanimie;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.geom.Ellipse2D;

/**
 *
 * @author Dan
 */
public class Ball  extends Thread  {

    Point pos;
    Color ballColor = Color.red;
    Color[] ts = {Color.CYAN,Color.green,Color.black};
    private int yChange = 2;
    private int xChange = 1;



    public Ball()
    {
    pos = new Point();
    pos.x = (int)(Math.random() * (500 - 100)) + 10 ;
    pos.y = (int)(Math.random() * (500/2 - 100)) + 10;

    }




    @Override
    public void run()
    {
     while(true)
    {
       move();

    }
    }

    public void paint(Graphics g)
    {
       g.setColor(ballColor);
       g.fillOval(pos.x - 10, pos.y - 10, 60,60);     

    }


    public void move()
    {
//        System.out.println("y " + pos.y);
//        System.out.println("x " + pos.x);

        if(pos.y < 20)
        {            
            yChange = -yChange;            
            System.out.println("T");
            ballColor = Color.BLUE;
        }
        if(pos.x < 20)
        {
            xChange = -xChange;
            System.out.println("L");
            ballColor = Color.MAGENTA;
        }
        if(pos.x > 620 - 20)
        {
        xChange = -xChange;
        System.out.println("R");
        ballColor = Color.GREEN;
        }
        if(pos.y > 430 - 20)
        {
            yChange = -yChange;
            System.out.println("B");
            ballColor = Color.PINK;
        }
        if(pos.y < 640 - 20)
        {
            pos.translate(xChange, yChange);           
        }
        if(pos.x < 480 - 20 || pos.x > 460)
        {
            pos.translate(xChange, yChange);           
        }   
        }


    public Point getPosition()
    {
        return pos;
    }



    public Ellipse2D area()
    {
        return new Ellipse2D.Double(pos.x, pos.y,60,60);
    }

    }

这是我的可怕代码,我已经绕过错误,但没有动画自动取款机。

谢谢伙计们!你的洞察力是无价的

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-07-11 20:46:59

好吧,一些基于你贴出的代码的一般性意见。

  1. 您需要节流您的move()方法,这样它就不会每秒更新数百万次。我看到在您的Thread.sleep()方法中有一个Game.move。我认为您试图做的是这样的事情:public void (){而(True){//更改游戏状态移动();//将更改绘制到我刚才重新绘制的状态;//等待,然后移动到下一个“框架”尝试{ Thread.sleep(50);} catch ( InterruptedException ie ){}}私有void (){ myBall.move();}
  2. 由于Ball.move()不再循环,所以根本没有Ball扩展Thread。去掉run()方法。您的主游戏循环将由Game集中管理。
  3. 从您的main方法或任何开始运行游戏的人中,在该线程中或在这样的新线程中调用Game.run(): 公共空主(String[] args) {游戏/* =新游戏(.)*/;线程gameThread =新线程(游戏);gameThread.start();}
  4. getPosition()是否有存在的好理由?作为封装状态,这可能更好。
票数 0
EN

Stack Overflow用户

发布于 2011-07-11 20:01:52

“并把重新油漆()中的油漆()”听起来很危险!

repaint()方法会导致对该组件的paint方法的调用。您可以详细说明如何在框架上绘制“多个”球。如果没有什么特别之处,你的答案可能是这里

票数 1
EN

Stack Overflow用户

发布于 2011-07-11 20:06:00

是的,这确实是非常糟糕的做法。在repaint()中调用paint()将导致StackOverflow错误。看看来自伊沃·韦泽尔的游戏引擎伊沃·韦泽尔。我非常喜欢它。

实际上:您应该创建一个JComponent,它覆盖paintComponent(Graphics g)方法。将该JComponent添加到JFrame中。但你不必在乎这个。这将自动完成盆景游戏引擎。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6655743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档