2
我一直在制作游戏,并希望在绘制图形的组件上添加按钮。在这个论坛上说我必须在方法“paintComponent”中调用方法“super.paint()”,但是我的程序工作不正确。我不明白我必须将这种方法称为何处。可能是我必须使用容器。谢谢你的帮助。哪里需要调用方法“super.paint()”
package mygame;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Ellipse2D;
import java.awt.geom.RoundRectangle2D;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.Timer;
public class DrawPictures extends JComponent
{
static
{
flagLeft = true;
flagLeft = true;
}
public void setStringForMoveBall(String string)
{
stringForMoveBall = string;
}
public String getStringForMoveBall()
{
return stringForMoveBall;
}
public DrawPictures()
{
start = new JButton("Start game");
stop = new JButton("Stop game");
changeColorBall = 0;
stringForMoveBall = "";
this.offset = 8;
marginBetweenRectangles = 70;
height = radiusWidth = 50;
top = radiusHeight = 30;
width = 60;
left = 20;
this.counter = 11;
rectangles = new ArrayList<RoundRectangle2D>();
ball = new Ellipse2D.Double(400,570,top, top);
FullCollection(rectangles);
pusherFoot = new RoundRectangle2D.Double(350, 600, 150, 50,radiusWidth,radiusHeight);
panel = new JPanel();
panel.add(stop);
panel.add(start);
add(panel);
timerForBall = new Timer(40, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e)
{
repaint();
}
});
timerForBall.start();
}
private void DrawRectangles(Graphics2D drawer)
{
for(int i = 0; i != rectangles.size(); ++i)
{
if (i % 4 == 0)
{
drawer.setColor(Color.RED);
drawer.fill(rectangles.get(i));
}
else if (i % 3 == 0)
{
drawer.setColor(Color.CYAN);
drawer.fill(rectangles.get(i));
}
else if (i % 5 == 0)
{
drawer.setColor(Color.YELLOW);
drawer.fill(rectangles.get(i));
}
else if (i % 7 == 0)
{
drawer.setColor(Color.WHITE);
drawer.fill(rectangles.get(i));
}
else if (i % 8 == 0)
{
drawer.setColor(Color.MAGENTA);
drawer.fill(rectangles.get(i));
}
else if (i % 9 == 0)
{
drawer.setColor(Color.GREEN);
drawer.fill(rectangles.get(i));
}
else
{
drawer.setColor(Color.ORANGE);
drawer.fill(rectangles.get(i));
}
}
}
@Override protected void paintComponent(Graphics graphics)
{
drawer = (Graphics2D)graphics;
DrawRectangles(drawer);
super.paint(graphics);/*where I must call it*/
drawer.setColor(Color.YELLOW);
drawer.fill(pusherFoot);
MoveFootRectangle(pusherFoot);
drawer.setColor(Color.GREEN);
drawer.fill(ball);
MoveBall();
}
private void CheckHitBallWithRectangles()
{
for(int i = rectangles.size() - 1; i > 0; --i)
{
if(ball.getMinY() >= rectangles.get(i).getMinY() &&
ball.getMinY() <= rectangles.get(i).getMaxY() &&
ball.getMaxX() >= rectangles.get(i).getMinX() &&
ball.getMaxX() <= rectangles.get(i).getMaxX())
{
if (CompareStringsForMoveBall(""))
{
stringForMoveBall = "DownAndLeftFromTopSide";
rectangles.remove(i);
--i;
}
if(CompareStringsForMoveBall("UpAndRightFromLeftSide"))
{
stringForMoveBall = "DownAndRightFromTopSide";
rectangles.remove(i);
--i;
}
}
if( ball.getMinY() >= rectangles.get(i).getMinY() &&
ball.getMinY() <= rectangles.get(i).getMaxY() &&
ball.getMinX() >= rectangles.get(i).getMinX() &&
ball.getMinX() <= rectangles.get(i).getMaxX())
{
if (CompareStringsForMoveBall(""))
{
stringForMoveBall = "DownAndLeftFromTopSide";
rectangles.remove(i);
--i;
}
}
if (ball.getMaxY() >= rectangles.get(i).getMinY() &&
ball.getMaxY() <= rectangles.get(i).getMaxY() &&
ball.getMaxX() >= rectangles.get(i).getMinX() &&
ball.getMaxX() <= rectangles.get(i).getMaxX())
{
if(CompareStringsForMoveBall("DownAndRightFromTopSide"))
{
stringForMoveBall = "DownAndLeftFromTopSide";
rectangles.remove(i);
--i;
}
if(CompareStringsForMoveBall("UpAndRightFromLeftSide"))
{
stringForMoveBall = "DownAndRightFromTopSide";
rectangles.remove(i);
--i;
}
}
if (ball.getMinX() >= rectangles.get(i).getMinX() &&
ball.getMinX() <= rectangles.get(i).getMaxX()&&
ball.getMinY() >= rectangles.get(i).getMinY() &&
ball.getMinY() <= rectangles.get(i).getMaxY())
{
rectangles.remove(i);
--i;
}
}
}
private void MoveFootRectangle(RoundRectangle2D pusher)
{
if(flagLeft && pusher.getX() >= 0)
{
pusher.setFrame(pusher.getX() - 30, pusher.getY(), 150, 60);
flagLeft = false;
}
if(flagRight && pusher.getX() <= 730)
{
pusher.setFrame(pusher.getX() + 30, pusher.getY(), 150, 60);
flagRight = false;
}
}
public static void SetStatusFlagLeft()
{
flagLeft = true;
}
public static void SetStatusFlagRight()
{
flagRight = true;
}
private void MoveBallYLessNull()
{
if(CompareStringsForMoveBall(""))
{
stringForMoveBall = "DownAndLeftFromTopSide";
}
else if(CompareStringsForMoveBall("UpAndRightFromLeftSide"))
{
stringForMoveBall = "DownAndRightFromTopSide";
}
}
private void MoveBallXLessNull()
{
if ( CompareStringsForMoveBall("DownAndLeftFromTopSide"))
{
stringForMoveBall = "DownAndRightFromTopSide";
}
else if(stringForMoveBall.compareTo("") == 0)
{
stringForMoveBall = "UpAndRightFromLeftSide";
}
}
private void MoveBall()
{
if (CompareStringsForMoveBall(""))
{
ball.setFrame(ball.getX() - offset, ball.getY() - offset, top, top);
}
if (CompareStringsForMoveBall("DownAndLeftFromTopSide"))
{
ball.setFrame(ball.getX() - offset, ball.getY() + offset, top, top);
}
if(ball.getX() < 0 )
{
MoveBallXLessNull();
}
if(ball.getY() < 0)
{
MoveBallYLessNull();
}
if (CompareStringsForMoveBall("UpAndRightFromLeftSide"))
{
ball.setFrame(ball.getX() + offset, ball.getY() - offset, top, top);
}
if (CompareStringsForMoveBall("DownAndRightFromTopSide"))
{
ball.setFrame(ball.getX() + offset, ball.getY() + offset, top, top);
}
if (ball.getMaxY() == pusherFoot.getMinY() &&
ball.getCenterX() > pusherFoot.getMinX()
&& ball.getCenterX() < pusherFoot.getMaxX())
{
MoveBallHitWithFoot();
}
if(ball.getMaxX() > 880)
{
MoveBallForXMoreWidth();
}
CheckHitBallWithRectangles();
}
public void MoveBallForXMoreWidth()
{
if (CompareStringsForMoveBall("DownAndRightFromTopSide"))
{
setStringForMoveBall("DownAndLeftFromTopSide");
}
else if(CompareStringsForMoveBall("UpAndRightFromLeftSide"))
{
setStringForMoveBall("");
}
}
public void MoveBallHitWithFoot()
{
if (CompareStringsForMoveBall("DownAndRightFromTopSide"))
{
setStringForMoveBall("UpAndRightFromLeftSide") ;
}
else if (CompareStringsForMoveBall("DownAndLeftFromTopSide"))
{
setStringForMoveBall("");
}
}
public boolean CompareStringsForMoveBall(String moveforball)
{
if ((getStringForMoveBall()).compareTo(moveforball) == 0)
{
return true;
}
else
{
return false;
}
}
private void FullCollection(ArrayList<RoundRectangle2D> newrectangles)
{
int counterTop = 0;
for(int i = 0; i <= counter; ++i)
{
newrectangles.add(new RoundRectangle2D.Double
(top + counterTop,left,width,height,radiusWidth,radiusHeight));
counterTop += marginBetweenRectangles;
}
counterTop = 0;
for(int i = 0; i <= counter; ++i)
{
newrectangles.add(new RoundRectangle2D.Double
(top + counterTop,left + marginBetweenRectangles,width,height,radiusWidth,radiusHeight));
counterTop += marginBetweenRectangles;
}
counterTop = 0;
for(int i = 0; i <= counter; ++i)
{
newrectangles.add(new RoundRectangle2D.Double
(top + counterTop,left + marginBetweenRectangles * 2,width,height,radiusWidth,radiusHeight));
counterTop += marginBetweenRectangles;
}
}
private ArrayList<RoundRectangle2D> rectangles;
private Ellipse2D ball;
private int width,left,top,height, counter,radiusWidth,
radiusHeight,marginBetweenRectangles,offset,changeColorBall;
private RoundRectangle2D pusherFoot;
private Timer timerForBall;
private static boolean flagLeft,flagRight;
private String stringForMoveBall;
private Graphics2D drawer;
private JButton start,stop;
private JPanel panel;
}
对帧附加部件
package mygame;
import javax.swing.JFrame;
public class FrameForGame extends JFrame
{
public FrameForGame()
{
setTitle("MyGame");
setSize(WIDTH_H, HEIGHT_H);
setLocation(150, 50);
DrawPictures pictures = new DrawPictures();
event = new ForEvents();
addKeyListener(event);
add(pictures);
}
private int WIDTH_H = 1200;
private int HEIGHT_H = 700;
private ForEvents event;
}
Main类
package mygame;
import java.awt.EventQueue;
import javax.swing.JFrame;
public class MyGame {
/**
* @param args the command line arguments
*/
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable() {
@Override
public void run()
{
FrameForGame button = new FrameForGame();
button.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
button.setVisible(true);
}
});
}
}
类从键盘的类进行处理
package mygame;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JOptionPane;
/**
*
* @author TNV
*/
public class ForEvents extends KeyAdapter implements KeyListener
{
@Override
public void keyPressed(KeyEvent ke)
{
if(ke.getKeyCode() == KeyEvent.VK_LEFT)
{
//JOptionPane.showMessageDialog(null, "Hello");
DrawPictures.SetStatusFlagLeft();
}
if(ke.getKeyCode() == KeyEvent.VK_RIGHT)
{
DrawPictures.SetStatusFlagRight();
}
}
}
here - http://stackoverflow.com/questions/14038571/extends-from-jcomponent-and-class-jbutton 谢谢你的回答:)!但是在哪里(在方法paintComponent中)我必须编写调用方法“super.paintComponent(g);” 抽屉=(Graphics2D)图形; DrawRectangles(drawer); drawer.setColor(Color.YELLOW); drawer.fill(pusherFoot); MoveFootRectangle(pusherFoot); drawer.setColor(Color.GREEN); drawer.fill(ball); MoveBall(); super.paintComponent(抽屉);/*我必须称之为*/ } –
@AndrewValevskiy我看到也许是一个错字或只是一个缩短...但它是为了'paintComponent' –
@AndrewValevskiy看到我的更新你必须将其视为第一次调用覆盖方法 –