Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> рисование на панели 
:(
    Опции темы
irdis13
  Дата 10.5.2010, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 10.5.2010

Репутация: нет
Всего: нет



Доброго времени суток!!
Пишу курсовик "кластерный анализ" и возникла проблема с рисованием на панели! Всё хорошо, всё рисуется, но не пойму как по какому-либо событию дорисовать на панели линию!!!
к примеру вот код панели
Код

public class ResultPanel extends javax.swing.JPanel {

    public ResultPanel() {
        initComponents();
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawLine(100, 200, 300, 400);
    }
}


тут рисуется линия только при её создании
а затем мне в цикле нужно постоянно дорисовывать n-ное количество линий (и не тоолько) в этой панели.
Сама проблема в том, что Graphics доступен только в методе public void paintComponent(Graphics g)  и поэтому не могу дорисовать линию!! Может как-то буферизовать уже нарисованное изображение, а потом к нему дорисовывать что-то?
Помогите кто чем может
PM MAIL   Вверх
pathfinder
Дата 10.5.2010, 16:31 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 3.3.2010

Репутация: 7
Всего: 10



Тынц

Начиная поста с пятого то что нужно.
PM MAIL   Вверх
irdis13
Дата 10.5.2010, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 10.5.2010

Репутация: нет
Всего: нет



Спасибо за ссылку, очень помог, когда искал такой темы не нашел, наверное неудачно название дали!!! В принципе так и думал делать это!! Я так вижу это ты там и отвечал, не мог бы ответить еще на один вопросик, почему ты выбрал для хранения объектов для рисования именно ArrayList?
PM MAIL   Вверх
pathfinder
Дата 10.5.2010, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 120
Регистрация: 3.3.2010

Репутация: 7
Всего: 10



Хранить объекты для рисования можно как угодно(хоть в связном списке). Пример что я написал очень простой. В реальности желательно использовать такую структуру данных, которая позволяла бы выбирать только те фигуры, что попадают в текущий прямоугольник отсечения(часть компонента, которую нужно прорисовать).
PM MAIL   Вверх
irdis13
Дата 10.5.2010, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 10.5.2010

Репутация: нет
Всего: нет



После прочтения нескольких тем разных форумов понял, что мне нужно лучше всего рисовать в BufferedImage, а потом просто прорисовывать его в моей панели (так мне показалось наиболее удобно и целесообразно)!! Но вот проблема, оно не рисуется почему-то код ниже:
Код

public class ResultPanel extends javax.swing.JPanel {
    int x1 = 10;
    int x2 = 20;
    int y1 = 30;
    int y2 = 40;
    BufferedImage img = null;
    
    /** Creates new form ResultPanel */
    public ResultPanel() {
        initComponents();
        img = (BufferedImage)this.createImage(this.getHeight(), this.getWidth());
    }
    
    @Override
    public void paintComponent(Graphics g) {
        g.drawImage(img, 0, 0, this);
    }

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        Graphics gr = img.getGraphics();
        gr.drawLine(x1, y1, x2, y2);
        x1 += 10;
        y1 += 10;
        x2 += 10;
        y2 += 10;
        repaint();
    }
}


Там при нажатии кнопки должна нарисоваться новая линия! Вылезают какие-то экзэпшены что не правильно?
PM MAIL   Вверх
LSD
Дата 11.5.2010, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 38
Всего: 538



Цитата(irdis13 @  10.5.2010,  19:15 Найти цитируемый пост)
Вылезают какие-то экзэпшены что не правильно? 

А что машает запостить сюда эти эксепшены?

Скорее всего дело в том, что компонент во время создания имеет нулевой размер, и значит img будет тоже размера 0. Правильно надо делать так: повесить слушателя на ресайз, и при ресайзе пересоздавать img, с новым размером.

Добавлено через 1 минуту и 35 секунд
И перед тем как смело выполнять drawLine(x1, y1, x2, y2) было бы неплохо проверить, что x1, y1, x2, y2 не превышают размеры панели.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
irdis13
Дата 12.5.2010, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 10.5.2010

Репутация: нет
Всего: нет



Спасибо за ответ!!! Немного помудрив пришёл к тому же ответу и нашел кое-какое решение!! Вот оно:
Код

public class ResultPanel extends javax.swing.JPanel {
    int x1 = 10;
    int x2 = 20;
    int y1 = 30;
    int y2 = 40;
    BufferedImage img = null;
    boolean f = false;
    Graphics gr = null;
    
    public ResultPanel() {
        initComponents();
    }
    
    @Override
    public void paintComponent(Graphics g) {
        g.drawImage(img, 0, 0, this);
    }

    public void init(){
        img = (BufferedImage)this.createImage(this.getWidth(), this.getHeight());
        gr = img.getGraphics();
    }

    public void drawLine(int x1, int y1, int x2, int y2){
        gr.drawLine(x1, y1, x2, y2);
        repaint();
    }
    
    public void drawOval(int x1, int y1, int radius){
        gr.fillOval(x1, y1, radius, radius);
        repaint();
    }
}


Теперь мне нужно после создания объекта вызывать метод init()! Понимаю, что через одно место, но придумать ничего другого не смог((
Не мог бы мне написать как поставить слушатель на ресайз??
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0852 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.