2015-04-04 288 views
2

好吧,首先我知道如何用g.drawRect或g.drawOval繪製矩形和圓等,但沒有g.drawtriangle,所以你們可以告訴我是否有方法繪製出三角形我不得不把它畫出三角形的每一邊。如何在java中繪製三角形?

+0

請按照以下的鏈接:http://stackoverflow.com /問題/ 11919667 /三角拉法 – Oleksandr 2015-04-04 15:23:28

回答

9

您可以使用Graphics.drawPolygon(int[], int[], int),其中第一INT []是一組x值,第二個INT []是一組y值,而int是長度的陣列。 (在一個三角形的情況下,INT將是3)

實施例:

graphics.drawPolygon(new int[] {10, 20, 30}, new int[] {100, 20, 100}, 3); 

輸出:

Output

3

我會使用Path2D對象,並將我的第一個點與其moveTo(...)方法,然後使用其lineTo(...)方法添加其他點。然後我可以通過Graphics2D#draw(...)Graphics2D#fill(...)來繪製它或填充它。同時調用closePath()將確保您的三角形正確關閉。

例如,下面的代碼生成:

enter image description here

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.GradientPaint; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Paint; 
import java.awt.RenderingHints; 
import java.awt.geom.Path2D;  
import javax.swing.*; 

public class Path2DExample extends JPanel { 
    private static final int PREF_W = 600; 
    private static final int PREF_H = PREF_W; 
    private static final Color COLOR_1 = Color.blue; 
    private static final Color COLOR_2 = Color.red; 
    private static final Paint GRADIENT_PAINT = new GradientPaint(0, 0, COLOR_1, 20, 20, COLOR_2, true); 
    private Path2D myPath = new Path2D.Double(); 

    public Path2DExample() { 
     double firstX = (PREF_W/2.0) * (1 - 1/Math.sqrt(3)); 
     double firstY = 3.0 * PREF_H/4.0; 

     myPath.moveTo(firstX, firstY); 
     myPath.lineTo(PREF_W - firstX, firstY); 
     myPath.lineTo(PREF_W/2.0, PREF_H/4.0); 
     myPath.closePath(); 
    } 

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

     // to smooth out the jaggies 
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
      RenderingHints.VALUE_ANTIALIAS_ON); 
     g2.setPaint(GRADIENT_PAINT); // just for fun! 
     g2.fill(myPath); // fill my triangle 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet()) { 
     return super.getPreferredSize(); 
     } 
     return new Dimension(PREF_W, PREF_H); 
    } 

    private static void createAndShowGui() { 
     Path2DExample mainPanel = new Path2DExample(); 

     JFrame frame = new JFrame("Path2DExample"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 

使用Path2D對象的另外一個好處是,如果你想拖的形狀,它並不難用MouseListener和MouseMotionListener來做,比如說:

private class MyMouseAdapter extends MouseAdapter { 
    private Point pPressed = null; 

    @Override 
    public void mousePressed(MouseEvent e) { 
    if (e.getButton() != MouseEvent.BUTTON1) { 
     return; 
    } 
    if (myPath.contains(e.getPoint())) { 
     pPressed = e.getPoint(); 
    } 
    } 

    public void mouseDragged(MouseEvent e) { 
    drag(e); 
    } 

    @Override 
    public void mouseReleased(MouseEvent e) { 
    drag(e); 
    pPressed = null; 
    } 

    private void drag(MouseEvent e) { 
    if (pPressed == null) { 
     return; 
    } 
    Point p = e.getPoint(); 
    int tx = p.x - pPressed.x; 
    int ty = p.y - pPressed.y; 
    AffineTransform at = AffineTransform.getTranslateInstance(tx, ty); 
    myPath.transform(at); 
    pPressed = p; 
    repaint(); 
    }; 

} 

整個事情看起來是這樣:

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.GradientPaint; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.Paint; 
import java.awt.Point; 
import java.awt.RenderingHints; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.geom.AffineTransform; 
import java.awt.geom.Path2D; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class Path2DExample extends JPanel { 
    private static final int PREF_W = 600; 
    private static final int PREF_H = PREF_W; 
    private static final Color COLOR_1 = Color.blue; 
    private static final Color COLOR_2 = Color.red; 
    private static final Paint GRADIENT_PAINT = new GradientPaint(0, 0, COLOR_1, 
     20, 20, COLOR_2, true); 
    private Path2D myPath = new Path2D.Double(); 

    public Path2DExample() { 
     double firstX = (PREF_W/2.0) * (1 - 1/Math.sqrt(3)); 
     double firstY = 3.0 * PREF_H/4.0; 

     myPath.moveTo(firstX, firstY); 
     myPath.lineTo(PREF_W - firstX, firstY); 
     myPath.lineTo(PREF_W/2.0, PREF_H/4.0); 
     myPath.closePath(); 

     MyMouseAdapter myMouseAdapter = new MyMouseAdapter(); 
     addMouseListener(myMouseAdapter); 
     addMouseMotionListener(myMouseAdapter); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2 = (Graphics2D) g; 
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
      RenderingHints.VALUE_ANTIALIAS_ON); 
     g2.setPaint(GRADIENT_PAINT); 
     g2.fill(myPath); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet()) { 
     return super.getPreferredSize(); 
     } 
     return new Dimension(PREF_W, PREF_H); 
    } 

    private class MyMouseAdapter extends MouseAdapter { 
     private Point pPressed = null; 

     @Override 
     public void mousePressed(MouseEvent e) { 
     if (e.getButton() != MouseEvent.BUTTON1) { 
      return; 
     } 
     if (myPath.contains(e.getPoint())) { 
      pPressed = e.getPoint(); 
     } 
     } 

     public void mouseDragged(MouseEvent e) { 
     drag(e); 
     } 

     @Override 
     public void mouseReleased(MouseEvent e) { 
     drag(e); 
     pPressed = null; 
     } 

     private void drag(MouseEvent e) { 
     if (pPressed == null) { 
      return; 
     } 
     Point p = e.getPoint(); 
     int tx = p.x - pPressed.x; 
     int ty = p.y - pPressed.y; 
     AffineTransform at = AffineTransform.getTranslateInstance(tx, ty); 
     myPath.transform(at); 
     pPressed = p; 
     repaint(); 
     }; 

    } 

    private static void createAndShowGui() { 
     Path2DExample mainPanel = new Path2DExample(); 

     JFrame frame = new JFrame("Path2DExample"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
}