Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

Java: проблема выполнения рисования в наследниках Component

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
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!!!!!!! */
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...