Disegna una linea in un JPanel con un clic del pulsante in Java

Voglio tracciare una linea in un JPanel. Questa è la mia GUI e voglio una linea in JPanel in bianco.

inserisci la descrizione dell'immagine qui

Trovo molti esempi ma il problema è come usarlo.

In molti esemplari, disegnano sempre in un JFrame che si estende da un JPanel.

Voglio aggiungere il Pannello al Frame e aggiungere alcuni pulsanti per disegnare linee in molte direzioni e usare il pulsante X al centro per pulire JPanel.

Questo è il codice dell’interfaccia:

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); } } 

Questo è il codice per disegnare una linea

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

Quindi, come usare queste linee ….

Grazie in anticipo.

I migliori saluti,

Ali

Potrebbe essere più semplice disegnare linee usando il seguente approccio:

  1. fare clic per contrassegnare il primo endpoint
  2. trascinare per mostrare la linea in corso
  3. rilasciare per contrassegnare il secondo endpoint

Questo esempio correlato può offrire alcune indicazioni aggiuntive.

appendice

  1. L’esempio seguente implementa il profilo sopra.
  2. Ho aggiornato l’esempio per mostrare come utilizzare un pannello di pulsanti per influenzare il disegno.
  3. Vedi anche questo esempio correlato che usa l’interfaccia Action con i collegamenti dei tasti.
  4. Ho aggiornato questo esempio per utilizzare i binding di tasti .

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 actionPerformsd(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 actionPerformsd(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(); } }); } } 

Funzionerà come uno schizzo di incisione? Quindi è necessario tracciare la posizione corrente del punto.

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

Quindi, quando l’utente fa clic sui pulsanti, è ansible semplicemente incrementare o decrementare di conseguenza x e y.

Sulla freccia sinistra:

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

dove INC potrebbe essere una variabile che specifica la lunghezza della distanza per disegnare la linea. Forse 5? Tuttavia, imposta sempre un secondo punto p1 sulla posizione precedente.

È sempre più facile creare una class che estenda Canvas o JPanel per disegnare piuttosto che disegnare direttamente su JFrame.

per esempio

 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. } 

C’è una semplice risposta per l’triggerszione della grafica: ad esempio Il seguente codice può essere inserito all’interno di un evento click e utilizzato per disegnare alcuni oggetti semplici su un jPanel. jPanel1 in questo caso era situato su un lato di un jPanel7 a tabs e vicino al pulsante di triggerszione. Per fare ciò nella GUI di netbeans, il codice è stato inserito all’interno dell’evento di azione del pulsante. Una volta visualizzati gli errori usuali per non avere le importazioni appropriate, fare clic con il tasto destro del mouse sul codice e fare clic su “fix imports”. Bingo, tutto va bene 🙂 Attenzione: il comando setBackground per il pannello sovrascriverà l’object grafico. Se imposti il ​​colore di sfondo senza utilizzare l’object grafico, non vedrai i tuoi oggetti!

 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); 

Questo ripristina la tua fiducia nel vero amore 🙂 La difficoltà qui è che qualsiasi cambiamento o riverniciatura cancellerà il tuo sforzo. Questo approccio è specificamente scoraggiato dai fondatori di Java. Ma nella versione corrente di Netbeans Swing, dove estendere jPanel è reso difficile bloccando le modifiche al codice, questo approccio potrebbe essere la tua unica soluzione a breve termine. Una semplice estensione grafica persistente per jPanel sarebbe un’aggiunta molto gradita all’ambiente Netbeans Swing attuale, un pannello grafico. Ciò consentirebbe di trascinare e rilasciare il pannello grafico e quindi andare avanti con l’uso guidato da quel pannello. 40 altri IDE hanno già questo, sembra che Java sia stato lento ad aggiungere questa funzionalità.