Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.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 Line2D始终从JFrame的左上角开始_Java_Swing - Fatal编程技术网

Java Line2D始终从JFrame的左上角开始

Java Line2D始终从JFrame的左上角开始,java,swing,Java,Swing,这是较大分配的一部分,用户必须能够绘制、移动和调整正方形、圆和线的大小。此外,流程必须是可见的 我在正方形和圆形方面没有问题,但当我试图画一条线时,就会出现问题 这是一段代码,它画了一条线,但仍然会产生以下错误: import java.awt.AlphaComposite; import java.awt.BasicStroke; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; impor

这是较大分配的一部分,用户必须能够绘制、移动和调整正方形、圆和线的大小。此外,流程必须是可见的

我在正方形和圆形方面没有问题,但当我试图画一条线时,就会出现问题

这是一段代码,它画了一条线,但仍然会产生以下错误:

import java.awt.AlphaComposite;
import java.awt.BasicStroke;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Line2D;

import javax.swing.JFrame;

public class test extends JFrame implements MouseListener,
MouseMotionListener {
Point startDrag, endDrag;

/**
 * @param args
 */
public test() {

    this.addMouseListener(this);
    this.addMouseMotionListener(this);
}
public static void main(String[] args) {
    test frame = new test();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(500, 500);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
}
Shape r = null;
public void paint(Graphics g) {
    super.paint(g);

    Graphics2D g2 = (Graphics2D) g;
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
    g2.setStroke(new BasicStroke(1));
    g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,
            0.50f));

    if(startDrag != null && endDrag != null)
    {
        r = makeLine(startDrag.x, startDrag.y, endDrag.x,
            endDrag.y);
    }


    if(r != null)
        g2.draw(r);
}

@Override
public void mouseDragged(MouseEvent e) {
    endDrag = new Point(e.getX(), e.getY());
    repaint();

}

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

}

@Override
public void mouseClicked(MouseEvent me) {
    startDrag = new Point(me.getX(), me.getY());
    repaint();
}

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

}

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

}

@Override
public void mousePressed(MouseEvent me) {
    startDrag = new Point(me.getX(), me.getY());
    endDrag = startDrag;
    repaint();

}

private Line2D.Float makeLine(int x1, int y1, int x2, int y2) {
    return new Line2D.Float(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1- x2), Math.abs(y1 - y2));
}
@Override
public void mouseReleased(MouseEvent me) {

    r = makeLine(startDrag.x, startDrag.y, me.getX(), me.getY());

    startDrag = null;
    endDrag = null;
    repaint();

}

}

我最近刚开始学习如何使用awt和swing,因此非常感谢您的建议。

主要问题在这里

private Line2D.Float makeLine(int x1, int y1, int x2, int y2) {
    return new Line2D.Float(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1- x2), Math.abs(y1 - y2));
}
直线不关心第二个x/y是否小于或大于第一个x/y或两者的组合,它只会从一个点到下一个点绘制一条直线

因为您已经有了一个表示各个鼠标事件的起点和终点,所以您可以简单地按原样使用它们

private Line2D.Float makeLine(int x1, int y1, int x2, int y2) {
    return new Line2D.Float(x1, y1, x2, y2);
}
我还删除了mouseClicked事件中对startPoint的更改,因为它不会执行您想要的操作

Iv'e发布了我用来测试它的代码,并在评论中推荐了一些修改

import java.awt.AlphaComposite;
import java.awt.BasicStroke;
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.Shape;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Line2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class DrawLine extends JPanel implements MouseListener,
                MouseMotionListener {

    Point startDrag, endDrag;

    public DrawLine() {

        this.addMouseListener(this);
        this.addMouseMotionListener(this);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new DrawLine());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    Shape r = null;

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(200, 200);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        Graphics2D g2 = (Graphics2D) g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                        RenderingHints.VALUE_ANTIALIAS_ON);
        g2.setStroke(new BasicStroke(1));
        g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,
                        0.50f));

        if (startDrag != null && endDrag != null) {
            System.out.println(startDrag + " - " + endDrag);
            r = makeLine(startDrag.x, startDrag.y, endDrag.x,
                            endDrag.y);
        }

        if (r != null) {
            g2.draw(r);
        }
    }

    @Override
    public void mouseDragged(MouseEvent e) {
        endDrag = new Point(e.getPoint());
        repaint();

    }

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

    }

    @Override
    public void mouseClicked(MouseEvent me) {
//        startDrag = new Point(me.getX(), me.getY());
//        repaint();
    }

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

    }

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

    }

    @Override
    public void mousePressed(MouseEvent me) {
        startDrag = new Point(me.getPoint());
        repaint();

    }

    private Line2D.Float makeLine(int x1, int y1, int x2, int y2) {
        return new Line2D.Float(x1, y1, x2, y2);
    }

    @Override
    public void mouseReleased(MouseEvent me) {

        r = makeLine(startDrag.x, startDrag.y, me.getX(), me.getY());

        startDrag = null;
        endDrag = null;
        repaint();

    }
}

尝试在鼠标点击的方法中删除startDrag,以便获得任何建议。不要从JFrame扩展,您没有向它添加任何有用的功能。而是从类似JPanel的东西进行扩展,并替代paintComponent方法。像JFrame这样的顶级容器的油漆负责油漆许多子组件,而不是双缓冲区谢谢你的建议。对于原始代码,我尝试删除mouseClicked方法中的startDrag,但没有任何更改。现在我正在尝试扩展JPanel。如果你知道任何关于如何做的好教程,你能发布一个链接吗?另请参阅这篇相关文章。