私はゲームを作っていて、図を描いてボタンを追加するコンポーネントが必要です。このフォーラムでは、メソッド「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();
}
}
}