我一直在制作游戏,并希望在我绘制数字的组件上添加按钮。在这个论坛上说我必须在方法“paintComponent”中调用方法“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;
}
主要课程
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();
}
}
}
答案 0 :(得分:2)
在这个论坛上说我必须在方法中调用方法
super.paint()
paintComponent
你从哪里得到的?
您应该像重写super.paintComponent(g);
一样调用paintComponent(..)
:
@Override
protected void paintComponent(Graphics graphics)
{
super.paintComponent(graphics);
//do other drawings here
drawer = (Graphics2D)graphics;
DrawRectangles(drawer);
drawer.setColor(Color.YELLOW);
drawer.fill(pusherFoot);
MoveFootRectangle(pusherFoot);
drawer.setColor(Color.GREEN);
drawer.fill(ball);
MoveBall( );
}
也不要将KeyListener
/ KeyAdapter
用于Swing组件而是使用KeyBinding
s
不要不必要地延长JFrame
课程