Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Апплеты > JApplet, что использовать paint или paintComponent


Автор: monax 21.6.2007, 18:31
Заинтересовал вопрос, как правильно рисовать в swing. В одной книге нашёл описание как это делать, написал два класса. Потом попробовал заменить paintComponent на paint. Работает по-прежнему. Хотя есть разница. Если в классе Screen убрать вызов super(); из конструктора, то при использовании  paintComponent во время завершения апплета вылетают исключения, при использовании paint() этого не происходит.
Всё-таки хотелось бы знать, как правильнее.
Код
 
import java.awt.Color;
import javax.swing.JApplet;

public class Application extends JApplet {

    private Screen screen;

    public void init() {
        screen = new Screen();
        screen.setBackground(Color.BLACK);
        setContentPane(screen);
    }
}


Код

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;

public class Screen extends JPanel {

    public Screen() {
        super();
    }
    
    public void paintComponent(Graphics cont) {
        super.paintComponent(cont);
        int width = getSize().width;
        int height = getSize().height;

        cont.setColor(Color.WHITE);
        cont.drawString("String", width / 2, height / 2);
    }
}


Автор: LSD 21.6.2007, 22:36
Лучше использовать paintComponent(). И по идее исключений там быть не должно. Что за исключение у тебя вылетает?

Автор: monax 22.6.2007, 22:16
Код

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException: component argument pData
    at sun.awt.windows.Win32SurfaceData.initOps(Native Method)
    at sun.awt.windows.Win32SurfaceData.<init>(Win32SurfaceData.java:448)
    at sun.awt.windows.Win32SurfaceData.createData(Win32SurfaceData.java:316)
    at sun.awt.Win32GraphicsConfig.createSurfaceData(Win32GraphicsConfig.java:357)
    at sun.awt.windows.WComponentPeer.replaceSurfaceData(WComponentPeer.java:332)
    at sun.awt.windows.WComponentPeer.replaceSurfaceData(WComponentPeer.java:313)
    at sun.awt.windows.WComponentPeer$2.run(WComponentPeer.java:353)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:461)
    at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)


Но это если вместо
Код

    public Screen() {
        super();
        addMouseListener(this);
    }

написать это
Код

    public Screen() {        
        addMouseListener(this);
    }


Исключение появляется при завершении работы апплета, то есть отловил я это в консоли.

Автор: newObject 7.8.2007, 10:35
Во че нашел (случайно, до этого как то не заострял внимание, ЗЛО копи-паста  smile ).

Цитата

В документации по paint() указано, что при вызове метода он, в свою очередь, вызывает три других метода JComponent: сначала paintComponent(), затем paintBorder() и, наконец, paintChildren(). Из порядка вызова методов вы можете увидеть, что Swing рисует себя снизу вверх. Важным уроком является то, что для переопределения внешнего вида компонента вы должны переопределить метод paintComponent(), который непосредственно несет ответственность за рисование конкретного компонента на экране. 


Полный текст http://www-128.ibm.com/developerworks/ru/edu/j-medswing/section5.html

А эксепшен валится скорее всего из-за того что тяжелый представитель awt не находит легкой пары JPanel, которая инициализируется вызовом конструктора без параметров JPanel ( super(); ).

Автор: LSD 7.8.2007, 13:40
Цитата(newObject @  7.8.2007,  11:35 Найти цитируемый пост)
А эксепшен валится скорее всего из-за того что тяжелый представитель awt не находит легкой пары JPanel, которая инициализируется вызовом конструктора без параметров JPanel ( super(); ).

1. конструктор суперкласса вызывается всегда, независимо от того написал его вызов программист или нет
2. Screen не тяжеловестный копмонент.

Автор: newObject 7.8.2007, 15:17
Цитата

2. Screen не тяжеловестный копмонент.


1. Я не говорил что Screen тяжеловесный компонент.
2. По поводу конструктора, это да, нагнал. Подзабыл маленько ООП.

И всетаки по поводу эксепшена, я не нашел четкого ответа что это может быть, но практически все говорят о http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4280243 в версии 1.3.0 

Автор: Just_Girl 10.8.2007, 12:13
You sometimes see code that overrides paint() instead of paintComponent(). 
This was necessary in the older AWT, however in Swing paint() calls three methods: paintComponent(), paintBorder(), and paintChildren. 
The general rule is to override paintComponent() if you're using Swing (JComponent, JPanel, JApplet) and paint() if you're using one of the AWT classes (Applet, Canvas). 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)