- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在制作游戏,并希望在我绘制图形的组件上添加按钮。在这个论坛上说我必须在方法“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();
}
}
}
最佳答案
On this forum said I must call method
super.paint()
in methodpaintComponent
你从哪里得到的?
你应该在重写的 paintComponent(..)
中调用 super.paintComponent(g);
,如下所示:
@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( );
}
也不要对 Swing 组件使用 KeyListener
/KeyAdapter
而是使用 KeyBinding
s
不要不必要地扩展JFrame
类
关于java - 哪里需要调用方法 "super.paint()",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14043765/
我正在尝试以编程方式创建位图,但发现绘制带阴影的 Rect 会忽略传入的颜色 arg。我已将事情简化为这种情况 - 代码只是绘制了一个旋转的蓝色方 block ,它应该有一个灰色的影子,但影子总是蓝色
我可以轻松使用为 Paint.NET 制作的插件吗?在我自己的 C# 应用程序中(假设我遵守插件许可)? 我的目标是使某些效果自动化,Paint.NET 似乎有很多。 最佳答案 Paint.NET 以
我很好奇这些方法的作用以及如何使用它们,因为除了 Javadocs 中的单句描述之外似乎没有任何细节: setStrokeJoin setStrokeMiter 有人有一些示例代码或好的描述吗? 最佳
这个问题在这里已经有了答案: Error printing image in PyQt (1 个回答) PyQt print QWidget (1 个回答) 关闭 2 年前。 我试图在 QPixmap
我对这个感到困惑。我尝试按照一些人的建议将 QPainter 移动到它自己的 def ,但它给出了完全相同的错误。这是我创建的 def。 def PaintButtons(self): sol
我遇到这个问题,当我执行 repaint() 时,类中的 paint() 或 update() 方法没有被调用。这是代码: public class BufferedDisplay extends C
我一直在阅读关于 chrome 中的关键渲染路径 here和 here .我对这些资源的理解是“合成”步骤发生在主线程之外,并且依赖于之前的“绘制”步骤,该步骤生成要合成在一起的光栅化图层。 但是,当
在我的应用程序中,用户之一有时会出错并且应用程序崩溃。用户向我发送日志: java.lang.IndexOutOfBoundsException at android.graphics.Paint.
我正在编写简单的画图程序,您可以在其中通过拖动鼠标来绘制任何您想要的东西。您可以更改画笔的颜色和大小,但在这个版本中,当我更改画笔的颜色或大小时,当我通过拖动鼠标再次开始绘制时,之前绘制的所有内容也会
我已经实现了可点击的 Recyclerview 项并设置了 android:background="?selectableItemBackground" 以获得点击效果,但是在检查代码时我发现了这个
这是我使用 firemonkey + Delphi XE2 制作的 Delphi 应用程序的示例。 如您所见,您可以使用 Firemonkey 中的视觉样式“样式书”来自定义窗口框架内大多数内容的外观
我想请教您如何在绘画应用程序中实现自由形式的绘画。鉴于命令对象将包含单击、任意拖动和释放,这将如何必然存储在命令中并绘制到位图上下文中? 对于初学者来说,数据是否只是放在一个大列表中的 mousemo
似乎显而易见的答案是否定的,但我还是想找出答案。 如果我的面板中有很多复杂的组件,需要一段时间才能加载,然后在顶部有另一个非常基本的面板,完全覆盖它,背景面板是否仍会在 paint 方法中绘制? 最佳
首先是code: import 'package:flutter/cupertino.dart'; class Test extends StatelessWidget { @override
import java.awt.*; import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.Ac
我的java代码有问题。我想做一个画家程序,但每当我选择一个形状并绘制它时之前绘制的所有形状都变得与此形状相同。这是代码。我知道问题出在 paintComponent 中的 for 语句,但我可以用什
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
这是代码,正方形会渲染但不会移动,即使它应该渲染每个循环。问题似乎出在 Core 类的 run() 中 package com.game; import java.awt.*; import
这里的问题是调用了paintComponent()方法,它获取了fillRect()所需的变量,但在按下按键后实际上并没有绘制任何东西。我不明白为什么,因为每次按下 D 键时 mato.getPosi
程序未在屏幕上显示我的 Oval。我没有收到任何错误,所以我有点停滞不前。我查看了我的另一个程序,我几乎逐字编写了它。 游戏.java public class Game extends JPanel
我是一名优秀的程序员,十分优秀!