Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在JPanel上拖动和绘制线?_Java_Swing - Fatal编程技术网

Java 如何在JPanel上拖动和绘制线?

Java 如何在JPanel上拖动和绘制线?,java,swing,Java,Swing,我正在尝试使用MouseListener和重写paintComponent方法画一条线。我现在设置了画图组件,它在面板上自己画一条线。但现在我需要将其更改为当您单击面板并将鼠标拖动到另一个点以创建线时。我一直在读这些教程,但我还是很迷茫。有谁能指引我 这是我目前的代码: package gui; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Dimension; import java.awt.Graph

我正在尝试使用MouseListener和重写paintComponent方法画一条线。我现在设置了画图组件,它在面板上自己画一条线。但现在我需要将其更改为当您单击面板并将鼠标拖动到另一个点以创建线时。我一直在读这些教程,但我还是很迷茫。有谁能指引我

这是我目前的代码:

package gui;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.geom.Line2D;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class DrawPanel extends JPanel {

    private static final long serialVersionUID = 1697489704611349844L;

    /** The width of the panel. */
    private static final int WIDTH = 600;

    /** The height of the panel. */
    private static final int HEIGHT = 300;

    /** The stroke width in pixels. */
    private static final int STROKE_WIDTH = 1;

    /** The width for the rectangle. */
    private static final int RECTANGLE_WIDTH = 50;

    /** The height for the rectangle. */
    private static final int RECTANGLE_HEIGHT = 50;

    public DrawPanel() {
        super();
        setBackground(Color.WHITE);
        setPreferredSize(new Dimension(WIDTH, HEIGHT));   
    }

class LineListener implements MouseListener, MouseMotionListener {
    @Override
    public void mouseClicked(MouseEvent theEvent) {
        theX = theEvent.getX();
        theY = theEvent.getY();
    }

    @Override
    public void mouseEntered(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseExited(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mousePressed(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseReleased(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseDragged(MouseEvent theEvent) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseMoved(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }


    @Override
    public void paintComponent(final Graphics theGraphics) {
        super.paintComponent(theGraphics);
        final Graphics2D g2d = (Graphics2D) theGraphics;

    // for better graphics display
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                         RenderingHints.VALUE_ANTIALIAS_ON);

        final Shape line = new Line2D.Double(10, 10, 100, 100);
        g2d.setPaint(Color.ORANGE);
        g2d.setStroke(new BasicStroke(STROKE_WIDTH));
        g2d.draw(line);
    }


    public static void main(final String[] theArgs) {
        final DrawPanel panel = new DrawPanel();
        final JFrame frame = new JFrame("Drawing Panel Demo");

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(panel);
        frame.pack();
        frame.setVisible(true);
        frame.setLocationRelativeTo(null);
    }


}

查看鼠标侦听器方法。您需要一个鼠标侦听器来存储已单击或拖动的点列表。然后在
paintComponent()
中,您可以使用与当前绘制大致相同的方式绘制这些点


鼠标侦听器课程:

您正在硬编码行参数,10、10、100、100:

final Shape line = new Line2D.Double(10, 10, 100, 100);
这是一种非常不灵活的构造——当用户单击并拖动时,代码无法改变这一点。解决方案不是这样做,而是使用硬编码的“魔法”数字,使用int变量,即在代码的MouseListener中更改的变量。在同一个MouseListener中,在更改参数值后调用
repaint()
,这将建议JVM重新绘制GUI,然后重新调用
paintComponent
方法

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.*;

@SuppressWarnings("serial")
public class DrawPanel2 extends JPanel {
    private static final int PREF_W = 600;
    private static final int PREF_H = 300;
    private static final Color BG = Color.WHITE;

    // create fields that can be set in your mouse listeners
    // and used in the painting methods
    private Point p1 = null;
    private Point p2 = null;

    public DrawPanel2() {
        setBackground(BG);

        // create your mouse adapter and add as mouse and mouse motion listeners 
        MyMouse myMouse = new MyMouse();
        addMouseListener(myMouse);
        addMouseMotionListener(myMouse);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        // if your points have been set,.... draw them!
        if (p1 != null && p2 != null) {
            int x1 = p1.x;
            int y1 = p1.y;
            int x2 = p2.x;
            int y2 = p2.y;

            g2.drawLine(x1, y1, x2, y2);
        }
    }

    // to set the size of the GUI
    @Override
    public Dimension getPreferredSize() {
        if (isPreferredSizeSet()) {
            return super.getPreferredSize();
        }
        return new Dimension(PREF_W, PREF_H);
    }

    // my mouse adapter inner class
    private class MyMouse extends MouseAdapter {
        @Override
        public void mousePressed(MouseEvent e) {
            p1 = e.getPoint();
        }

        @Override
        public void mouseReleased(MouseEvent e) {
            p2 = e.getPoint();
            repaint();
        }

        @Override
        public void mouseDragged(MouseEvent e) {
            p2 = e.getPoint();
            repaint();
        }
    }

    private static void createAndShowGui() {
        DrawPanel2 mainPanel = new DrawPanel2();

        JFrame frame = new JFrame("Draw Panel 2");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }
}

关于您发布的代码:

  • 让你的内部类扩展MouseAdapter。这个类已经实现了MouseListener和MouseMotionListener以及wheel监听器,您只需要重写您想要更改的方法
  • 您的最新代码不应该编译,因为它试图使用两个字段,即x和它们,它们没有在任何地方声明。我猜这只是你草率的发帖,你很快就把这段代码扔进了你的问题中,而没有费心先编译它。请不要这样做。我们是志愿者,试图在空闲时间提供帮助,而你这样做只会让帮助变得更加困难
  • 您应该使用两个点字段(如上所示)或两组x和y int字段,比如x1、y1、x2、y2,并在鼠标侦听器代码中设置它们
  • 简单程序的mouseDragged和mousererelease是相同的,只需要设置第二个点(如上面的示例所示),或第二对x和y int字段,然后调用repaint
  • 然后,paintComponent方法将使用两个点值(如上面的示例所示)或两对x和y int字段来绘制线
是的,我特意对数字进行了硬编码,只是为了先了解如何画一条线。我的问题是如何实现MouseListener。@Jasmine:那么你的问题应该得到改进,因为你没有在问题本身中表现出解决问题的努力。请始终张贴您的尝试,否则我们将不知道如何帮助您。i、 将来,如果你的问题是关于鼠标侦听器的,你应该告诉我们你用鼠标侦听器做了什么。这是我的问题,我真的没有任何尝试,因为我不知道如何处理这个问题。我知道的唯一一件事是,我需要在MouseStener方法中获取我的点的x和getY,但仅此而已。@Jasmine:没关系,你仍然应该展示你所拥有的。如果你不尝试,你只会欺骗自己。但是我在上面的代码中用点向您展示了一种方法,但是它可以使用x和y int变量来处理sam。@Jasmine:请参见编辑来回答。另外,请注意避免在代码中出现粗心的错误。在创建和发布您的代码时,请尽可能小心,就像您希望我们制作答案一样。