为什么它只绘制其中一个组件?

时间:2011-10-11 00:42:24

标签: java swing graphics2d

package puzzle;

import java.awt.Color;
import javax.swing.*;
import java.util.*;


public class Puzzle {

Integer x = 50;
Integer y = 50;
int x2 = 100;
int y2 = 100;
int vnotx = 0;
int vnoty = 0;
float t = 0;
float t2  = 0; 
JFrame frame = new JFrame();
Move m = new Move(x, y,Color.GREEN);
Move n = new Move(x,y,Color.ORANGE);
java.util.Timer timer = new java.util.Timer();
java.util.Timer timer2 = new java.util.Timer();

public Puzzle() {

    frame.setUndecorated(true);
    frame.setSize(400, 400);
    frame.add(m);
    frame.add(n);
    frame.addKeyListener(new java.awt.event.KeyAdapter() {

        public void keyPressed(java.awt.event.KeyEvent evt) {
            formKeyPressed(evt);
        }
    });

    com.sun.awt.AWTUtilities.setWindowOpacity(frame, 1f);
    timer.scheduleAtFixedRate(new TimerTask() {

        public void run() {
            rD();
        }
    }, 0, 20);

       timer2.scheduleAtFixedRate(new TimerTask() {

        public void run() {
          t2+=.01;
              x2 =(int) ((Math.cos(t2)+1)*100);
              y2 =(int) ((Math.sin(t2)+1)*100);
              System.out.println(x2+", "+y2);
        }
    }, 0, 2);
}
int z = 0; 
public void rD() {
   z++;

    m = new Move(x, y, Color.GREEN);
    n = new Move(x2, y2, Color.ORANGE);
    frame.add(n);
    frame.add(m);

    frame.validate();

}

private void formKeyPressed(java.awt.event.KeyEvent evt) {

    int id = evt.getID();
    int kC = evt.getKeyCode();
    if (kC == 39) {
        final java.util.Timer right = new java.util.Timer();
        right.scheduleAtFixedRate(new TimerTask() {

            public void run() {
                t += .01;
                int x1 = x;
                if (x + 51 < 400) {
                    x = x1 + (int) (10 * t) + (-1 * ((int) (20 * t * t)));
                }
                if (t > .5) {
                    t = 0;
                    right.cancel();
                }


            }
        }, 0, 10);


    }
    if (kC == 37) {
        final java.util.Timer left = new java.util.Timer();
        left.scheduleAtFixedRate(new TimerTask() {

            public void run() {
                t += .01;
                int x1 = x;
                if (x - 1 >= 0) {
                    x = x1 + (int) (-10 * t) - (-1 * ((int) (20 * t * t)));
                }
                if (t > .5) {
                    t = 0;
                    left.cancel();
                }


            }
        }, 0, 10);
    }
    if (kC == 40) {
        final java.util.Timer right = new java.util.Timer();
        right.scheduleAtFixedRate(new TimerTask() {

            public void run() {
                t += .01;
                int y1 = y;
                if (y + 51 < 400) {
                    y = y1 + (int) (10 * t) + (-1 * ((int) (20 * t * t)));
                }

                if (t > .5) {
                    t = 0;
                    right.cancel();
                }


            }
        }, 0, 10);
    }
    if (kC == 38) {
        final java.util.Timer left = new java.util.Timer();
        left.scheduleAtFixedRate(new TimerTask() {

            public void run() {
                t += .01;
                int y1 = y;
                if (y-1 >= 0)
                {
                y = y1 + (int) (-10 * t) - (-1 * ((int) (20 * t * t)));
                }
                if (t > .5) {
                    t = 0;
                    left.cancel();
                }


            }
        }, 0, 10);
    }
    if (kC == 32) {
    }
    if (kC == 67) {
    }
    if (kC == 77) {
    }
}

public static void main(String[] args) {
    new Puzzle().frame.setVisible(true);
}
}

为什么不添加move类的两个实例。它只添加最后一个调用。类绘画低于我应该更改的内容,以便它绘制两个移动实例

 package puzzle;
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;

public class Move extends JPanel{

int x; 
int y; 
Color kk; 

public Move(int x1, int y1, Color k)
{
    x=x1;
    y=y1;
    kk = k; 

}
public void paintComponent(Graphics g)
{Graphics2D g2 = (Graphics2D)g;
        super.paintComponent(g2);


    g2.setColor(kk);

    g2.fill(new RoundRectangle2D.Float(x, y, 50, 50,10,10));

    g2.drawString(x+", "+y, 200, 200);

}


}

类移动绘制一个矩形,其中位置和颜色从拼图类传递

2 个答案:

答案 0 :(得分:6)

您是否考虑过布局管理器?您是否知道JFrame的contentPane使用BorderLayout作为其默认布局管理器,如果您在没有常量的情况下向其添加组件,则会添加BorderLayout.CENTER,并且一次只能看到其中一个(最后添加)。

我认为你可以更好地解除Move与JPanel的关联,是的,可以让它变得可以绘制,但是让它更像是一个逻辑对象而不是gui组件而不是让它扩展JPanel,允许单个绘图JPanel保持一个或者更多移动对象,然后在此JPanel的paintComponent方法中绘制Move对象。

此外,您似乎在代码中使用了几个java.util.Timers,但由于它是一个Swing应用程序,因此使用javax.swing.Timers可能会更好,实际上可能只有一个Swing Timer它起到游戏循环的作用。

答案 1 :(得分:3)

if (kC == 39) {

不要使用幻数。

相反,你应该使用:

KeyEvent.VK_???