Как работает графический класс в Java?


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

import javax.swing.*;
import java.awt.*;

public class line extends JPanel {
    public void paintComponent(Graphics g) {
        g.drawLine(0, 0, 90, 90);
    }

    public static void main(String[] args) {
        JFrame jf = new JFrame();
        jf.add(new line());
        jf.setSize(500, 500);
        jf.setVisible(true);
    }
}
Хорошо, теперь несколько вещей не имеют для меня смысла. Во-первых, при вызове line он должен активировать метод paintComponent в классе line. Это свойство статических методов (вызывается с помощью имя класса). Но метод paintComponent не имеет статического модификатора.

Поскольку эта программа работает, хотя мы должны предположить, что paintComponent действительно вызывается и ожидает графический объект в качестве аргумента. Когда его вызывают, хотя у него нет аргументов. Почему это не создает ошибки? Я провел несколько тестов с передачей строки, а затем ничего в метод, который ожидал целочисленный объект. Я получил ошибки в обеих программах.

Итак, каким-то образом графический объект называется g создается и используется метод drawline. Но графика абстрактна.

Итак, вот мои вопросы:

  1. Почему paintComponent вызывается автоматически, когда вызывается строка класса, когда paintComponent не статичен?

  2. Почему paintComponent принимает пустые аргументы, когда он ожидает графический объект?

  3. Как же тогда создается графический объект g, поскольку графический класс абстрактен и не может быть создан экземпляр?

Помоги мне переполнить стек, ты моя единственная надежда.

Править: Хорошо, я думаю, что на этот вопрос довольно хорошо ответили, Спасибо!

2 4

2 ответа:

  1. PaintComponent вызывается, когда AWT решает, что пришло время покрасить окно (в большинстве случаев, потому что ОС отправляет ему сообщение с указанием сделать это). Когда он рисует JFrame, он пересекает дерево объектов, которые находятся внутри него. Среди которых есть ваш экземпляр line, потому что вы добавили его с jf.вызов add (new Line ()). На каждом из них вызывается метод Paint component.

  2. Он не принимает пустых аргументов.

  3. Когда AWT вызывает paintComponent это передает экземпляр конкретного класса, который наследуется от Graphics.

Сигнатурный компонент Paint (Graphics g) не столько говорит, что параметр должен быть именно типа Graphics. Но на самом деле говорит, что это должен быть тип Graphics или любой класс, наследующий от Graphics. Другой способ взглянуть на это-сказать, что любой класс, который наследует от Graphics, также имеет тип Graphics.

Для рисования линий, фигур, символов и изображений на экране внутри вашего апплета. Большинство графических операций в Java являются методами, определенными в графическом классе . Вам не нужно создавать экземпляр графики , чтобы нарисовать что-то в вашем апплете; в методе paint() вашего апплета вам дается графический объект. Рисуя на этом объекте, вы рисуете на своем апплете, и результаты появляются на экране. Графический класс является частью java.пакет awt, так что если ваш апплет делает любую картину (как это обычно бывает), убедитесь, что вы импортируете этот класс В начале вашего файла Java..............