Недавно я пытался работать с графикой на 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, который использует метод рисования. Но Графика абстрактна.
Итак, вот мои вопросы:
Почему paintComponent вызывается автоматически, когда вызывается его строка класса, когда paintComponent не является статическим?
Почему paintComponent принимает пустые аргументы, когда ожидает объект Graphics?
Как создается объект Graphics g, поскольку класс Graphics является абстрактным и не может быть создан?
Помоги мне Stack Overflow, ты моя единственная надежда.
РЕДАКТИРОВАТЬ: Хорошо, я думаю, что на этот вопрос довольно хорошо ответили, спасибо!
paintComponent()
вызывается без аргументов? - person irrelephant   schedule 04.08.2012paintComponent
не является статическим методом... он переопределен из JComponent.paintComponent. Он не принимает пустые аргументы AFAIK. ПереданныйGraphics
создается базовым кодом AWT. - person obataku   schedule 04.08.2012new line()
создает экземпляр классаline
. Таким образом,paintComponent
не вызывается из статической ссылки. - person MadProgrammer   schedule 04.08.2012super.paintComponent(g)
;) - person MadProgrammer   schedule 04.08.2012