Java JPanel Graphics - Понимание того, как рисовать простую форму - PullRequest
0 голосов
/ 09 июля 2020

Заявление об ограничении ответственности: я новичок в Java. Я новичок в Swing. И я уверен, что это видно.

Я просмотрел довольно много примеров / руководств по рисованию на холсте jpanel. Но в основном они имеют один и тот же базовый формат c и помещают все свои drawLine / drawRect / drawAr c в метод paintComponent (). Предполагается, что люди хотят нарисовать статические c объекты на jpanel один раз. Но что, если я хочу изменить объект jpanel в процессе выполнения программы, например, программу рисования или игру?

Я полагаю, мне нужно иметь доступ к объекту jpanel и внутренним методам для покрасить. Готов поспорить, что то, что я делаю, не является передовой практикой, но вот что у меня есть:

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

public class PaintPanel extends JPanel {
    public static JFrame frame;
    private Graphics g = getGraphics();

    public static void main(String[] args) {
        frame = new JFrame();
        frame.getContentPane().setBackground(new Color(32, 32, 32));
        frame.setResizable(false);
        frame.setBounds(1, 1, 800, 600);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);
        frame.setVisible(true);
        frame.setLocationRelativeTo(null); // center frame on screen
        
        PaintPanel paintPanel = new PaintPanel();
        paintPanel.setBounds(10, 10, 100, 100);
        paintPanel.setBackground(Color.red);
        frame.add(paintPanel);
    }
    
    // constructor
    public PaintPanel() {

    }

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
    }
    
    public void DrawRect(Integer x, Integer y, Integer w, Integer h, Color color) {
        g.setColor(color);
        g.fillRect(x, y, w, h);
        this.repaint(); // doesn't seem to do anything
    }
}

Этот код приводит к появлению красной панели, но мой пользовательский метод DrawRect () не нарисуйте что угодно.

  1. В некоторых местах я читал, что необходимо переопределить метод paintComponent (). Если в нем ничего нет, зачем?
  2. Как мне заставить работать мой метод DrawRect ()?

1 Ответ

0 голосов
/ 09 июля 2020

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

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

Чтобы создать анимацию, вы делаете al oop, который изменяет модель с течением времени и просит пользовательский компонент перерисовать себя с помощью repaint ( ).

...