Desenhe uma linha em um JPanel com o botão de clique em Java

Eu quero desenhar uma linha em um JPanel. Esta é minha GUI e quero uma linha no JPanel em branco.

insira a descrição da imagem aqui

Eu acho muitos exemplos, mas o problema é como usá-lo.

Em muitos exemplos, sempre desenham um JFrame que se estende de um JPanel.

Eu quero adicionar o painel ao quadro e adicionar alguns botões para desenhar linhas em várias direções e usar o botão X no centro para limpar o JPanel.

Este é o código da interface:

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 é o código para desenhar uma linha

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

Então, como usar essas linhas ….

Desde já, obrigado.

Cumprimentos,

Todos

Pode ser mais fácil desenhar linhas usando a seguinte abordagem:

  1. clique para marcar o primeiro ponto final
  2. arraste para mostrar a linha em progresso
  3. solte para marcar o segundo ponto final

Este exemplo relacionado pode oferecer algumas orientações adicionais.

Termo aditivo

  1. O exemplo abaixo implementa o esquema acima.
  2. Eu atualizei o exemplo para mostrar como usar um painel de botões para afetar o desenho.
  3. Veja também este exemplo relacionado que usa a interface Action com associações de teclas.
  4. Eu atualizei este exemplo para usar as associações de chave .

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

Isso vai funcionar como um etch-a-sketch? Então você precisa acompanhar a posição atual do ponto.

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

Então, quando o usuário clicar nos botões, você pode simplesmente incrementar ou decrementar x e y de acordo.

Na seta para a esquerda:

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

onde INC poderia ser uma variável que especifica o comprimento da distância para desenhar a linha. Talvez 5? Sempre defina um segundo ponto p1 para o local anterior.

É sempre mais fácil criar uma class que estenda o Canvas ou o JPanel para desenhar em vez de desenhar diretamente no JFrame.

por exemplo

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

Há uma resposta simples para acionar charts: por exemplo, o seguinte código pode ser colocado dentro de um evento de clique e usado para desenhar alguns objects simples em um jPanel. jPanel1 neste caso estava situado em um lado de um jPanel7 com abas e ao lado do botão de acionamento. Para fazer isso na GUI do netbeans, o código foi colocado dentro do evento de ação do botão. Uma vez que os erros usuais apareceram por não ter as importações apropriadas, clique com o botão direito no código e clique em “consertar importações”. Bingo, tudo está bem 🙂 Atenção: o comando setBackground para o painel irá sobrescrever o object gráfico. Se você definir a cor de fundo sem usar o object gráfico, você não verá seus objects!

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

Isso restaura sua fé no amor verdadeiro 🙂 A dificuldade aqui é que qualquer mudança ou repintura irá apagar seu esforço. Essa abordagem é especificamente desencorajada pelos fundadores do Java. Mas na versão atual do Netbeans Swing, onde a extensão do jPanel é dificultada pelo bloqueio de alterações de código, essa abordagem pode ser sua única solução de curto prazo. Uma simples extensão gráfica persistente para o jPanel seria uma adição bem-vinda ao ambiente atual do NetBeans Swing, um painel gráfico. Isso permitiria que você arrastasse e soltasse o painel de charts e, em seguida, continuasse com o uso orientado a events desse painel. 40 outros IDE já têm isso, parece que o Java tem sido lento para adicionar esse recurso.