Draw a line in a JPanel with button click in Java

前端 未结 3 1050
孤城傲影
孤城傲影 2020-11-22 02:07

I want to draw a line in a JPanel. This is my GUI and I want a line in the JPanel in white.

\"enter

3条回答
  •  醉话见心
    2020-11-22 02:15

    It may be easier to draw lines using the following approach:

    1. click to mark the first endpoint
    2. drag to show the line in progress
    3. release to mark the second endpoint

    This related example may offer some additional guidance.

    Addendum

    1. The example below implements the outline above.
    2. I've update the example to show how to use a panel of buttons to affect the drawing.
    3. See also this related example that uses the Action interface with key bindings.
    4. I've updated this example to use Key Bindings.

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

提交回复
热议问题