Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
velikiyxela
Зарегистрирован: 11.02.2007 Сообщения: 13 Откуда: Satka
|
Добавлено: Сб Фев 14 2009 17:35 Заголовок сообщения: Java: проблема выполнения рисования в наследниках Component |
|
|
Столкнулся с проблемой (разрешимой!) в Java при попытке рисовать на Panel, JPanel, Frame, JFrame и т. д.
За рисование на компоненте отвечает класс Graphics. Для каждого потомка Component (java.awt.Component). Прописная истина...
Получить экземпляр этого класса для любого потомка Component (как и для самого java.awt.Component) легко - вызовом метода getGraphics(). А вот воспользоваться этим методом - не получается. Вообще нигде, кроме метода paint(Graphics g), причём ТОЛЬКО И ИСКЛЮЧИТЕЛЬНО ТОГО ЭКЗЕМПЛЯРА КЛАССА, ДЛЯ КОТОРОГО БЫЛ ВЫЗВАН paint(Graphics g).
Не буду голословным, приведу пример: |
|
Вернуться к началу |
|
|
velikiyxela
Зарегистрирован: 11.02.2007 Сообщения: 13 Откуда: Satka
|
Добавлено: Сб Фев 14 2009 18:02 Заголовок сообщения: |
|
|
package diagrams;
import java.awt.*;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Line2D.*;
public class Diagram extends javax.swing.JPanel {
Graphics g; /* экземпляр класса, отвечающий за прорисовку объекта */
Graphics2D g2; /* экземпляр, расширяющий Graphics инструментальными средствами */
java.awt.Shape[] Shapes; /* массив того, что будем рисовать */
/* инициализируем объект (это конструктор) */
public Diagram() {
super();
g = this.getGraphics();
g2 = (Graphics2D)g;
Shapes[0] = Line();
}
/* создаём то, что будем рисовать */
public java.awt.geom.Line2D.Float Line(){
java.awt.geom.Line2D.Float l = new java.awt.geom.Line2D.Float(10, 100, 120, 100); /* */
g2.draw(l); /* ПОПЫТКА НАРИСОВАТЬ УЖЕ СУЩЕСТВУЮЩИЙ
ОБЪЕКТ!! это вызовет ошибку времени
выполнения: NullPointerException g2 можно
поменять g - результат тот же
ЗАКОММЕНТИРУЙТЕ ЭТОТ ОПЕРАТОР, И ТОГДА КОД ЗАРАБОТАЕТ.
*/
return l;
}
/* а вот здесь всё корректно и всё работает... ПОЧЕМУ?
ЗАГАДКА ЗАГАДОК.... КТО БЫ РЕШИТЬ ПОМОГ...
*/
public void paint(Graphics g){
super.paint(g);
this.Line();
g2.draw(Line()); /* А ВОТ ЗДЕСЬ - И ПРИ ЧЁМ ТОЛЬКО ЗДЕСЬ! - ОШИБОК НЕТ!!! ПОЧЕМУ???? */
g2.drawOval(10, 10, 10, 10);
}
} |
|
Вернуться к началу |
|
|
velikiyxela
Зарегистрирован: 11.02.2007 Сообщения: 13 Откуда: Satka
|
Добавлено: Сб Фев 14 2009 18:26 Заголовок сообщения: |
|
|
Ну, а теперь собственно сама задача:
НУЖНО НАУЧИТЬ ПОСТОРОННИЙ КЛАСС ВЫПОЛНЯТЬ РИСОВАНИЕ В ОБЪЕКТЕ Graphics СУЩЕСТВУЮЩЕГО КЛАССА.
Считаем, что все необходимые классы и пакеты импортированы.
class X extends Component{
public X{
super();
}
...
...
public void paint(Graphics g){
super.paint(this.getGraphics());
}
}
class Y{
X x;
public Y(X aX){
x = aX;
}
public void drawThisLine(){
x.getGraphics().drawLine(0, 0, 200, 200); /* ПРОБЛЕМА КРОЕТСЯ ЗДЕСЬ!!! КАК ЕЁ ИЗБЕЖАТЬ??? */
}
}
//......
// ИСПОЛЬЗУЮЩЕЕ ВХОЖДЕНИЕ
anX = new X();
anY = new Y(anX);
//......
anY.drawThisLine();/* ЭТА СТРОКА НЕ ДОЛЖНА ВЫЗВАТЬ ОШИБКИ ВРЕМЕНИ ВЫПОЛНЕНИЯ!!! КАК ЭТОГО ДОСТИЧЬ??? */
/* ВОТ ЭТУ ПРОБЛЕМУ И НУЖНО РЕШИТЬ! ПОМОГИТЕ, PLEASE!!!!!!! */ |
|
Вернуться к началу |
|
|
|