本文介绍了Java小程序重新绘制一个圆形运动的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我刚刚搬了过来,从Pygame的所以Java 2D在一个applet是一个有点新的给我,特别是当它涉及到重绘屏幕。在pygame中你可以简单地做 display.fill([1,1,1]),但我怎么做这在Java的一个小程序?据我所知)使用重绘(但是,这并不清除屏幕 - 从屏幕上任何移动物体是不是'删除'所以你只能画一长排圆圈。

下面是我的code,我一直在与测试:

 包圈;
进口java.applet.Applet中;
进口java.awt.Color中;
进口java.awt.Graphics;
进口java.awt.Graphics2D中;
进口了java.util.Random;公共类圆形扩展的Applet实现Runnable {
    私有静态最后的serialVersionUID长= -6945236773451552299L;
    静态随机R =新随机();    弦乐味精=点击播放!;
    静态INT W = 800,H = 800;    INT [] txtPos = {(W / 2)-50,(H / 2)-50};
    INT [] = radiusRange {5,25};
    INT []圈子;
    静态INT [] POSRANGE;    INT X = 0,Y = 0;
    INT半径= 0;
    INT cursorRadius = 10;    布尔游戏= FALSE;    公共静态INT [] POS(){
        INT侧= r.nextInt(5-1)+ 1;
        开关(侧){
            情况1:
                POSRANGE =新INT [] {1,r.nextInt(w)的,r.nextInt((H + 40)-h)+ H,r.nextInt(270-90)+90};
                打破;
            案例2:
                POSRANGE =新INT [] {2,r.nextInt((W + 40)-w)+ W,r.nextInt(h)中,r.nextInt(270-90)+90};
                打破;
            案例3:
                POSRANGE =新INT [] {3,r.nextInt(w)的,r.nextInt(40)-40,r.nextInt(180)};
                打破;
            情况4:
                POSRANGE =新INT [] {4,r.nextInt(40)-40,r.nextInt(h)中,r.nextInt(180)};
                打破;
        }
        的System.out.println(侧面);
        返回POSRANGE;
    }
    公共无效的start(){
        的setSize(500,500);
        的setBackground(Color.BLACK);
        新的Thread(本)。开始();
    }    公共无效的run(){    }
    公共无效更新(图形G){
        油漆(G);
    }    公共无效漆(图形E){
        Graphics2D的G =(Graphics2D的)电子;        如果(System.currentTimeMillis的()%113 == 0){
            X + = 1;
            Y + = 1;
        }        g.setColor(Color.BLUE);
        g.fillOval(X,Y,20,20);        重绘();
    }
}


解决方案

  1. 您需要调用 super.paint(G); 油漆方法,以不能离开油漆文物。


  2. 不要调用重绘()油漆方法内


  3. 不要显式调用油漆,如您在做的update(),当你的意思调用 reapaint()


  4. 刚刚更新 X 更新里面的值( )方法,然后调用重绘()


  5. 您不必采取 A 图形参数的update()


  6. 您需要调用更新()某处反复循环,因为它更新 X reapint()取值


  7. 如果你的类将是一个的Runnable ,那么你应该放在运行一些code()方法。这可能是你应该有你的循环



 进口java.applet.Applet中;
进口java.awt.Color中;
进口java.awt.Graphics;
进口java.awt.Graphics2D中;公共类圆形扩展的Applet实现Runnable {    INT X = 0,Y = 0;    公共无效的start(){
        的setSize(500,500);
        的setBackground(Color.BLACK);
        新的Thread(本)。开始();
    }    公共无效的run(){
        而(真){
            尝试{
                更新();
                视频下载(50);            }赶上(InterruptedException的前){            }
        }
    }    公共无效更新(){
        X + = 5;
        Y + = 6;
        重绘();
    }    公共无效漆(图形E){
        super.paint(E);
        Graphics2D的G =(Graphics2D的)电子;
        g.setColor(Color.BLUE);
        g.fillOval(X,Y,20,20);    }
}


旁注


  • 为什么首先使用小程序。如果必须,为什么要使用AWT Applet的,而不是摇摆 JApplet的?时间升级。

下面是我怎么想的重做的Swing中的整个事情,使用Swing的定时,而不是一个环和视频下载,你应该做的。

 进口java.awt.Color中;
进口java.awt.Dimension中;
进口java.awt.Graphics;
进口java.awt.event.ActionEvent中;
进口java.awt.event.ActionListener;
进口javax.swing.JFrame中;
进口javax.swing.JPanel中;
进口javax.swing.SwingUtilities中;
进口javax.swing.Timer中;公共类圆继承JPanel {
    私有静态最终诠释D_W = 500;
    私有静态最终诠释D_H = 500;    INT X = 0;
    INT Y = 0;
    公共圈(){
        的setBackground(Color.BLACK);        定时器定时器=新定时器(50,新的ActionListener(){
            公共无效的actionPerformed(ActionEvent的五){
                X + = 5;
                Y + = 5;
                重绘();
            }
        });
        timer.start();
    }    @覆盖
    保护无效paintComponent(图形G){
        super.paintComponent方法(G);
        g.setColor(Color.BLUE);
        g.fillOval(X,Y,20,20);    }    @覆盖
    公共尺寸的get preferredSize(){
        返回新的Dimension(D_W,D_H);
    }    公共静态无效的主要(字串[] args){
        SwingUtilities.invokeLater(Runnable的新(){
            公共无效的run(){
                JFrame的帧=新的JFrame();
                frame.add(新圈());
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.pack();
                frame.setLocationRelativeTo(NULL);
                frame.setVisible(真);
            }
        });
    }
}



  • 请参见


  • 请参见


  • 这里的的你来看待和思考。


更新

You can still use it. Just use the JPanel. Take out the main method, and instead of Applet, use a JApplet and just add the JPanel to your applet. Easy as that.

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JApplet;
import javax.swing.JPanel;
import javax.swing.Timer;

public class CircleApplet extends JApplet {

    @Override
    public void init() {
        add(new Circle());
    }

    public class Circle extends JPanel {

        private static final int D_W = 500;
        private static final int D_H = 500;

        int x = 0;
        int y = 0;

        public Circle() {
            setBackground(Color.BLACK);

            Timer timer = new Timer(50, new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    x += 5;
                    y += 5;
                    repaint();
                }
            });
            timer.start();
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.BLUE);
            g.fillOval(x, y, 20, 20);

        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(D_W, D_H);
        }

    }
}

这篇关于Java小程序重新绘制一个圆形运动的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-23 11:37