У меня проблемы с пониманием фундаментальной концепции в Java 2D.
Чтобы дать конкретный пример:
Можно настроить свинг компонент через реализацию собственной версии метода paintComponent(Graphics g)
График доступен для тела метода.
Вопрос:
Что это за объект Graphics, я имею в виду, как он связан с объектом, у которого есть метод paintComponent
? Хорошо, я понимаю, что вы можете сделать что-то вроде:java 2D и swing
g.setColor(Color.GRAY);
g.fillOval(0, 0, getWidth(), getHeight());
Чтобы получить серый овальный цвет. Я не понимаю, как объект Graphics связан с компонентом и холстом. Как это делается на самом деле?
Другой пример:
public class MyComponent extends JComponent {
protected void paintComponent(Graphics g) {
System.out.println("Width:"+getWidth()+", Height:"+getHeight());
}
public static void main(String args[]) {
JFrame f = new JFrame("Some frame");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(200, 90);
MyComponent component = new MyComponent ();
f.add(component);
f.setVisible(true);
}
}
Это печатает
Ширина: 184, высота: 52
Что это значит размер? Я не добавил ничего к кадру размера (200,90).
UPDATE:
Я понимаю, что я должен переопределить краски, чтобы дать в Graphics g
объекта подсказки, необходимые для выполнения перекрасить, и что я не должен создать Graphics
объект как один будет предоставлена платформой.
Что происходит после этого, я не могу понять.
E.g. Graphics
представляет экран, и объект окрашивается соответствующим образом на экране, как только я начинаю называть различные методы g.setXXX
?
Сохраняется ли она в очереди и существует ассоциация 1-1 между g
и каждый component
? Итак, структура использует каждый из g
каждого компонента для рисования по одному за раз?
Как это работает? Любая помощь по этому вопросу весьма приветствуется
Благодаря
Итак, когда вызов 'paintComponent' в конечном итоге вызывается, когда вызываются различные методы объекта« Graphics », они выполняются непосредственно на экране? – Cratylus
Они выполняются на устройстве позади (см. Component.print, вызывающая краска, которая должна использовать устройство принтера). Это более или менее отображает непосредственно на графических примитивах платформы. – mtraut
Еще точнее: это может быть автономное устройство (битмап-дескриптор) тоже - как в случае двойной буферизации. – mtraut