Java挑战允许用户绘制线路



随着鼠标的移动,我的问题已在Java Draw Line中提到,但是,我还没有足够的前进到本书中,以涵盖Jpanels,Jframes和Points提出这个问题的先前程序员。

回答这个问题肯定会帮助大多数初学者的程序员更好地了解图形类别和绘图,这通常是一个复杂的过程,尤其是对于初学者而言。

根据我正在使用的文本(当我自己学习Java时),这是如何使用Java绘制线路的示例:

/*
 * LineTest
 * Demonstrates drawing lines
 */
import java.awt.*;
public class LineTest extends Canvas {
public LineTest() {
super();
setSize(300, 200);
setBackground(Color.white);
}
public static void main(String args[]) {
LineTest lt = new LineTest();
GUIFrame frame = new GUIFrame("Line Test");
frame.add(lt);
frame.pack();
frame.setVisible(true);
}
public void paint(Graphics g) {
g.drawLine(10, 10, 50, 100);
g.setColor(Color.blue);
g.drawLine(60, 110, 275, 50);
g.setColor(Color.red);
g.drawLine(50, 50, 300, 200);
}
}

规范是:

创建一个应用程序,该应用程序允许您通过单击初始 点并将鼠标拖到第二点。申请应 重新粉刷,以便您可以看到线路变化的大小和位置 正在拖动鼠标。释放鼠标按钮时,该行是 绘制。

正如您所识别的那样,运行此程序不会创建用户的任何图纸。我相信由于第21行:g.drawLine(x, y, x2, y2);而遇到的错误是不正确的,因为这是定义行绘图的陈述。

任何帮助将不胜感激。预先感谢您就此事的所有时间和合作。

我回答问题的代码是:

import java.awt.*;
import java.awt.event.*;
public class LineDrawer extends Canvas
                        implements MouseListener, MouseMotionListener {
int x, y, x2, y2;
public LineDrawer() {
    super();
    setSize(300, 200);
    setBackground(Color.white);
}
public void mouseClicked(MouseEvent me) {
                int x = me.getX();
                int y = me.getY();
                int x2 = me.getX();
                int y2 = me.getY();
    }
public void paint(Graphics g) {
            g.drawLine(x, y, x2, y2);
            g.setColor(Color.blue);
    }

    public void mousePressed(MouseEvent me) {
        repaint();
    }
    public void mouseDragged(MouseEvent me) {
    }
    public void mouseExited(MouseEvent me) {
    }
    public void mouseEntered(MouseEvent me) {
    }

    public void mouseReleased(MouseEvent me) {
    }
    public void mouseMoved(MouseEvent me) {
    }
    public static void main(String args[]) {
        LineDrawer ld = new LineDrawer();
        GUIFrame frame = new GUIFrame("Line Drawer");
        frame.add(ld);
        frame.pack();
        frame.setVisible(true);
    }
}

P.S。:我一直不愿寻求帮助,因为我担心其他程序员会以我尚未学到的方法回答。

int x1, y1, x2, y2;

public void mousePressed(MouseEvent e){
    x1 = e.getX();
    y1 = e.getY();
}

public void mouseDragged(MouseEvent e){
    x2 = e.getX();
    y2 = e.getY();
    // Now Paint the line
    repaint();
}

希望它有帮助。

让我们从

开始
public void mouseClicked(MouseEvent me) {
    int x = me.getX();
    int y = me.getY();
    int x2 = me.getX();
    int y2 = me.getY();
}

您以前已声明为 xyx2y2,但是在这种方法中,您已覆盖了那些具有新减速的减速,这意味着将不使用以前的声明变量,并且将忽略事件参数。

mouseClicked是在mousePressedmouseReleased事件后触发的,这意味着这实际上是用户发布鼠标按钮的时候。

Extreme Coder指出,仅当在同一点按下鼠标按钮并释放MouseClicked,即涉及不拖动 - 它仍然不是正确的使用方法,但澄清是不错的<</em>

您应该做的是...

mousePressed上存储xy点击的位置和mouseReleased存储x2y2位置。

mouseDragged事件中,您应该更新x2y2值并调用repaint

public void mousePressed(MouseEvent me) {
    // Mouse is down, but hasn't yet being released...
    x = me.getX();
    y = me.getY();
    // We need to "override" any previous values...
    x2 = x;
    y2 = y;
    repaint();
}
public void mouseDragged(MouseEvent me) {
    x2 = me.getX();
    y2 = me.getY();
    repaint();
}
public void mouseReleased(MouseEvent me) {
    // Here I would store the points so I could re-draw each new line...
}

代替使用xyx2y2,使用两个阵列可能更好,即

private int[] startPoint;
private int[] endPoint;

然后您可以做类似...

的事情
public void mousePressed(MouseEvent me) {
    // Mouse is down, but hasn't yet being released...
    startPoint = new int[2];
    startPoint[0] = me.getX();
    startPoint[1] = me.getY();
    endPoint = startPoint;
    repaint();
}
public void mouseDragged(MouseEvent me) {
    endPoint = new int[2];
    endPoint[0] = me.getX();
    endPoint[1] = me.getY();
    repaint();
}

现在,我更喜欢JComponentpaintComponent,但我现在就坚持您的示例..

public void paint(Graphics g) {
    super.paint(g); // This is super important...
    if (startPoint != null && endPoint != null && startPoint.length == 2 && endPoint.length == 2) {
        g.drawLine(startPoint[0], startPoint[1], endPoint[0], endPoint[1]);
    }
}

附加

这是某种关注的问题...

public void paint(Graphics g) {
    g.drawLine(x, y, x2, y2);
    g.setColor(Color.blue);
}

操作顺序非常重要。涂漆后,设置颜色对您的油漆操作没有影响(但可能会影响您之后发生的油漆操作)。

另外,您必须致电super.paint(g)-这是非常重要的...

示例

一个"基本"示例,使用int[]数组进行点存储...

public class BasicLineDraw {
    public static void main(String[] args) {
        new BasicLineDraw();
    }
    public BasicLineDraw() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception ex) {
                }
                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new DrawLinePane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
    public class DrawLinePane extends JPanel {
        private int[] startPoint;
        private int[] endPoint;
        private List<int[][]> lines;
        public DrawLinePane() {
            lines = new ArrayList<int[][]>(25);
            MouseAdapter handler = new MouseAdapter() {
                @Override
                public void mousePressed(MouseEvent e) {
                    startPoint = new int[]{e.getX(), e.getY()};
                    endPoint = startPoint;
                    repaint();
                }
                @Override
                public void mouseDragged(MouseEvent e) {
                    endPoint = new int[]{e.getX(), e.getY()};
                    repaint();
                }
                @Override
                public void mouseReleased(MouseEvent e) {
                    if (startPoint != null && endPoint != null && startPoint.length == 2 && endPoint.length == 2) {
                        lines.add(new int[][]{startPoint, endPoint});
                    }
                    startPoint = null;
                    endPoint = null;
                    repaint();
                }
            };
            addMouseListener(handler);
            addMouseMotionListener(handler);
        }
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            if (startPoint != null && endPoint != null && startPoint.length == 2 && endPoint.length == 2) {
                g2d.setColor(Color.RED);
                g2d.drawLine(startPoint[0], startPoint[1], endPoint[0], endPoint[1]);
            }
            g2d.setColor(Color.BLUE);
            for (int[][] line : lines) {
                g2d.drawLine(line[0][0], line[0][1], line[1][0], line[1][1]);
            }
            g2d.dispose();
        }
    }
}

和一个更高级的示例,使用Point和Java的2D Graphics API

public class LineDrawer {
    public static void main(String[] args) {
        new LineDrawer();
    }
    public LineDrawer() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception ex) {
                }
                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new DrawLinePane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
    public class DrawLinePane extends JPanel {
        private Point anchor;
        private Point lead;
        private List<Line2D> lines;
        public DrawLinePane() {
            lines = new ArrayList<Line2D>(25);
            MouseAdapter handler = new MouseAdapter() {
                @Override
                public void mousePressed(MouseEvent e) {
                    lead = null;
                    anchor = e.getPoint();
                    repaint();
                }
                @Override
                public void mouseDragged(MouseEvent e) {
                    lead = e.getPoint();
                    repaint();
                }
                @Override
                public void mouseReleased(MouseEvent e) {
                    if (lead != null && anchor != null && !anchor.equals(lead)) {
                        lines.add(new Line2D.Float(anchor, lead));
                    }
                    repaint();
                }
            };
            addMouseListener(handler);
            addMouseMotionListener(handler);
        }
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g); 
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.setColor(Color.RED);
            if (lead != null && anchor != null) {
                Composite composite = g2d.getComposite();
                g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.25f));
                g2d.draw(new Line2D.Float(anchor, lead));
                g2d.setComposite(composite);
            }
            for (Line2D line : lines) {
                g2d.draw(line);
            }
            g2d.dispose();
        }
    }
}

最新更新