Рисование прямоугольника в Java - PullRequest
0 голосов
/ 10 февраля 2020

Я пытаюсь нарисовать прямоугольник. Но я не уверен, как, это рисует в определенной панели. Хотелось бы увидеть пример того, как я могу предоставить панель и положение для рисования прямоугольника. У меня есть следующий шаблон, я хотел бы увидеть, какие изменения мне нужно сделать, чтобы использовать этот класс для рисования прямоугольника на любых панелях. Мое намерение состоит в том, чтобы использовать ширину и высоту панелей и добавить прямоугольник в эту позицию. Цель состоит в том, чтобы иметь возможность использовать этот класс в любом месте с любыми JPanels.

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

public class DrawRectangle{

    private int startX;
    private int startY;
    private int width;
    private int height;
    private Color color;
    private JPanel panel;

    public DrawRectangle(JPanel panel, int startX, int startY, int width, int height, Color color) {
        this.startX = startX;
        this.startY = startY;
        this.width = width;
        this.height = height;
        this.color = color;
            this.panel = panel; 
    }

    public void paint(Graphics g) {
        g.setColor(this.color);
        g.fillRect(this.startX, this.startY, this.width, this.height);
        g.drawRect(this.startX, this.startY, this.width, this.height);
    }
}

Ответы [ 2 ]

1 голос
/ 10 февраля 2020

Вам нужно изменить интересующий JPanel, чтобы использовать этот код:

  • Переопределение его метода paintComponent
  • Сначала вызовите метод superC paintComponent в вашем переопределении
  • А затем рисуем метод рисования вашего собственного класса DrawRectangle
  • Если вы хотите иметь возможность рисовать несколько прямоугольников, тогда присвойте JPanel List<DrawRectangle> и нарисуйте их в для l oop внутри paintComponent.

Например, для одного прямоугольника:

public class DrawingPanel extends JPanel {
    private DrawRectangle drawRectangle;

    public DrawingPanel(DrawRectangle drawRectangle) {
        this.drawRectangle = drawRectangle;
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (drawRectangle != null) {
            drawRectangle.paint(g);
        }
    }
}

и для многих прямоугольников:

public class DrawingManyRectPanel extends JPanel {
    private List<DrawRectangle> drawRectangles;

    public DrawingManyRectPanel(List<DrawRectangle> drawRectangles) {
        this.drawRectangles = drawRectangles;
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (drawRectangles != null) {
            for (DrawRectangle rectangle : drawRectangles) {
                rectangle.paint(g);
            }
        }
    }
}

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

public void addRectangle(DrawRectangle rectangle) {
    drawRectangles.add(rectangle);
    repaint();
}

аналогично для удаления прямоугольников


Альтернативный способ сделать это, если вы не планируйте удалять прямоугольники или изменять уже нарисованные, это нарисовать их в BufferedImage, а затем нарисовать это изображение в методе рисования JPanel paintComponent.

0 голосов
/ 10 февраля 2020

Обратите внимание на класс Graphics2D, он предназначен именно для того, что вы пытаетесь сделать, и лучше подходит для рисования, чем обычный метод paintComponent. Вы можете прочитать о том, как использовать Graphics2D здесь .

Во-первых, обратите внимание, что вы не можете иметь объект Graphics2D без приведения его из объекта Graphics, как я это делал здесь Graphics2D g2 = (Graphics2D) g;.

Это пример, который должен помочь вам получить начал, имейте в виду, что я использую абсолютный макет, так что нет менеджера макета. Это код, который я использовал для создания игры в блэкджек, поэтому имена не являются обобщенными c.

Также я добавил сглаживание, чтобы ваши фигуры с Graphics2D выглядели очень хорошо, а методы центрировали фигуры на экран, который, вероятно, будет хорошо работать с вашими JPanels.

Обратите внимание, как я создал определенные c методы для объектов Graphics2D, которые я хотел нарисовать, а затем нарисовал их с помощью класса Graphics. Мне показалось, что это работает лучше всего, так что мой paintComponent был не просто завален бесконечным повторяющимся кодом. frame в моем коде получал ширину и высоту JFrame У меня был JPanel, так что вы просто обратитесь к JPanel, вместо которого вы бы его взяли.

class DrawTable extends JPanel
{

    DrawTable()
    {
        super();
        System.out.println("Looks good to me pal!");
    }

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

        //Setup background
        drawRectangle(g, Color.BLACK,
                frame.getWidth() / 2, frame.getHeight() / 2,
                frame.getWidth(), frame.getHeight());

        // Create table at center
        drawRectangle(g, new Color(206, 187, 158),
                frame.getWidth() / 4, frame.getHeight(), //left table leg
                50, 600);
        drawRectangle(g, new Color(206, 187, 158),
                frame.getWidth() / 1.5, frame.getHeight(), //right table leg
                50, 600);
        drawEllipse(g, new Color(153, 154, 104),
                frame.getWidth() / 2, frame.getHeight() / 2, //Draws outer circle
                1200, 400);
        drawEllipse(g, new Color(53, 101, 77),
                frame.getWidth() / 2, frame.getHeight() / 2, //Draws inner circle
                1125, 350);
    }

    private void drawEllipse(Graphics g, Color color, double x, double y, double width, double height) //centers ellipse
    {
        Graphics2D g2 = (Graphics2D) g;
        double centerX = (double) x - width / 2;
        double centerY = (double) y - height / 2;
        Ellipse2D ellipse = new Ellipse2D.Double(centerX, centerY, width, height);
        RenderingHints render = new RenderingHints(
                RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        render.put(
                RenderingHints.KEY_RENDERING,
                RenderingHints.VALUE_RENDER_QUALITY);
        g2.setRenderingHints(render);
        g2.setColor(color);
        g2.fill(ellipse);
        g2.draw(ellipse);
    }

    private void drawRectangle(Graphics g, Color color, double x, double y, double width, double height) //centers rectangle
    {
        Graphics2D g2 = (Graphics2D) g;
        double centerX = (double) x - width / 2;
        double centerY = (double) y - height / 2;
        Rectangle2D rect = new Rectangle2D.Double(centerX, centerY, width, height);
        RenderingHints render = new RenderingHints(
                RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        render.put(
                RenderingHints.KEY_RENDERING,
                RenderingHints.VALUE_RENDER_QUALITY);
        g2.addRenderingHints(render);
        g2.setColor(color);
        g2.fill(rect);
    }
}

Дайте мне знать, если вам нужна дополнительная помощь!

...