Maison >Java >javaDidacticiel >Comment dessiner des lignes dans un JPanel en utilisant des clics de souris et en faisant glisser ?
Dessiner des lignes dans un JPanel avec un clic sur un bouton
Problème :
Quelqu'un veut dessiner lignes dans un JPanel lorsqu'un bouton est cliqué mais rencontre des difficultés dues à une mauvaise compréhension du dessin processus.
Solution :
Pour tracer des lignes dans un JPanel, une approche différente est suggérée :
Implémentation :
Le code suivant illustre l'implémentation :
<br>import java. awt.BasicStroke;<br>importer java.awt.Color;<br>importer java.awt.Dimension;<br>importer java.awt.Graphics;<br>importer java.awt.Graphics2D;<br>importer java.awt.Point;<br>importer java.awt.RenderingHints;<br>importer java.awt.event.ActionEvent;<br>importation java.awt.event.KeyEvent;<br>importer java.awt.event.MouseAdapter;<br>importer java.awt.event.MouseEvent;<br>importer javax.swing.AbstractAction;<br>importer javax.swing. JButton;<br>importer javax.swing.JFrame;<br>importer javax.swing.JPanel;<br>import javax.swing.KeyStroke;</p> <p>classe publique LinePanel étend JPanel {</p> <pre class="brush:php;toolbar:false">private MouseHandler mouseHandler = new MouseHandler(); private Point p1 = new Point(100, 100); private Point p2 = new Point(540, 380); private boolean drawing; public LinePanel() { this.setPreferredSize(new Dimension(640, 480)); this.addMouseListener(mouseHandler); this.addMouseMotionListener(mouseHandler); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2d = (Graphics2D) g; g2d.setColor(Color.blue); g2d.setRenderingHint( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.setStroke(new BasicStroke(8, BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL)); g.drawLine(p1.x, p1.y, p2.x, p2.y); } private class MouseHandler extends MouseAdapter { @Override public void mousePressed(MouseEvent e) { drawing = true; p1 = e.getPoint(); p2 = p1; repaint(); } @Override public void mouseReleased(MouseEvent e) { drawing = false; p2 = e.getPoint(); repaint(); } @Override public void mouseDragged(MouseEvent e) { if (drawing) { p2 = e.getPoint(); repaint(); } } } private class ControlPanel extends JPanel { private static final int DELTA = 10; public ControlPanel() { this.add(new MoveButton("\u2190", KeyEvent.VK_LEFT, -DELTA, 0)); this.add(new MoveButton("\u2191", KeyEvent.VK_UP, 0, -DELTA)); this.add(new MoveButton("\u2192", KeyEvent.VK_RIGHT, DELTA, 0)); this.add(new MoveButton("\u2193", KeyEvent.VK_DOWN, 0, DELTA)); } private class MoveButton extends JButton { KeyStroke k; int dx, dy; public MoveButton(String name, int code, final int dx, final int dy) { super(name); this.k = KeyStroke.getKeyStroke(code, 0); this.dx = dx; this.dy = dy; this.setAction(new AbstractAction(this.getText()) { @Override public void actionPerformed(ActionEvent e) { LinePanel.this.p1.translate(dx, dy); LinePanel.this.p2.translate(dx, dy); LinePanel.this.repaint(); } }); ControlPanel.this.getInputMap(WHEN_IN_FOCUSED_WINDOW) .put(k, k.toString()); ControlPanel.this.getActionMap() .put(k.toString(), new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { MoveButton.this.doClick(); } }); } } } private void display() { JFrame f = new JFrame("LinePanel"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.add(this); f.add(new ControlPanel(), BorderLayout.SOUTH); f.pack(); f.setLocationRelativeTo(null); f.setVisible(true); } public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { new LinePanel().display(); } }); }
}
Ce code fournit la fonctionnalité permettant de tracer des lignes en utilisant des clics de souris, un glisser-déposer et un relâchement, ainsi qu'un panneau de boutons pour contrôler le mouvement de la ligne.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!