2016-11-04 2 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

Не вызывайте dispose() на созданном вами Graphics или Graphics2D объекте. Этот объект Graphics принадлежит системе рисования. – VGR

+0

Когда я комментирую dispose, программа все еще работает, но это не устраняет проблему. – Millie

ответ

1

Вызовы g2.drawLine перепишет ничего уже окрашенную в графическом контексте. Вы выполняете итерацию по segments в порядке, поэтому любой сегмент сначала в списке будет нарисован первым, и все, что следует за ним, нарисовано над ним. Когда вы создаете новый Segment, вы вносите его в свой список через Segments.add(0, newSegment), который ставит самый новый сегмент в начале списка - это означает, что ваш список имеет сегменты, расположенные от самых новых до самых старых. Чтобы исправить это, вы можете либо перебрать свой список в обратном порядке, либо изменить свой код для рисования сегментов, чтобы новые сегменты добавлялись в конце списка, а не перед ним.

+0

В соответствии с тем, что вы сказали, я уверен, что мне просто нужно изменить строку «Segments.add (0, newSegment());», но для чего я это меняю? – Millie

+0

'segment.add (new Segment())' будет делать, хотя вам также придется изменить свой 'MouseMotionListener' для доступа к новому значению в конце списка. – Sbodd

+0

segment.add (новый сегмент()); была одной из вещей, которые я пробовал. Мне не удалось заставить его работать, но я не знал, что мне также необходимо изменить MouseMotionListener. Я все еще не уверен, как это сделать. Я пытаюсь Collections.reverse (Сегменты), но это не заботится о первом элементе, только те, что после этого. – Millie

Смежные вопросы