Динамическая графика объектов

Попытка выяснить лучший способ сделать это (и без каких-либо специфических проблем НЕ НЕТ, о которых я не знаю).

Я работаю над визуальным отображением графика (различные узлы с связанными ребрами) с кругами и строками для представления такого. Каждый узел будет добавлен во время выполнения, и я не могу это сделать. Насколько я понимаю, все рисование нужно делать в методе paint (Graphics g) – что не так полезно, так как я не могу изменять параметры, и кажется, что это называется только во время первоначального создания?

Прямо сейчас я думал о том, что он вызывает различные другие методы, передавая объект Graphics, и в зависимости от других переменных – я буду решать, что именно я хочу назвать (поскольку метод paint () – единственный, который я могу назвать ).

Неужели я об этом совершенно не так? Никогда не беспокоился об этом раньше.

Чтобы дать вам лучшее представление о том, что я хочу в итоге: я хочу, чтобы иметь возможность передавать координаты формы, которую я хочу добавить для узла, а затем добавить ее ко всему, что у меня есть на графике. И тогда то же самое с краями, я хочу иметь возможность передать начальную и конечную точку линии, чтобы перерисовать поверх всего существующего в то время.

Не совсем то, что я хочу прямо сейчас, но вы получите идею от того, что я закрепил до сих пор:

import java.awt.*; import javax.swing.*; public class MyCanvas extends Canvas { public MyCanvas() { } public void paint(Graphics graphics) { // Keep this until I figured out if it's painted on load or not. graphics.drawLine(10, 20, 350, 380); } public static void main(String[] args) { MyCanvas canvas = new MyCanvas(); JFrame frame = new JFrame(); int vertexes = 0; // Change this next part later to be dynamic. vertexes = 10; int canvasSize = vertexes * vertexes; frame.setSize(canvasSize, canvasSize); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(canvas); frame.setVisible(true); } public void drawNode(int x, int y, Graphics g) { // Treat each location as a 10x10 block. If position 1,1 then go to (5,5) - If position 3,5 then go to (25, 45) eg: (x*10)-5, (y*10)-5 int xLoc = (x*10) - 5; int yLoc = (y*10) - 5; g.setColor(Color.white); g.fillOval(xLoc, yLoc, 8, 8); g.drawOval(xLoc, yLoc, 8, 8); } public void drawArc(int x, int y, int xx, int yy, Graphics g) { int xLoc = (x*10) - 5; int yLoc = (y*10) - 5; int xxLoc = (xx*10) - 5; int yyLoc = (yy*10) - 5; g.drawLine(xLoc, yLoc, xxLoc, yyLoc); } } 

Изменить: (Ответ для Эндрю)

 import java.awt.*; import java.awt.image.BufferedImage; import javax.swing.*; public class MyCanvas extends JPanel { public MyCanvas() { } public void paintComponent(Graphics g) { super.paintComponent(g); } public static void main(String[] args) { int vertexes = 0; // Change this next part later to be dynamic. vertexes = 10; int canvasSize = vertexes * vertexes; JFrame frame = new JFrame(); JLabel label = new JLabel(); BufferedImage bImage = new BufferedImage(canvasSize, canvasSize, BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = bImage.createGraphics(); g2d.drawLine(50, 50, 300, 300); ImageIcon iIcon = new ImageIcon(bImage); label.setIcon(iIcon); frame.add(label); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); g2d = drawNode(1,1,g2d); label.repaint(); } public static Graphics2D drawNode(int x, int y,Graphics2D g2d) { // Treat each location as a 10x10 block. If position 1,1 then go to (5,5) - If position 3,5 then go to (25, 45) eg: (x*10)-5, (y*10)-5 int xLoc = (x*10) - 5; int yLoc = (y*10) - 5; g2d.setColor(Color.white); g2d.fillOval(xLoc, yLoc, 8, 8); g2d.drawOval(xLoc, yLoc, 8, 8); return g2d; } public static void drawArc(int x, int y, int xx, int yy) { int xLoc = (x*10) - 5; int yLoc = (y*10) - 5; int xxLoc = (xx*10) - 5; int yyLoc = (yy*10) - 5; // g.drawLine(xLoc, yLoc, xxLoc, yyLoc); } } 

    Для этого есть различные страtagsи.

    1. Если объекты никогда не удаляются из чертежа после выполнения, используйте BufferedImage , поместите его в ( ImageIcon in a) JLabel . Когда придет время для обновления:
      1. Получите графический экземпляр изображения и нарисуйте новый элемент.
      2. Утилизируйте графический объект.
      3. repaint() вызов на этикетке.
    2. Сохраните список рисованных элементов. В методе краски нарисуйте их все. Когда добавляется новый элемент, вызовите repaint() для компонента рендеринга.

    Вот пример 1-й техники:

    MyCanvas

     import java.awt.image.BufferedImage; import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.Random; public class MyCanvas { JLabel view; BufferedImage surface; Random random = new Random(); public MyCanvas() { surface = new BufferedImage(600,400,BufferedImage.TYPE_INT_RGB); view = new JLabel(new ImageIcon(surface)); Graphics g = surface.getGraphics(); g.setColor(Color.ORANGE); g.fillRect(0,0,600,400); g.setColor(Color.BLACK); // Keep this until I figured out if it's painted on load or not. g.drawLine(10, 20, 350, 380); g.dispose(); ActionListener listener = new ActionListener() { public void actionPerformed(ActionEvent ae) { addNewElement(); } }; Timer timer = new Timer(200, listener); timer.start(); } public void addNewElement() { boolean drawArc = random.nextBoolean(); int x = random.nextInt(60); int y = random.nextInt(40); Graphics g = surface.getGraphics(); if (drawArc) { g.setColor(Color.BLUE); int xx = random.nextInt(60); int yy = random.nextInt(40); drawArc(x,y,xx,yy,g); } else { drawNode(x,y,g); } g.dispose(); view.repaint(); } public static void main(String[] args) { MyCanvas canvas = new MyCanvas(); JFrame frame = new JFrame(); int vertexes = 0; // Change this next part later to be dynamic. vertexes = 10; int canvasSize = vertexes * vertexes; frame.setSize(canvasSize, canvasSize); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setContentPane(canvas.view); frame.pack(); frame.setLocationByPlatform(true); frame.setVisible(true); } public void drawNode(int x, int y, Graphics g) { // Treat each location as a 10x10 block. If position 1,1 then go to (5,5) - If position 3,5 then go to (25, 45) eg: (x*10)-5, (y*10)-5 int xLoc = (x*10) - 5; int yLoc = (y*10) - 5; g.setColor(Color.white); g.fillOval(xLoc, yLoc, 8, 8); g.drawOval(xLoc, yLoc, 8, 8); } public void drawArc(int x, int y, int xx, int yy, Graphics g) { int xLoc = (x*10) - 5; int yLoc = (y*10) - 5; int xxLoc = (xx*10) - 5; int yyLoc = (yy*10) - 5; g.drawLine(xLoc, yLoc, xxLoc, yyLoc); } } 

    Дальнейший совет

    Вы могли заметить, что линии выглядят довольно «зубчатыми» и уродливыми. Оба BufferedImage или JComponent имеют доступ к более полезному объекту Graphics2D (для JComponent необходимо нарисовать его в paintComponent() ). Экземпляр Graphics2D принимает подсказки рендеринга, которые можно использовать для сглаживания (сглаживания) элементов, нарисованных.

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