Java JApplet中的图形闪烁
我知道这已经被问过很多次了,但每次我访问问题线索,并提出解决方案,它仍然不适用于我 所以在我制造任何混乱之前,我的问题是,我画的屏幕一直在闪烁,这是因为每次我画屏幕时,我用一个完全白色填充的矩形清除屏幕,我在矩形上画的东西都会闪烁 这是我的密码:Java JApplet中的图形闪烁,java,swing,japplet,java-web-start,Java,Swing,Japplet,Java Web Start,我知道这已经被问过很多次了,但每次我访问问题线索,并提出解决方案,它仍然不适用于我 所以在我制造任何混乱之前,我的问题是,我画的屏幕一直在闪烁,这是因为每次我画屏幕时,我用一个完全白色填充的矩形清除屏幕,我在矩形上画的东西都会闪烁 这是我的密码: import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; import java.awt.geom.*; import j
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.geom.*;
import javax.swing.Timer.*;
/**
*
* beschrijving
*
* @version 1.0 van 16-6-2016
* @author
*/
public class shadows3 extends JApplet implements ActionListener{
// Begin variabelen
int[] loc = new int[2];
int[][] wall = new int[10][8];
// Einde variabelen
public void init() {
Container cp = getContentPane();
cp.setLayout(null);
cp.setBounds(0, 0, 600, 600);
// Begin componenten
for (int a=0; a<10; a++) {
int tempx = (int) (Math.random()*20)*30;
int tempy = (int) (Math.random()*20)*30;
wall[a][0] = tempx;
wall[a][1] = tempy;
wall[a][2] = tempx+30;
wall[a][3] = tempy;
wall[a][4] = tempx+30;
wall[a][5] = tempy+30;
wall[a][6] = tempx;
wall[a][7] = tempy+30;
} // end of for
loc[0] = 300;
loc[1] = 300;
Timer step = new Timer(20, this);
step.start();
// Einde componenten
} // end of init
private int length(int x1, int y1, int x2, int y2) {
double distance = Math.sqrt(Math.pow(x1-x2,2)+Math.pow(y1-y2,2));
return (int) distance;
}
// Begin eventmethoden
public void paint (Graphics g){
g.setColor(Color.WHITE);
g.fillRect(0,0,600,600);
int[] xpoints = new int[8];
int[] ypoints = new int[8];
int[] list = new int[3];
for (int a=0; a<5; a++) {
for (int b=0; b<4; b++) {
if (length(wall[a][b*2],wall[a][b*2+1],loc[0],loc[1])==Math.max(Math.max(length(wall[a][0],wall[a][1],loc[0],loc[1]),
length(wall[a][2],wall[a][3],loc[0],loc[1])),
Math.max(length(wall[a][4],wall[a][5],loc[0],loc[1]),
length(wall[a][6],wall[a][7],loc[0],loc[1])))) {
int temp = b;
for (int c=0; c<3; c++) {
temp += 1;
if (temp == 4) {
temp = 0;
} // end of if
list[c] = temp;
} // end of for
} // end of if
} // end of for
xpoints[0] = wall[a][list[0]*2 ];
ypoints[0] = wall[a][list[0]*2+1];
xpoints[1] = wall[a][list[1]*2 ];
ypoints[1] = wall[a][list[1]*2+1];
xpoints[2] = wall[a][list[2]*2 ];
ypoints[2] = wall[a][list[2]*2+1];
xpoints[3] = wall[a][list[2]*2 ]+(wall[a][list[2]*2 ]-loc[0])*10000;
ypoints[3] = wall[a][list[2]*2+1]+(wall[a][list[2]*2+1]-loc[1])*10000;
xpoints[4] = wall[a][list[0]*2 ]+(wall[a][list[0]*2 ]-loc[0])*10000;
ypoints[4] = wall[a][list[0]*2+1]+(wall[a][list[0]*2+1]-loc[1])*10000;
g.setColor(Color.BLACK);
g.fillPolygon(xpoints, ypoints, 5);
//g.fillRect(wall[a][0],wall[a][1],30,30);
} // end of for
}
//@Override
public void actionPerformed(ActionEvent e){
loc[0] += 4;
loc[1] += 2;
repaint();
}
// Einde eventmethoden
} // end of class shadows3
import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
导入javax.swing.event.*;
导入java.awt.geom.*;
导入javax.swing.Timer.*;
/**
*
*贝什里金
*
*@version 1.0 van 16-6-2016
*@作者
*/
公共类shadows3扩展JApplet实现ActionListener{
//开始变奏曲
int[]loc=新的int[2];
int[]wall=新int[10][8];
//埃因德·瓦里贝伦
公共void init(){
容器cp=getContentPane();
cp.setLayout(空);
cp.setBounds(0,060600);
//开始组件
对于(int a=0;a您需要创建一个单独的图像来绘制所有内容:
im=createImage(getWidth(), getHeight());
在init中
然后在你的画作中:
Graphics g2=im.getGraphics();
g2.setColor(Color.WHITE);
g2.fillRect(0,0,600,600);
并继续使用g2替换的所有g命令:
g2.setColor(Color.BLACK);
g2.fillPolygon(xpoints, ypoints, 5);
然后在g上绘制图像:
g.drawImage(im, 0, 0, this);
您有一个更新方法:
public void update(Graphics g) { paint(g); }
您需要创建一个单独的图像来绘制所有内容:
im=createImage(getWidth(), getHeight());
在init中
然后在你的画作中:
Graphics g2=im.getGraphics();
g2.setColor(Color.WHITE);
g2.fillRect(0,0,600,600);
并继续使用g2替换的所有g命令:
g2.setColor(Color.BLACK);
g2.fillPolygon(xpoints, ypoints, 5);
然后在g上绘制图像:
g.drawImage(im, 0, 0, this);
您有一个更新方法:
public void update(Graphics g) { paint(g); }
因为你应该是一个无插件的环境,考虑一个部署的VI.下面的例子显示你的内容在 jPuths/Cuff>中,默认情况下是双缓冲的,特别是
- 调用以避免渲染工件
- 替代以建立初始大小
- 使用常量种子进行实例化,以便于调试
- 注释中的
applet
标记允许轻松测试,如图所示
测试:
代码:
//
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.Graphics;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.util.Random;
导入javax.swing.JApplet;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.Timer;
/**
*@见https://stackoverflow.com/a/37958844/230513
*/
公共类ShadowApplet扩展了JApplet{
私有静态最终随机R=新随机(42);
@凌驾
公共void init(){
EventQueue.invokeLater(()->{
添加(新阴影面板());
});
}
公共静态void main(字符串[]args){
invokeLater(新的ShadowApplet()::display);
}
专用void display(){
JFrame f=新JFrame(“测试”);
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f、 添加(新阴影面板());
f、 包装();
f、 setLocationRelativeTo(空);
f、 setVisible(真);
}
私有静态类ShadowPanel扩展JPanel实现ActionListener{
int[]loc=新的int[2];
int[]wall=新int[10][8];
公共阴影小组(){
此.setLayout(null);
这个.背景(颜色.白色);
对于(int a=0;a<10;a++){
int tempx=R.nextInt(20)*30;
int tempy=R.nextInt(20)*30;
墙[a][0]=温度;
墙[a][1]=坦比;
墙[a][2]=温度+30;
墙[a][3]=坦比;
墙[a][4]=温度+30;
墙[a][5]=坦比+30;
墙[a][6]=温度;
墙[a][7]=坦比+30;
}
loc[0]=300;
loc[1]=300;
定时器步进=新定时器(20,此);
步骤.开始();
}
专用整数长度(整数x1、整数y1、整数x2、整数y2){
双距离=数学sqrt(数学功率(x1-x2,2)+数学功率(y1-y2,2));
返回(int)距离;
}
@凌驾
公共组件(图形g){
超级组件(g);
int[]xpoints=新的int[8];
int[]ypoints=新的int[8];
int[]列表=新int[3];
对于(int a=0;a<5;a++){
对于(int b=0;b<4;b++){
如果(长度(墙[a][b*2],墙[a][b*2+1],位置[0],
loc[1])==数学最大值(数学最大值(长度(墙[a][0],墙[a][1],墙[0],墙[1]),
长度(墙[a][2]、墙[a][3]、位置[0]、位置[1]),
数学最大值(长度(墙[a][4]、墙[a][5]、位置[0]、位置[1]),
长度(墙[a][6],墙[a][7],位置[0],位置[1])){
内部温度=b;
对于(int c=0;c<3;c++){
温度+=1;
如果(温度=4){
温度=0;
}
列表[c]=临时;
}
}
}
xpoints[0]=wall[a][list[0]*2];
ypoints[0]=wall[a][list[0]*2+1];
xpoints[1]=wall[a][list[1]*2];
ypoints[1]=墙[a][list[1]*2+1];
xpoints[2]=wall[a][list[2]*2];
ypoints[2]=墙[a][list[2]*2+1];
xpoints[3]=wall[a][list[2]*2]+(wall[a][list[2]*2]-loc[0])*10000;
ypoints[3]=wall[a][list[2]*2+1]+(wall[a][list[2]*2+1]-loc[1])*10000;
xpoints[4]=wall[a][list[0]*2]+(wall[a][list[0]*2]-loc[0])*10000;
ypoints[4]=wall[a][list[0]*2+1]+(wall[a][list[0]*2+1]-loc[1])*10000;
g、 设置颜色(颜色为黑色);
g、 圆角多边形(XPoint,ypoints,5);
g、 fillRect(墙[a][0