Как рисовать линии в Java

Мне интересно, есть ли на Java функция funciton, которая может нарисовать линию из координат (x1, x2) в (y1, y2)?

Я хочу сделать что-то вроде этого:

drawLine(x1, x2, x3, x4); 

И я хочу иметь возможность сделать это в любое время в коде, создавая сразу несколько строк.

Я попытался сделать это:

 public void paint(Graphics g){ g.drawLine(0, 0, 100, 100); } 

Но это не дает мне контроля, когда функция используется, и я не могу понять, как ее называть несколько раз.

Надеюсь, вы понимаете, что я имею в виду!

PS Я хочу создать систему координат со многими координатами.

Очень простой пример компонента качания для рисования линий. Он хранит внутренне список с строками, добавленными методом addLine. Каждый раз, когда добавляется новая строка, вызывается repaint, чтобы сообщить графической подсистеме, что требуется новая краска.

Класс также содержит пример использования.

 import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.LinkedList; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JPanel; public class LinesComponent extends JComponent{ private static class Line{ final int x1; final int y1; final int x2; final int y2; final Color color; public Line(int x1, int y1, int x2, int y2, Color color) { this.x1 = x1; this.y1 = y1; this.x2 = x2; this.y2 = y2; this.color = color; } } private final LinkedList lines = new LinkedList(); public void addLine(int x1, int x2, int x3, int x4) { addLine(x1, x2, x3, x4, Color.black); } public void addLine(int x1, int x2, int x3, int x4, Color color) { lines.add(new Line(x1,x2,x3,x4, color)); repaint(); } public void clearLines() { lines.clear(); repaint(); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); for (Line line : lines) { g.setColor(line.color); g.drawLine(line.x1, line.y1, line.x2, line.y2); } } public static void main(String[] args) { JFrame testFrame = new JFrame(); testFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); final LinesComponent comp = new LinesComponent(); comp.setPreferredSize(new Dimension(320, 200)); testFrame.getContentPane().add(comp, BorderLayout.CENTER); JPanel buttonsPanel = new JPanel(); JButton newLineButton = new JButton("New Line"); JButton clearButton = new JButton("Clear"); buttonsPanel.add(newLineButton); buttonsPanel.add(clearButton); testFrame.getContentPane().add(buttonsPanel, BorderLayout.SOUTH); newLineButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { int x1 = (int) (Math.random()*320); int x2 = (int) (Math.random()*320); int y1 = (int) (Math.random()*200); int y2 = (int) (Math.random()*200); Color randomColor = new Color((float)Math.random(), (float)Math.random(), (float)Math.random()); comp.addLine(x1, y1, x2, y2, randomColor); } }); clearButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { comp.clearLines(); } }); testFrame.pack(); testFrame.setVisible(true); } } 

Сохраните строки в списке некоторых типов. Когда придет время рисовать их, перебирайте список и рисуйте каждый. Что-то вроде этого.

DrawLines.java

 import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.geom.Line2D; import javax.swing.JOptionPane; import javax.swing.JComponent; import javax.swing.SwingUtilities; import java.util.ArrayList; import java.util.Random; class DrawLines { public static void main(String[] args) { Runnable r = new Runnable() { public void run() { LineComponent lineComponent = new LineComponent(400,400); for (int ii=0; ii<30; ii++) { lineComponent.addLine(); } JOptionPane.showMessageDialog(null, lineComponent); } }; SwingUtilities.invokeLater(r); } } class LineComponent extends JComponent { ArrayList lines; Random random; LineComponent(int width, int height) { super(); setPreferredSize(new Dimension(width,height)); lines = new ArrayList(); random = new Random(); } public void addLine() { int width = (int)getPreferredSize().getWidth(); int height = (int)getPreferredSize().getHeight(); Line2D.Double line = new Line2D.Double( random.nextInt(width), random.nextInt(height), random.nextInt(width), random.nextInt(height) ); lines.add(line); repaint(); } public void paintComponent(Graphics g) { g.setColor(Color.white); g.fillRect(0, 0, getWidth(), getHeight()); Dimension d = getPreferredSize(); g.setColor(Color.black); for (Line2D.Double line : lines) { g.drawLine( (int)line.getX1(), (int)line.getY1(), (int)line.getX2(), (int)line.getY2() ); } } } 

Скриншот

введите описание изображения здесь

Вам нужно создать class, который расширяет компонент. Там вы можете переопределить метод рисования и поместить свой код рисования в:

 package blah.whatever; import java.awt.Component; import java.awt.Graphics; public class TestAWT extends Component { /** @see java.awt.Component#paint(java.awt.Graphics) */ @Override public void paint(Graphics g) { super.paint(g); g.drawLine(0,0,100,100); g.drawLine(10, 10, 20, 300); // more drawing code here... } } 

Поместите этот компонент в графический интерфейс вашего приложения. Если вы используете Swing, вам нужно расширить JComponent и переопределить paintComponent.

Как упоминал Helios, код рисования на самом деле сообщает системе, как выглядит ваш компонент. Система будет запрашивать эту информацию (назовите свой код рисования), когда она думает, что она должна быть (перекрашена), например, если окно перемещено перед вашим компонентом.

В вашем classе вы должны иметь:

 public void paint(Graphics g){ g.drawLine(x1, y1, x2, y2); } 

Затем в коде, если необходимо, вы измените x1, y1, x2, y2 и переименуете вызов repaint(); ,

Я понимаю, что вы используете Java AWT API для рисования. Метод paint вызывается, когда необходимо перекрасить элемент управления. И я уверен, что он предоставляет в аргументе Graphics тот прямоугольник, который нуждается в перекраске (чтобы не перерисовывать все).

Поэтому, если вы представляете фиксированный образ, вы просто рисуете то, что вам нужно в этом методе.

Если вы анимируете, я предполагаю, что вы можете аннулировать какой-либо регион, и метод paint будет вызван автоматически. Таким образом, вы можете изменить состояние, вызвать invalidate, и он будет вызван снова.

Вы можете использовать метод getGraphics для компонента, на который вы хотите нарисовать. Это, в свою очередь, должно позволить вам рисовать линии и делать другие вещи, доступные через class Graphics

Чтобы дать вам некоторую идею:

 public void paint(Graphics g) { drawCoordinates(g); } private void drawCoordinates(Graphics g) { // get width & height here (w,h) // define grid width (dh, dv) for (int x = 0; i < w; i += dh) { g.drawLine(x, 0, x, h); } for (int y = 0; j < h; j += dv) { g.drawLine(0, y, w, y); } } 

Я построил целый class методов для рисования точек, линий, прямоугольников, кругов и т. Д. Я разработал его для обработки windows как кусочка графической бумаги, где начало координат не должно находиться в верхнем левом углу, а значения y увеличиваются как вы поднимаетесь. Вот как я рисую линии:

 public static void drawLine (double x1, double y1, double x2, double y2) { ((Graphics2D)g).draw(new Line2D.Double(x0+x1*scale, y0-y1*scale, x0+x2*scale, y0-y2*scale)); } 

В приведенном выше примере (x0, y0) представляет начало координат экрана, а scale является масштабирующим фактором. Входные параметры должны предоставляться как координаты графика, а не координаты экрана. Нет repaint() . Вы можете сохранить это, пока не нарисуете все нужные вам строки.

Мне приходит в голову, что кто-то может не захотеть мыслить в терминах графической работы:

  ((Graphics2D)g).draw(new Line2D.Double(x1, y1, x2, y2)); 

Обратите внимание на использование Graphics2D . Это позволяет нам нарисовать объект Line2D с использованием удвоений вместо int. Помимо других форм, мой class поддерживает трехмерную перспективу и несколько удобных методов (например, рисование круга с центром в определенной точке с учетом радиуса). Если кто-то заинтересован, я был бы рад поделиться этим classом.

 a simple line , after that you can see also a doted line import java.awt.*; import javax.swing.*; import java.awt.Graphics.*; import java.awt.Graphics2D.*; import javax.swing.JFrame; import javax.swing.JPanel; import java.awt.BasicStroke; import java.awt.Event.*; import java.awt.Component.*; import javax.swing.SwingUtilities; /** * * @author junaid */ public class JunaidLine extends JPanel{ //private Graphics Graphics; private void doDrawing(Graphics g){ Graphics2D g2d=(Graphics2D) g; float[] dash1 = {2f,0f,2f}; g2d.drawLine(20, 40, 250, 40); BasicStroke bs1 = new BasicStroke(1,BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND,1.0f,dash1,2f); g2d.setStroke(bs1); g2d.drawLine(20, 80, 250, 80); } @Override public void paintComponent(Graphics g){ super.paintComponent( g); doDrawing(g); } } class BasicStrokes extends JFrame{ public BasicStrokes(){ initUI(); } private void initUI(){ setTitle("line"); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); add(new JunaidLine()); setSize(280,270); setLocationRelativeTo(null); } /** * @param args the command line arguments */ public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable(){ @Override public void run(){ BasicStrokes bs = new BasicStrokes(); bs.setVisible(true); } }); } } 

Чтобы ответить на ваш первоначальный вопрос, это (x1, y1)(x2, y2) .

Например,

Это делается для построения горизонтальной линии:

 g.drawLine( 10, 30, 90, 30 ); 

против

Это делается для построения вертикальной линии:

 g.drawLine( 10, 30, 10, 90 ); 

Я надеюсь, что это помогает.

Давайте будем гением компьютера.