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