Dibuja una línea en un JPanel con un clic de botón en Java

Quiero trazar una línea en un JPanel. Esta es mi GUI y quiero una línea en JPanel en blanco.

enter image description here

Encuentro muchos ejemplos pero el problema es cómo usarlo.

En muchos ejemplos, siempre dibujan en un JFrame que se extiende desde un JPanel.

Quiero agregar el Panel al Marco y agregar algunos botones para dibujar líneas en muchas direcciones y usar el botón X en el centro para limpiar el JPanel.

Este es el código de la interfaz:

import java.awt.BorderLayout; import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; import java.awt.Color; import javax.swing.JScrollPane; import javax.swing.JLabel; import javax.swing.ImageIcon; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; public class circuit extends JFrame { private JPanel contentPane; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { circuit frame = new circuit(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public circuit() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 559, 332); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(null); JScrollPane scrollPane = new JScrollPane(); scrollPane.setBounds(10, 21, 359, 255); contentPane.add(scrollPane); JPanel panel = new JPanel(); scrollPane.setViewportView(panel); panel.setBackground(Color.WHITE); JLabel label = new JLabel("New label"); label.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent arg0) { ///////////// } }); label.setIcon(new ImageIcon("C:\\Users\\achermen\\Desktop\\up.png")); label.setBounds(447, 66, 46, 48); contentPane.add(label); JLabel label_1 = new JLabel("New label"); label_1.setIcon(new ImageIcon("C:\\Users\\achermen\\Desktop\\down.png")); label_1.setBounds(447, 159, 46, 48); contentPane.add(label_1); JLabel label_2 = new JLabel("New label"); label_2.setIcon(new ImageIcon("C:\\Users\\achermen\\Desktop\\right.png")); label_2.setBounds(495, 112, 46, 48); contentPane.add(label_2); JLabel label_3 = new JLabel("New label"); label_3.setIcon(new ImageIcon("C:\\Users\\achermen\\Desktop\\left.png")); label_3.setBounds(398, 112, 46, 48); contentPane.add(label_3); JLabel label_4 = new JLabel("New label"); label_4.setIcon(new ImageIcon("C:\\Users\\achermen\\Desktop\\1303860240_list-remove.png")); label_4.setBounds(447, 112, 46, 48); contentPane.add(label_4); } } 

Este es el código para dibujar una línea

 public void paint(Graphics graphics) { graphics.drawLine(10, 20, 300, 310); } 

Entonces, cómo usar estas líneas …

Gracias por adelantado.

Atentamente,

Ali

Puede ser más fácil trazar líneas usando el siguiente enfoque:

  1. haga clic para marcar el primer punto final
  2. arrastre para mostrar la línea en progreso
  3. lanzamiento para marcar el segundo punto final

Este ejemplo relacionado puede ofrecer alguna orientación adicional.

Apéndice

  1. El siguiente ejemplo implementa el esquema anterior.
  2. Actualicé el ejemplo para mostrar cómo usar un panel de botones para afectar el dibujo.
  3. Ver también este ejemplo relacionado que usa la interfaz de Action con enlaces de teclas.
  4. He actualizado este ejemplo para usar enlaces clave .

LinePanel.java

 import java.awt.BasicStroke; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.RenderingHints; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.AbstractAction; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.KeyStroke; /** * @see https://stackoverflow.com/questions/6991648 * @see https://stackoverflow.com/questions/6887296 * @see https://stackoverflow.com/questions/5797965 */ public class LinePanel extends JPanel { 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(); } }); } } 

¿Va a funcionar esto como un grabado al aguafuerte? Entonces necesitas rastrear la posición actual del punto.

  Point current = new Point(0, 0); //for example. 

Luego, cuando el usuario hace clic en los botones, simplemente puede boost o disminuir xey en consecuencia.

En la flecha izquierda:

  current.setX(current.getX() - INC); 

donde INC podría ser una variable que especifica la longitud de la distancia para dibujar la línea. Tal vez 5? Sin embargo, siempre establezca un segundo punto p1 en la ubicación anterior.

Siempre es más fácil crear una clase que extienda Canvas o JPanel para dibujar en lugar de dibujar directamente en JFrame.

p.ej

 public class Circuit extends JFrame { Point p1, current; JPanel drawPanel; //your other declarations public Circuit(){ super(); drawPanel = new DrawPanel(); p1 = new Point(0, 0); current = new Point(0, 0); add(drawPanel, BorderLayout.CENTER); //your other code } class DrawingPanel extends JPanel{ public void paintComponent(Graphics g){ g.drawLine(p1.getX(), p1.getY(), current.getX(), current.getY()); } } //the rest of your code. } 

Hay una respuesta simple para desencadenar gráficos: por ejemplo, el siguiente código se puede colocar dentro de un evento de clic y se usa para dibujar algunos objetos simples en un jPanel. jPanel1 en este caso estaba situado en un lado de una pestaña jPanel7 y al lado del botón de activación. Para hacer esto en la GUI de netbeans, el código se colocó dentro del evento de acción del botón. Una vez que aparezcan los errores habituales por no tener las importaciones adecuadas, haga clic derecho en el código y haga clic en “corregir las importaciones”. Bingo, todo está bien 🙂 Advertencia: el comando setBackground para el panel anulará el objeto gráfico. Si configura el color de fondo sin usar el objeto gráfico, ¡no verá sus objetos!

 Graphics g = jPanel1.getGraphics(); g.setColor(Color.blue); g.drawLine( 0, 50, 20, 50); g.setColor(Color.white); g.fillRect(40, 50, 20, 20); g.setColor(Color.blue); g.drawRect(40, 50, 20, 20); g.drawOval(80, 50, 20, 20); g.setColor(Color.green); g.fillOval(80, 50, 18, 18); 

Esto restaura tu fe en el amor verdadero 🙂 La dificultad aquí es que cualquier cambio o repintado borrará tu esfuerzo. Este enfoque es específicamente desaconsejado por los fundadores de Java. Pero en la versión actual de Netbeans Swing, donde extender el jPanel se dificulta al bloquear los cambios de código, este enfoque podría ser su única solución a corto plazo. Una simple extensión gráfica persistente para jPanel sería una adición muy bienvenida al actual entorno Netbeans Swing, un panel de gráficos. Esto le permitiría arrastrar y soltar el panel de gráficos y luego continuar con el uso impulsado por eventos de ese panel. Otros 40 IDE ya tienen esto, parece que Java ha tardado en agregar esta característica.