Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > Объясните пож. как работает метод paint


Автор: sidiakin 23.1.2011, 22:51
Код

import java.awt.*;
import java.awt.event.*;

class MyCanvas extends Canvas{
    public MyCanvas(){super();}
    
    public void paint(Graphics g){
        g.drawRect(30, 30, 50, 50);
    }
}

class Program extends Frame{
    
    Program(String s){
        super(s);
        add(new MyCanvas());
        
        setSize(400, 400);
        setVisible(true);
    }
    
    public static void main(String[] args){
        Frame f = new Program("Test");
        f.addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent ev){
                System.exit(0);
            }
        });
    }
}


Знаю, что многие задавали подобный вопрос, но все таки...

Вот я создал Frame и вставил туда свой Canvas и он работает. А если я во Frame вставлю Panel, то ничего не работает. Т.е. я так понимаю, что все работает, только все затирается. Объясните, как работает метод Paint. Пытался использовать getGraphics, но тоже не получилось, или ошибка или так же ничего не выводилось. И не очень понятно зачем мне Canvas, если я могу просто создать Panel и в ней рисовать. Зачем мне создавать Frame, в нем Panel, а в Panel создавать Canvas. Как-то накручено. 

Спасибо!

Автор: techmax 24.1.2011, 07:24
У Skipy есть хорошо написанная статья по этому подводу http://www.skipy.ru/

Автор: Skipy 24.1.2011, 13:18
http://www.skipy.ru/technics/gui_int.html

Автор: _Y_ 24.1.2011, 16:25
Skipy, великолепная статья, но на поставленный вопрос прямого ответа она не дает к сожалению. Вспоминая старую крылатую фразу "Человек хотел банан, а получил горилу держащую банан и все окружающие джунгли в придачу".

У меня вот есть подобная проблема. После обновления содержания JTable не отражает изменений. А вот если чуть пошевелить размер JForm то в таблице появляются новые значения. Сколько ни бьюсь с перерисовкой, ничего хорошего не выходит.

Автор: dorogoyIV 24.1.2011, 16:55
всем привет!!!
я не ходил по ссылкам, выложенным в этой теме, но если мне не изменяет память, метод paint постоянно, при любом шевелении, вызывается для компонента.

для ТС посоветовал бы писать примерно так:
Код

 class MyPanel extends JPanel // sorry Panel :)
 {
  MyPanel(/*parameters*/)
  {
  }

  public void paint(Graphics g) // for swing paintComponent(...)
  {
   /*drawing*/
  }
 {



_Y_, перерисовка в твоем случае не выход, надо обновлять модель таблицы

Автор: _Y_ 24.1.2011, 19:42
Цитата(dorogoyIV @ 24.1.2011,  16:55)
_Y_, перерисовка в твоем случае не выход, надо обновлять модель таблицы

Чего-то я не догоняю. Модель таблицы это не графический компонент, а хранилище данных. И что подразумевается под ее обновлением?

Автор: aleksandy 24.1.2011, 19:51
Цитата(dorogoyIV @ 24.1.2011,  16:55)
И что подразумевается под ее обновлением?

Генерирование соответствующих TableModelEvent

Автор: _Y_ 24.1.2011, 22:06
aleksandy, спасибо. Въехал.

Автор: Skipy 25.1.2011, 10:43
Цитата
Skipy, великолепная статья, но на поставленный вопрос прямого ответа она не дает к сожалению. Вспоминая старую крылатую фразу "Человек хотел банан, а получил горилу держащую банан и все окружающие джунгли в придачу".


Э-э-э... Вопрос был - как работает метод paint? В смысле, была просьба, объяснить, как он работает. Я объяснил. Не? На какой вопрос я не ответил?

Автор: _Y_ 25.1.2011, 15:31
Skipy, я вот про это
Цитата(sidiakin @  23.1.2011,  22:51 Найти цитируемый пост)
И не очень понятно зачем мне Canvas, если я могу просто создать Panel и в ней рисовать. Зачем мне создавать Frame, в нем Panel, а в Panel создавать Canvas. Как-то накручено. 

В принципе из Вашей статьи многое становится понятно. Но простого ответа на эти вопросы там я не углядел. 

А про метод paint все рассказано - никаких вопросов не остается (у меня во всяком случае) smile 

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