java Java将矩形添加到ArrayList然后绘制它们

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/26638620/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-02 10:18:24  来源:igfitidea点击:

Java add rectangles to ArrayList and then draw them

javaswingarraylist

提问by user2939293

I′m really in need of some help from you guys. I try to add rectangles to an ArrayList and then loop through the list to draw them all. I'm not sure if I'm using the right approach, but here is my code so far.

我真的需要你们的帮助。我尝试将矩形添加到 ArrayList,然后遍历列表以绘制所有矩形。我不确定我是否使用了正确的方法,但这是迄今为止我的代码。

Edit: the code does not draw the rectangles that I added to the ArrayList. I don't even know if they are added the right way, or accessed through the for-loop in the right way.

编辑:代码没有绘制我添加到 ArrayList 的矩形。我什至不知道它们是否以正确的方式添加,或者是否以正确的方式通过 for 循环访问。

In TestProgram

在测试程序中

import java.awt.BorderLayout;
import java.awt.Graphics;
import java.util.ArrayList;
import javax.swing.JFrame;


public class TestProgram extends JFrame {
    private ShapeRectangle rectangle;
    public ArrayList<Shapes> list = new ArrayList<Shapes>();


    public TestProgram(String title) {
        super(title);
        setLayout(new BorderLayout());
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        initComponents();
        setSize(500, 700);
        setVisible(true);
  }

    private void initComponents() {
        rectangle = new ShapeRectangle();    
        add(rectangle, BorderLayout.CENTER);

        list.add(rectangle);        
        Graphics g = getGraphics();
        for (int i = 0; i < list.size(); i++) {
            rectangle.draw(g);
        }
  }

    public static void main(String args[]) {
        new TestProgram("Drawing program");
    }
}

In class ShapeRectangles:

在类 ShapeRectangles 中:

import java.awt.Graphics;

public class ShapeRectangle extends Shapes {

    public ShapeRectangle() {}    

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponents(g);
        draw(g);        
    }

    @Override
    public void draw(Graphics g) {
       g.drawLine(20,20,60,60);
       g.drawLine(130,30,80,11);
       g.drawRect(200,30,20,140);        
   }
}

In class Shapes:

在类形状中:

import java.awt.Graphics;
import javax.swing.JPanel;

public abstract class Shapes extends JPanel {

    abstract public void draw(Graphics g); 

}

}

回答by Paul Samsotha

Don't make Shapesa JPanel. Also take out its paintComponentmethod.

不要做Shapes一个JPanel. 也取出其paintComponent方法。

Instead have a JPanelclass which is the main drawing surface. Keep the List<Shapes>in the class. Iterate through the list in the paintComponentmethod of that class, calling each Shapes's draw method

而是有一个JPanel作为主要绘图表面的类。保持List<Shapes>在课堂上。遍历paintComponent该类的方法中的列表,调用 eachShapes的 draw 方法

class DrawingPanel extends JPanel {
    List<Shapes> shapes;
    // add shapes

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        for (Shapes shape: shapes) {
            shape.draw(g);
        }
    }
}

Then just add that panel to the frame.

然后只需将该面板添加到框架中。

Remember that all painting should be done with the Graphics context passed into the paintComponentmethod. We do not do custom painting by using getGraphics.

请记住,所有绘制都应使用传递给该paintComponent方法的 Graphics 上下文来完成。我们不使用getGraphics.

Also you'll probably want to store some state in the Shapesclass so you can change the x/y/width/height state. Right now you are are using the same hard coded values for all your shapes.

此外,您可能希望在Shapes类中存储一些状态,以便您可以更改 x/y/宽度/高度状态。现在,您正在为所有形状使用相同的硬编码值。

abstract class Shapes {
    int x, y;
    public Shapes(int x, int y) {
        this.x = x; this.y = y;
    }
    protected abstract void draw(Graphics g);
}
class RectangleShape extends Shape {
    int width, height;
    public RectangleShape(int x, int y, int width, int height) {
        super(x, y);
        this.width = width; this.height = height;
    }
    @Override   
    public void draw(Graphics g) {
        g.fillRect(x, y, width, height);
    }
}

See a complete example with more complex objects with animation

查看带有动画的更复杂对象完整示例

回答by Mr. Polywhirl

This is bad, you either want to add it as a component with absolute positioning, or you want to draw it, choose one.

这不好,你要么想把它添加为一个绝对定位的组件,要么你想画它,选择一个。

this.add(rectangle, BorderLayout.CENTER); // Add as component of the panel.
list.add(rectangle);                      // Add as method of drawing on the panel.

The latter will work better because you are drawing. If you need drag-and-drop, add it as a child, but add the drawing to the child.

后者会更好,因为您正在绘图。如果需要拖放,将其添加为子项,但将绘图添加到子项中。

You can call repaint()on the JFrame to update the graphics after changing the rectangle's coordinates and sizes.

您可以repaint()在更改矩形的坐标和大小后调用JFrame 来更新图形。

DrawShapes

绘制形状

import java.awt.BorderLayout;
import java.awt.Graphics;
import java.util.ArrayList;

import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class DrawShapes extends JFrame {
    public ArrayList<Shape> shapeList = new ArrayList<Shape>();

    public DrawShapes(String title) {
        super(title);

        this.setLayout(new BorderLayout());
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setSize(500, 700);
        this.setLocationRelativeTo(null);

        this.initComponents();
    }

    private void initComponents() {
        shapeList.add(new RectangleShape(20, 20, 60, 60));
        shapeList.add(new RectangleShape(130, 30, 80, 11));
        shapeList.add(new RectangleShape(200, 30, 20, 140));
    }

    @Override
    public void paint(Graphics g) {
        for (Shape s : shapeList) {
            s.draw(g);
        }
    }

    public static void main(String args[]) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                DrawShapes d = new DrawShapes("Drawing program");
                d.setVisible(true);
            }
        });
    }
}

RectangleShape

矩形

import java.awt.Graphics;

public class RectangleShape extends Shape {
    public RectangleShape(int x, int y, int width, int height) {
        super(x, y, width, height);
    }

    public RectangleShape() {
        super();
    }

    @Override
    public void draw(Graphics g) {
        g.drawRect(getX(), getY(), getWidth(), getHeight());
    }
}

Shape

形状

import java.awt.Graphics;

public abstract class Shape {
    private int x;
    private int y;
    private int width;
    private int height;

    public Shape() {
        this(0, 0, 1, 1);
    }

    public Shape(int x, int y, int width, int height) {
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
    }

    public abstract void draw(Graphics g);

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }

    public int getWidth() {
        return width;
    }

    public void setWidth(int width) {
        this.width = width;
    }

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }
}

回答by MadProgrammer

Start by taking a look at the 2D Graphics, in particular Working with Geometry

首先查看2D Graphics,特别是使用几何

The 2D Graphics API defines a ShapeAPI which includes, amongst other things, a Rectangleclass

2D 图形 API 定义了一个ShapeAPI,其中包括一个Rectangle

For example...

例如...

enter image description here

在此处输入图片说明

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class TestRectangles {

    public static void main(String[] args) {
        new TestRectangles();
    }

    public TestRectangles() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private List<Rectangle> rectangles;

        public TestPane() {
            rectangles = new ArrayList<>(25);
            Random ran = new Random();

            for (int index = 0; index < 10; index++) {
                int x = ran.nextInt(200 - 10);
                int y = ran.nextInt(200 - 10);
                int width = ran.nextInt(200 - x);
                int height = ran.nextInt(200 - y);
                rectangles.add(new Rectangle(
                        x, 
                        y, 
                        width, 
                        height));
            }
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            for (Rectangle rect : rectangles) {
                g2d.draw(rect);
            }
            g2d.dispose();
        }

    }

}