Podczas przeciągania myszy narysuj linię na panelu Jpanel
Chcę narysować 2 (lub więcej) linii na JPanel, gdy mysz się przeciąga. Kiedy używamsuper.paintComponent(g)
w moim kodzie nie mogłem narysować 2 linii na panelu, ale kiedy nie używamsuper.paintComponent(g)
; wynik jest brzydki, jak na poniższym zdjęciu:
Rozumiem, dlaczego tak się zachowywały.
Jak narysować linie na panelu Jpanel podczas przeciągania myszą? BTW, linia narysowana przezg2d.draw(line2d)
czasami nie jest to gładka linia (zdjęcie poniżej)
Moje kody do tej pory:
<code>import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; import java.awt.geom.Line2D; import java.util.ArrayList; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.WindowConstants; public class LineDrawing extends JPanel implements MouseMotionListener, MouseListener{ Point point1; Point point2; Line2D line2d; public LineDrawing(){ super(); addMouseListener(this); addMouseMotionListener(this); } @Override public void paintComponent(Graphics g){ //super.paintComponent(g); Graphics2D g2d = (Graphics2D) g; if(point1!=null && point2!=null){ g2d.setPaint(Color.RED); g2d.setStroke(new BasicStroke(1.5f)); g2d.draw(line2d); } } @Override public void mouseDragged(MouseEvent e) { point2 = e.getPoint(); line2d = new Line2D.Double(point1, point2); repaint(); } @Override public void mouseMoved(MouseEvent e) { } @Override public void mouseClicked(MouseEvent e) { } @Override public void mousePressed(MouseEvent e) { point1 = e.getPoint(); } @Override public void mouseReleased(MouseEvent e) { } @Override public void mouseEntered(MouseEvent e) { } @Override public void mouseExited(MouseEvent e) { } public static void main(String a[]){ EventQueue.invokeLater(new Runnable(){ @Override public void run() { JFrame frame = new JFrame(); LineDrawing linedraw= new LineDrawing(); frame.add(linedraw); frame.setSize(500,500); frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); frame.setVisible(true); } }); } </code>
}