2016-06-21 4 views
0

これまでに何度も尋ねられてきたことは知っていますが、質問スレッドにアクセスして解決策を実行するたびに、それはまだ機能しません。グラフィックスがJAppletで点滅する

私は混乱を招く前に、私が持っている問題は、描画する画面が常に点滅しているということです。これは画面を描画するたびに完全に白く塗りつぶされた四角形長方形の上に点滅します。ここで

が私のコードです:

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 

あなたは、私が作成しようとしているかと思っているなら、それはリアルタイムの影エンジンの一部のようなものだ、それはかなり遅いですが、それだけで楽しいプロジェクトです、私のプロジェクトの多くでは画面の点滅が問題になります。

事前に感謝します。 initの中

im=createImage(getWidth(), getHeight()); 

+1

1)理由コードアプレット?教師がそれを指定している場合は、[CS教師が** Javaアプレットを教えるのを止めるべき理由](http://programmers.blogoverflow.com/2013/05/why-cs-teachers-should -stop-teaching-java-applets /)を使用します。 2)[Java Plugin support deprecated](http://www.gizmodo.com.au/2016/01/rest-in-hell-java-plug-in/)および[Plugin-Free Webへの移動]を参照してください( https://blogs.oracle.com/java-platform-group/entry/moving_to_a_plugin_free)。 –

答えて

1

あなたは上のすべてのものを描くために別々の画像を作成する必要があります。あなたの塗料で次に

Graphics g2=im.getGraphics(); 
g2.setColor(Color.WHITE); 
g2.fillRect(0,0,600,600); 

とG2に置き換え、すべてのグラムコマンドを続行:

g2.setColor(Color.BLACK); 
g2.fillPolygon(xpoints, ypoints, 5); 

、あなたがグラム上の画像を描画:

g.drawImage(im, 0, 0, this); 

と更新方法があります:

public void update(Graphics g) { paint(g); } 
+0

多くのおかげで、私はまたこれを試してみます – Lolslayer

2

プラグインを使用しない環境でmigratingになるため、hybridを配備したとします。以下の例では、コンテンツをJPanelに表示しています。デフォルトではダブルバッファーされています。具体的には、

  • super.paintComponent()を呼び出してレンダリングアーチファクトを回避します。

  • getPreferredSize()を上書きして初期サイズを設定します。

  • Randomを簡単なデバッグのために定数シードでインスタンス化します。

  • コメント内のappletタグは、hereのように簡単なテストが可能です。

image

試験:

$ javac ShadowApplet.java ; appletviewer ShadowApplet.java 

コード:

//<applet code="ShadowApplet.class" width=600 height=600></applet> 
import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.Random; 
import javax.swing.JApplet; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.Timer; 

/** 
* @see https://stackoverflow.com/a/37958844/230513 
*/ 
public class ShadowApplet extends JApplet { 

    private static final Random R = new Random(42); 

    @Override 
    public void init() { 
     EventQueue.invokeLater(() -> { 
      add(new ShadowPanel()); 
     }); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new ShadowApplet()::display); 
    } 

    private void display() { 
     JFrame f = new JFrame("Test"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(new ShadowPanel()); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    private static class ShadowPanel extends JPanel implements ActionListener { 

     int[] loc = new int[2]; 
     int[][] wall = new int[10][8]; 

     public ShadowPanel() { 
      this.setLayout(null); 
      this.setBackground(Color.WHITE); 
      for (int a = 0; a < 10; a++) { 
       int tempx = R.nextInt(20) * 30; 
       int tempy = R.nextInt(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; 
      } 
      loc[0] = 300; 
      loc[1] = 300; 
      Timer step = new Timer(20, this); 
      step.start(); 
     } 

     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; 
     } 

     @Override 
     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      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; 
          } 
          list[c] = temp; 
         } 
        } 
       } 
       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); 
      } 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      loc[0] += 4; 
      loc[1] += 2; 
      repaint(); 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(600, 600); 
     } 
    } 
} 
+0

ありがとう、私は間違いなくそれを見てみましょう – Lolslayer