2017-07-28 3 views
1
import javax.swing.*; 
import java.awt.*; 

public class Test1 { 
int x = 70; 
int y = 70; 

public static void main (String[] args) { 
    Test1 gui = new Test1(); 
    gui.go(); 
} 
public void go() { 
    JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    MyDrawPanel drawPanel = new MyDrawPanel(); 
    frame.getContentPane().add(drawPanel); 
    frame.setSize(300,300); 
    frame.setVisible(true); 

    for (int i = 0; i < 130; i++) { 
     x++; y++; 
     drawPanel.repaint(); 
     try { Thread.sleep(50); 
     } catch(Exception ex) { } } 
}// close go() method 

class MyDrawPanel extends JPanel { 
    public void paintComponent(Graphics g) { 
     g.setColor(Color.green); 
     g.fillOval(x,y,40,40); 
    } 
} // close inner class 
} // close outer class 

​​page2この円が塗抹されませんでしたなぜ

は2ページによると、円はフレームにまみれする必要があります...しかし、私はそれを実行したときに実際に、それはちょうどスミアなく移動します。それはなぜですか? btw、これらのコードがスミアリングサークルを作成できなかった場合、どうすればスミアリングを作成できますか?

歓声

+1

どのようなOSですか.......? – MadProgrammer

+0

OSX ............ –

+1

これは、Mac上での実装方法に関連する問題です。コードがぼかしなしで動作することを確認できます。 – MadProgrammer

答えて

1

hereを示すように、 "あなたはopaque propertyを尊重していない場合、あなたはおそらく†は、視覚的なアーティファクトが表示されます。"実際に、Java 6を使用してMac OS Xであなたの例を実行すると、「塗りつぶされた」ように見える一連の円が生成されます。

image

どのように私は、スミアリング1を作ることができますか?

  • ないは、望ましい結果を得るためにpainting artifactsに頼るを行います。代わりにList<Shape>を次のようにレンダリングします。

  • javax.swing.Timerを使用してアニメーションをペースします。

  • のみを作成して操作します。

  • getPreferredSize()を上書きして、描画パネルの初期ジオメトリを設定します。

コード:重点鉱山†

import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.geom.Ellipse2D; 
import java.util.ArrayList; 
import java.util.List; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.Timer; 

public class Test2 { 

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

    public void display() { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     final MyDrawPanel drawPanel = new MyDrawPanel(); 
     frame.add(drawPanel); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    class MyDrawPanel extends JPanel { 

     private int x = 30; 
     private int y = 30; 
     private final List<Shape> list = new ArrayList<>(); 

     public MyDrawPanel() { 
      new Timer(50, (new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        x++; 
        y++; 
        list.add(new Ellipse2D.Double(x, y, 40, 40)); 
        repaint(); 
       } 
      })).start(); 
     } 

     @Override 
     public void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g; 
      g.setColor(Color.green); 
      for (Shape s : list) { 
       g2d.fill(s); 
      } 
     } 

     @Override 
     public Dimension getPreferredSize() { 
      return new Dimension(300, 300); 
     } 
    } 
} 

+1

クール、ありがとう –

関連する問題