Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.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/8/variables/2.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 如何快速拖动鼠标光标绘制重复椭圆的连续曲线?_Java_Swing_Paintcomponent_Graphics2d_Mousemotionlistener - Fatal编程技术网

Java 如何快速拖动鼠标光标绘制重复椭圆的连续曲线?

Java 如何快速拖动鼠标光标绘制重复椭圆的连续曲线?,java,swing,paintcomponent,graphics2d,mousemotionlistener,Java,Swing,Paintcomponent,Graphics2d,Mousemotionlistener,此代码用于在JPanel上绘制。在paintComponent(Graphics)中,我试图通过重复的Graphics2D#fillOval(x,y,with,height)绘制曲线 应用程序工作正常,当我慢慢拖动鼠标光标时;它根据我的需要画了一条连续的曲线。但当我加速拖动鼠标光标时,结果是分离的点,而不是连续的曲线 那么,即使我加速拖动,如何让它绘制一条连续曲线呢 import java.awt.*; import java.awt.event.*; import java.util.Arra

此代码用于在JPanel上绘制。在
paintComponent(Graphics)
中,我试图通过重复的
Graphics2D#fillOval(x,y,with,height)
绘制曲线

应用程序工作正常,当我慢慢拖动鼠标光标时;它根据我的需要画了一条连续的曲线。但当我加速拖动鼠标光标时,结果是分离的点,而不是连续的曲线

那么,即使我加速拖动,如何让它绘制一条连续曲线呢

import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import javax.swing.*;

public class Painter extends JPanel {

    int x, y;
    ArrayList<Point> points;

    public Painter() {

        setBackground(Color.white);
        points = new ArrayList<>();

        MouseHandler listener = new MouseHandler();
        this.addMouseMotionListener(listener);
    }

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

    private class MouseHandler extends MouseAdapter implements MouseMotionListener {

        @Override
        public void mouseDragged(MouseEvent e) {
            Point point = new Point(e.getX(), e.getY());
            points.add(point);
            repaint();
        }
    }

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

        Graphics2D g2d = (Graphics2D) g;
        for (Point point : points) {
            g2d.fillOval(point.x, point.y, 15, 15);
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame f = new JFrame();
                f.setContentPane(new Painter());
                f.pack();
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.setVisible(true);
            }
        });
    }
}
import java.awt.*;
导入java.awt.event.*;
导入java.util.ArrayList;
导入javax.swing.*;
公共类油漆工扩展JPanel{
int x,y;
阵列列表点;
公共画家(){
挫折地面(颜色:白色);
points=新的ArrayList();
MouseHandler listener=新的MouseHandler();
this.addMouseMotionListener(listener);
}
@凌驾
公共维度getPreferredSize(){
返回新维度(600600);
}
私有类MouseHandler扩展了MouseAdapter,实现了MouseMotionListener{
@凌驾
公共无效鼠标标记(鼠标事件e){
点=新点(e.getX(),e.getY());
点。添加(点);
重新油漆();
}
}
@凌驾
受保护组件(图形g){
超级组件(g);
Graphics2D g2d=(Graphics2D)g;
用于(点:点){
g2d.圆角(点x、点y、点15、点15);
}
}
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
@凌驾
公开募捐{
JFrame f=新的JFrame();
f、 setContentPane(新画师());
f、 包装();
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f、 setVisible(真);
}
});
}
}

如您对之前类似问题的评论中所述:

  • 不要在paintComponent方法中绘制离散的椭圆
  • 而是通过在相邻点之间绘制线来连接paintComponent中列表中的点
  • 如果需要使线条更粗,请使用厚度更宽的线条更改Graphics2D对象的笔划属性
  • 但是,请注意笔划,因为通常不希望特性更改沿绘制链向下传播。这意味着您有时需要复制图形对象,并在新图形对象上设置笔划,然后使用该笔划进行绘制,然后将其丢弃
  • 创建笔划的最简单方法是使用BasicStroke类,例如,
    new BasicStroke(6f)
    将获得一条漂亮的粗曲线
例如:

import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;

import javax.swing.*;

public class Painter2 extends JPanel {

    private static final float STROKE_WIDTH = 15f;
    private static final Stroke STROKE = new BasicStroke(STROKE_WIDTH, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND);
    int x, y;
    ArrayList<Point> points;

    public Painter2() {

        setBackground(Color.white);
        points = new ArrayList<>();

        MouseHandler listener = new MouseHandler();
        this.addMouseMotionListener(listener);
    }

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

    private class MouseHandler extends MouseAdapter implements MouseMotionListener {

        @Override
        public void mouseDragged(MouseEvent e) {
            Point point = new Point(e.getX(), e.getY());
            points.add(point);
            repaint();
        }
    }

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

        Graphics2D g2d = (Graphics2D) g;
        g2d.setStroke(STROKE);
        for (int i = 1; i < points.size(); i++) {
            int x1 = points.get(i - 1).x;
            int y1 = points.get(i - 1).y;
            int x2 = points.get(i).x;
            int y2 = points.get(i).y;
            g2d.drawLine(x1, y1, x2, y2);
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame f = new JFrame();
                f.setContentPane(new Painter2());
                f.pack();
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.setVisible(true);
            }
        });
    }
}
import java.awt.*;
导入java.awt.event.*;
导入java.util.ArrayList;
导入javax.swing.*;
公共类画家2扩展JPanel{
专用静态最终浮动行程_宽度=15f;
私有静态最终冲程=新的基本冲程(冲程宽度、基本冲程.CAP\u轮、基本冲程.JOIN\u轮);
int x,y;
阵列列表点;
公共画家2(){
挫折地面(颜色:白色);
points=新的ArrayList();
MouseHandler listener=新的MouseHandler();
this.addMouseMotionListener(listener);
}
@凌驾
公共维度getPreferredSize(){
返回新维度(600600);
}
私有类MouseHandler扩展了MouseAdapter,实现了MouseMotionListener{
@凌驾
公共无效鼠标标记(鼠标事件e){
点=新点(e.getX(),e.getY());
点。添加(点);
重新油漆();
}
}
@凌驾
受保护组件(图形g){
超级组件(g);
Graphics2D g2d=(Graphics2D)g;
g2d.设定行程(行程);
对于(int i=1;i
或者更好:

import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.List;
import javax.swing.*;

@SuppressWarnings("serial")
public class Painter2 extends JPanel {

    private static final float STROKE_WIDTH = 15f;
    private static final Stroke STROKE = new BasicStroke(STROKE_WIDTH, BasicStroke.CAP_ROUND,
            BasicStroke.JOIN_ROUND);
    private static final Color CURVES_COLOR = Color.BLUE;
    private static final Color TEMP_CURVE_COLOR = Color.PINK;
    private List<List<Point>> curvesList = new ArrayList<>();
    private List<Point> tempCurve = null;

    public Painter2() {
        setBackground(Color.white);
        MouseHandler listener = new MouseHandler();
        addMouseListener(listener);
        addMouseMotionListener(listener);
    }

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

    private class MouseHandler extends MouseAdapter implements MouseMotionListener {
        @Override
        public void mousePressed(MouseEvent e) {
            tempCurve = new ArrayList<>();
            tempCurve.add(e.getPoint());
            repaint();
        }

        @Override
        public void mouseDragged(MouseEvent e) {
            tempCurve.add(e.getPoint());
            repaint();
        }

        @Override
        public void mouseReleased(MouseEvent e) {
            tempCurve.add(e.getPoint());
            curvesList.add(tempCurve);
            tempCurve = null;
            repaint();
        }
    }

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

        Graphics2D g2 = (Graphics2D) g.create();
        g2.setStroke(STROKE);
        g2.setColor(CURVES_COLOR);
        for (List<Point> curve : curvesList) {
            drawCurve(g2, curve);
        }

        if (tempCurve != null) {
            g2.setColor(TEMP_CURVE_COLOR);
            drawCurve(g2, tempCurve);
        }

        g2.dispose();
    }

    private void drawCurve(Graphics2D g2, List<Point> ptList) {
        for (int i = 1; i < ptList.size(); i++) {
            int x1 = ptList.get(i - 1).x;
            int y1 = ptList.get(i - 1).y;
            int x2 = ptList.get(i).x;
            int y2 = ptList.get(i).y;
            g2.drawLine(x1, y1, x2, y2);
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame f = new JFrame();
                f.setContentPane(new Painter2());
                f.pack();
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.setVisible(true);
            }
        });
    }
}
import java.awt.*;
导入java.awt.event.*;
导入java.util.ArrayList;
导入java.util.List;
导入javax.swing.*;
@抑制警告(“串行”)
公共类画家2扩展JPanel{
专用静态最终浮动行程_宽度=15f;
专用静态最终行程行程=新的基本行程(行程宽度、基本行程.CAP\U圆形、,
基本行程。加入(轮);
私有静态最终颜色曲线\u Color=Color.BLUE;
专用静态最终颜色温度曲线颜色=Color.PINK;
private List curvesList=new ArrayList();
私有列表tempcrove=null;
公共画家2(){
挫折地面(颜色:白色);
MouseHandler listener=新的MouseHandler();
addMouseListener(监听器);
addMouseMotionListener(listener);
}
@凌驾
公共维度getPreferredSize(){
返回新维度(600600);
}
私有类MouseHandler扩展了MouseAdapter,实现了MouseMotionListener{
@凌驾
公共无效鼠标按下(MouseEvent e){
tempCurve=新的ArrayList();
添加(例如getPoint());
重新油漆();
}
@凌驾
公共无效鼠标标记(鼠标事件e){
添加(例如getPoint());
重新油漆();
}
@凌驾
公共无效MouseEvent(MouseEvent e){
添加(例如getPoint());