Вопрос:
Эй, я знаю, что просто рисовать овал/прямоугольник и заполнять его, используя
g.fillOval(30, 40, 20, 20);
но как рисовать треугольник? Было бы лучше, если бы у него были случайные координаты.
Лучший ответ:
Есть как минимум два основных способа, которыми вы можете достичь, исходя из ваших потребностей.
Вы можете использовать Polygon или вы можете использовать API 2D-графики
Который вы можете выбрать, сводится к вашим требованиям. Polygon требует, чтобы вы заранее знали положение точек в трехмерном пространстве, где API Shape дает вам больше свободы для определения формы, не заботясь о позиции заранее.
Это делает API Shape более гибким, поскольку вы можете определить форму один раз и просто перевести контекст Graphics мере необходимости и перерисовать его.
Например…
Красный – Polygon, зеленый – это Shape, которая переведена в положение…
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.Polygon; import java.awt.geom.Path2D; import java.awt.geom.Point2D; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; public class TriangleTest { public static void main(String[] args) { new TriangleTest(); } public TriangleTest() { 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 TriangleShape triangleShape; private Polygon poly; public TestPane() { triangleShape = new TriangleShape( new Point2D.Double(50, 0), new Point2D.Double(100, 100), new Point2D.Double(0, 100) ); poly = new Polygon( new int[]{50, 100, 0}, new int[]{0, 100, 100}, 3); } @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); g2d.fill(poly); g2d.setColor(Color.GREEN); g2d.translate(50, 100); g2d.fill(triangleShape); g2d.dispose(); } } public class TriangleShape extends Path2D.Double { public TriangleShape(Point2D… points) { moveTo(points[0].getX(), points[0].getY()); lineTo(points[1].getX(), points[1].getY()); lineTo(points[2].getX(), points[2].getY()); closePath(); } } } Ответ №1
Используя устаревший класс Graphics, это будет сделано с использованием устаревшего метода
drawPolygon(int[] x, int[] y, int pointCount).
Новый класс Graphics2D поддерживает гораздо более Path2D реализацию с использованием Path2D. Вам понадобится метод draw(Shape) или fill(Shape). Учитывая тот факт, что почти везде в Java объект Graphics самом деле является объектом Graphics2D, вы можете его отличить, это путь, ИМХО.
Graphics g = …; Graphics2D g2d = (Graphics2D) g; Path2D.Double triangle = new Path2D.Double(); triangle.moveTo(x1, y1); triangle.pathTo(x2, y2); triangle.pathTo(x3, y3); triangle.closePath(); g2d.fill(triangle);