2014-04-08 28 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算法? –