Как работает класс графики в 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);
    }
}

Хорошо, теперь несколько вещей не имеют для меня смысла. Во-первых, когда вызывается линия, она должна активировать метод paintComponent в классе линии. Это свойство статических методов (вызываемых с именем класса). Но у метода paintComponent нет статического модификатора.

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

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

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

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

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

  3. Как создается объект Graphics g, поскольку класс Graphics является абстрактным и не может быть создан?

Помоги мне Stack Overflow, ты моя единственная надежда.

РЕДАКТИРОВАТЬ: Хорошо, я думаю, что на этот вопрос довольно хорошо ответили, спасибо!


person Reid Erdwien    schedule 04.08.2012    source источник
comment
Откуда вы знаете, что paintComponent() вызывается без аргументов?   -  person irrelephant    schedule 04.08.2012
comment
Итак, Graphics представляет собой < i>графический контекст. Я не совсем понимаю, о чем еще вы говорите, поскольку явно paintComponent не является статическим методом... он переопределен из JComponent.paintComponent. Он не принимает пустые аргументы AFAIK. Переданный Graphics создается базовым кодом AWT.   -  person obataku    schedule 04.08.2012
comment
new line() создает экземпляр класса line. Таким образом, paintComponent не вызывается из статической ссылки.   -  person MadProgrammer    schedule 04.08.2012
comment
Найдите время и прочитайте oracle.com/technetwork/java/painting- 140037.html Это должно помочь вам понять некоторые вопросы, которые у вас есть... кроме того, убедитесь, что вы позвонили super.paintComponent(g) ;)   -  person MadProgrammer    schedule 04.08.2012


Ответы (3)


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

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

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

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

person Eelke    schedule 04.08.2012

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

person Hriday Dubey    schedule 02.05.2017

Вы должны знать, что paintComponent() вызывается только AWT, а не вами в первый раз. Но вы можете использовать метод «repaint()», потому что он вызывает paintComponent() внутри для обновления графики. Также графический объект создается внутренним подклассом Graphics. Поэтому перед вызовом paintComponent() AWT создает объект (предположим, g) класса, который расширяет Graphics. После этого AWT вызывает ваш определенный paintCompoent(), передавая объект "g".

Это то же самое, что и метод actionPerformed() для слушателя. Вы просто определяете его, но на самом деле не знаете, где он вызывается. На самом деле это задачи, которые выполняет JVM (виртуальная машина Java):

jbutton.addActionListener(new ActionListener(){
   public void actionPerformed(ActionEvent e){
      //Do sth on button click.
   }
});
person WailenB    schedule 03.10.2019