2014-04-08 25 views
1

我想画一条线但我不能使用“drawline”,只能使用“fillRect”。 当我通过mouseclick事件从用户那里读取一个点并放置一个矩形时,我有以下代码。Java图形使用fillRect绘制一条线

我需要做相同的,但通过绘制一条从A点的长方形,B点

这里画一条线是我的代码:

package graphics_draw_rec; 

import java.awt.*; 
import java.awt.Point; 
import javax.swing.*; 
import java.awt.event.*; 

public class DrawRectangleOnMouseClick extends JPanel{ 

    MouseHandler mouseHandler = new MouseHandler(); 
    Point p2 = new Point(0, 0); 
    boolean drawing; 

    public DrawRectangleOnMouseClick(){ 
     this.setPreferredSize(new Dimension(500, 400)); 
     this.addMouseListener(mouseHandler); 
    } 

    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.fillRect(p2.x, p2.y, 5, 5); 
    } 

    private class MouseHandler extends MouseAdapter { 

     public void mouseClicked(MouseEvent e) { 
      drawing = true; 
      p2 = e.getPoint(); 
      repaint(); 
     } 

     public void mouseReleased(MouseEvent e) { 
      drawing = false; 
      p2 = e.getPoint(); 
      repaint(); 
     } 
    } 

    public static void main(String[] args) { 


JFrame f = new JFrame("Draw Rectangle On Mouse Click"); 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    f.add(new DrawRectangleOnMouseClick()); 
    f.pack(); 
    f.setVisible(true); 
} 

} 
+1

为什么你不能使用'drawLine'?有什么问题? – Radiodef

+0

无关说明:如果您要学习Java中的GUI编程,并且没有使用Swing的特定要求,请考虑使用新的JavaFX GUI工具箱,因为Oracle不会进一步开发Swing,而是推动JavaFX。 – Puce

+2

您确定这不是针对http://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm吗? – Marco13

回答

2

这是比较基本的(我说的,但当我做这些事情时,我不得不查看它)。基本上这是为您提供一种方法,通过该方法,您可以在给定系数(或时间)0到1之间的线上找到一个点。

此示例允许您调整点之间的距离,较小系数,距离小。例如,第一个图像使用的0.1d一个增量,而第二次使用0.01d

@0.1@0.01

在这个例子中,尝试围绕0.05d做出一个漂亮的“gaggared”行;)

所有酷 “数学的东西” 发生在between方法...

public Point2D between(Point p1, Point p2, double time) { 

    double deltaX = p2.getX() - p1.getX(); 
    double deltaY = p2.getY() - p1.getY(); 

    double x = p1.getX() + time * deltaX; 
    double y = p1.getY() + time * deltaY; 

    return new Point2D.Double(x, y); 

} 

可运行例如...

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.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.geom.Ellipse2D; 
import java.awt.geom.Line2D; 
import java.awt.geom.Point2D; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.Timer; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class DrawLine { 

    public static void main(String[] args) { 
     new DrawLine(); 
    } 

    public DrawLine() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

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

    public class TestPane extends JPanel { 

     private Point p1 = new Point(50, 50); 
     private Point p2 = new Point(150, 150); 

     public TestPane() { 
     } 

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

     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 
      Graphics2D g2d = (Graphics2D) g.create(); 
      g2d.setColor(Color.RED); 
      for (double t = 0; t < 1; t += 0.01) { 

       Point2D p = between(p1, p2, t); 
       g2d.fillRect((int)p.getX(), (int)p.getY(), 5, 5); 

      } 
      g2d.dispose(); 
     } 

     public Point2D between(Point p1, Point p2, double time) { 

      double deltaX = p2.getX() - p1.getX(); 
      double deltaY = p2.getY() - p1.getY(); 

      double x = p1.getX() + time * deltaX; 
      double y = p1.getY() + time * deltaY; 

      return new Point2D.Double(x, y); 

     } 
    } 

} 
+0

非常感谢您的帮助! –

+0

@MadProgrammer 你是否有多边形Bresenham算法? –