2016-11-04 6 views
0

より理解を深めるために、私はプログラムを実行することをお勧めしますが、基本的には私が行を描画するたびに、新しい行はそれの上に。私はそれがほんのわずかな論理エラーだと確信していますが、このようなものを修正する方法に関する提案は素晴らしいでしょう。コードは以下の通りです。コンパイルされ、実行可能です。黒い背景に消去ボタンを白にして、何が起きているのかを確認することができます。ありがとう!ペイントはその上にではなく、線の下に描画されています - Java

import java.awt.*; 
import java.awt.event.*; 
import java.awt.geom.*; 
import java.util.ArrayList; 
import java.util.List; 
import javax.swing.*; 

public class SimplePaint extends JFrame implements ActionListener { 

    private static final long serialVersionUID = 1L; 
    JButton action = new JButton(); 
    JButton red = new JButton(); 
    JButton blue = new JButton(); 
    JButton yellow = new JButton(); 
    Color initial = Color.MAGENTA; 
    JButton thin = new JButton(); 
    JButton medium = new JButton(); 
    JButton thick = new JButton(); 
    Stroke stroke = new BasicStroke(3); 
    private static ArrayList<Point> points = new ArrayList<Point>(); 

    JButton erase = new JButton(); 
    JButton drawing = new JButton(); 
    Point start = null; 
    Point end = null; 
    Line2D draw = new Line2D.Float(); 
    JPanel panel = new JPanel(); 

    private class Segment { 
     private final List<Point> points = new ArrayList<Point>(); 
     private final Color color = initial; 
     private final Stroke stroke = SimplePaint.this.stroke; 
    } 

    private final List<Segment> segments = new ArrayList<>(); 

    public SimplePaint() { 
     getContentPane().add(panel); 
     setSize(450, 450); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     design(); 

     addMouseListener(new MouseAdapter() { 
      public void mousePressed(MouseEvent e) { 
       segments.add(0, new Segment()); 
      } 
     }); 

     addMouseMotionListener(new MouseMotionAdapter() { 
      public void mouseDragged(MouseEvent e) { 
       segments.get(0).points.add(e.getPoint()); 
       repaint(); 
      } 
     }); 

     addMouseMotionListener(new MouseMotionAdapter(){ 

      @Override 
      public void mouseDragged(MouseEvent e){ 
       points.add(e.getPoint()); 
       repaint(); 
      } 
     }); 

     blue.addActionListener(this); 
     red.addActionListener(this); 
     yellow.addActionListener(this); 
     thin.addActionListener(this); 
     medium.addActionListener(this); 
     thick.addActionListener(this); 
     erase.addActionListener(this); 
     drawing.addActionListener(this); 
    } 

    public void design() { 
     panel.setBackground(Color.BLACK); 

     blue.setBackground(Color.BLUE); 
     blue.setPreferredSize(new Dimension(50, 25)); 
     panel.add(blue); 

     red.setBackground(Color.RED); 
     red.setPreferredSize(new Dimension(50, 25)); 
     panel.add(red); 

     yellow.setBackground(Color.yellow); 
     yellow.setPreferredSize(new Dimension(50, 25)); 
     panel.add(yellow); 

     thin.setText("Thin"); 
     panel.add(thin); 

     medium.setText("Medium"); 
     panel.add(medium); 

     thick.setText("Thick"); 
     panel.add(thick); 

     erase.setText("Erase"); 
     panel.add(erase); 

     drawing.setText("Draw"); 
     panel.add(drawing); 
    } 

    public void actionPerformed(ActionEvent e) { 
     if(e.getSource() == blue){ 
      initial = Color.BLUE; 
     }else if(e.getSource() == red){ 
      initial = Color.RED; 
     }else if(e.getSource() == yellow){ 
      initial = Color.YELLOW; 
     }else if(e.getSource() == thin){ 
      stroke = new BasicStroke(1); 
     }else if(e.getSource() == medium){ 
      stroke = new BasicStroke(5); 
     }else if(e.getSource() == thick){ 
      stroke = new BasicStroke(10); 
     }else if(e.getSource() == erase){ 
      initial = Color.WHITE; 
      stroke = new BasicStroke(15); 
     } 

     //repaint(); 
    } 

    @Override 
    public void paint(Graphics g) { 
     super.paint(g); 
     Graphics2D g2 = (Graphics2D) g; 

     int x1, y1, x2, y2; 

     for (Segment segment : segments) { 
      g2.setColor(segment.color); 
      g2.setStroke(segment.stroke); 

      for (int p = 0; p < segment.points.size() - 1; p++) { 
       x1 = segment.points.get(p).x; 
       y1 = segment.points.get(p).y; 
       x2 = segment.points.get(p + 1).x; 
       y2 = segment.points.get(p + 1).y; 
       g2.drawLine(x1, y1, x2, y2); 


      } 

     } 
     g2.dispose(); 

    } 

    public static void main(String []args){ 
     SimplePaint s = new SimplePaint(); 
     s.setVisible(true); 
    } 
} 
+0

作成したGraphicsまたはGraphics2Dオブジェクトに対してdispose()をコールしないでください。そのGraphicsオブジェクトはペインティングシステムに属します。 – VGR

+0

私が処理をコメントアウトすると、プログラムはまだ実行されますが、問題は解決しません。 – Millie

答えて

1

g2.drawLineを呼び出すと、すでにグラフィックスコンテキストに描画されているものがすべて上書きされます。 segmentsを順番に繰り返しているので、最初にリスト内にあるセグメントが最初に描画され、その後に続くすべてが描画されます。新しいSegmentを作成すると、Segments.add(0, newSegment)でリストに挿入されます。これにより、リストの先頭に最新のセグメントが挿入されます。リストには、最新から古いものにセグメントが並べられています。これを修正するには、リストを逆順に繰り返したり、セグメントのペイントコードを変更して、新しいセグメントがリストの最後に追加されるようにします。

+0

あなたが言ったことによると、私はちょうど "Segments.add(0、newSegment());"という行を変更する必要があると確信しています。 – Millie

+0

'segments.add(new Segment())'が実行しますが、リストの最後に新しい値にアクセスするには 'MouseMotionListener'も変更する必要があります。 – Sbodd

+0

segments.add(新しいSegment());私が試したことの一つでした。私はそれを動作させることができませんでしたが、私もMouseMotionListenerを変更する必要があることを認識していませんでした。私はまだこれを行う方法がわかりません。私はCollections.reverse(Segments)を試していますが、それは最初の要素を処理しません。 – Millie

関連する問題