有没有人曾尝试使用Swing构建一个合适的多缓冲渲染环境,在此环境中可以添加Swing用户界面元素?
在这种情况下,我有一个动画红色矩形绘制在背景上.背景不需要每帧更新,因此我将其渲染到BufferedImage上,并仅重绘清除矩形的先前位置所需的部分.请参见下面的完整代码,这扩展了以前的线程通过@trashgod给出的例子,在这里.
到现在为止还挺好; 流畅的动画,低CPU使用率,无闪烁.
然后我将JTextField添加到Jpanel(通过单击屏幕上的任何位置),并通过在文本框内单击来关注它.现在,清除矩形的先前位置会在每个光标闪烁时失败,请参见下图.
我很好奇是否有人知道为什么会发生这种情况(Swing不是线程安全的?图像是异步绘制的?)以及寻找可能解决方案的方向.
这是在Mac OS 10.5,Java 1.6上
JPanel重绘失败了http://www.arttech.nl/javaredrawerror.png
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.Transparency;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.Timer;
public class NewTest extends JPanel implements
MouseListener,
ActionListener,
ComponentListener,
Runnable
{
JFrame f;
Insets insets;
private Timer t = new Timer(20, …Run Code Online (Sandbox Code Playgroud) 我正在写一个游戏.我需要知道如何将点b绕点b旋转给定的度数.我在java中写这个,它将成为我的班级的一部分,Point.
我正在尝试编写一个程序,它将绘制围绕中心点旋转的几个形状.结果应该像Spirograph.我正在尝试使用矩形测试它,但我只能让其中两个出现在窗口中.其中一个应该是它应该的位置,但是在第一次旋转之后,它将另一个方向向上抛向窗口的左上角.它应该围绕中心点旋转和绘制.这是我的一部分代码.
import java.awt.*;
import java.awt.geom.Ellipse2D;
import javax.swing.JPanel;
public class Shapes extends JPanel
{
private double angle;
private int type;
private int radius;
private int repeats;
public Shapes(int t, int r, int z)
{
type = t;
radius = r;
repeats = z;
angle = 360 / repeats;
}
public void paintComponent( Graphics g )
{
super.paintComponent( g );
Graphics2D g2d = (Graphics2D)g;
g.setColor(Color.red);
int centerX = getWidth()/2;
int centerY = getHeight()/2;
double curAngle = 0;
for(int i=0; i<=repeats; i+=1)
{ …Run Code Online (Sandbox Code Playgroud) 我在Java中有一个简单的动画,它包含一个在窗口移动的轮子.它只是一个从左边开始离开屏幕的普通圆圈,进入并继续向右,直到它离开屏幕.然后它循环并重复这个过程.
X是一个包含车轮位置的变量.它可以在 - (车轮宽度)和窗口尺寸+车轮宽度之间.
我想通过在这个轮子中画一个圆圈来模拟旋转,它围绕圆圈旋转,好像它是连在一起的.
想象一下现实生活中的自行车车轮,车轮上有一面红旗.随着车轮的旋转,当车轮前进时,车轮边缘会出现红旗.这是我想要的行为.
我得到一个百分比来传递到我的轮子类这样:
int percentage = x/windowWidth;
Run Code Online (Sandbox Code Playgroud)
我打电话给车轮移动的每个车架wheel.rotate(percentage).
这是实施:
private int diameter = 50;
private final int SPOKE_DIAMETER = diameter/5;
public void rotate(double percent){
this.percent = percent;
this.theta = percent*(PI*2);
System.out.println(percent*PI);
}
public void paintComponent(Graphics canvas)
{
// wheel
canvas.setColor(Color.gray);
canvas.fillOval(0, 0, diameter, diameter);
// spinning flag
canvas.setColor(Color.red);
canvas.fillOval((int)(percent*diameter),(int)((sin((percent*(PI*2)))*diameter)), SPOKE_DIAMETER,SPOKE_DIAMETER);
}
Run Code Online (Sandbox Code Playgroud)
x位置或多或少地工作我想要的,但是y没有.它像一股浪潮一样摆动,这是预期的(我确实使用了罪......),然而,我不知道如何改变我的数学来跟随周围的圆圈.
我的实施有什么问题?(我用三角函数绘图不是很好)