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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Наследование графических объектов 
V
    Опции темы
Yulia13666
Дата 8.5.2010, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Мне необходимо чтобы от фигуры квадрат наследовался перечеркнутый квадрат. Я так понимаю мне надо сначала создать абстрактный класс с методом для прорисовки, а в производных классах уже реализовать этот метод. Но я не знаю как передать в этот метод параметр Graphics g, который необходимый для рисования. Помогите пожалуйста! 
      
PM MAIL   Вверх
Nofate
Дата 8.5.2010, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

public class Square {
  public void draw(Graphics g) { ... }
}

public class StrokedSquare extends Square {
  public void draw(Graphics g) { ... }
}


В чем вопрос? ))


--------------------
The future is not set, there is no fate but what we make for ourselves.
Нофейтово пространство и смежные области 
PM MAIL WWW ICQ   Вверх
Yulia13666
Дата 8.5.2010, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вопрос в том, ЧТО потом после создания экземпляра класса и вызова метода записать для параметра g??

 StrokedSquare SS=new StrokedSquare();
 SS.draw(???)
PM MAIL   Вверх
Nofate
Дата 8.5.2010, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Раз вы рисуете квадраты значит есть Graphics, на который они рисуются.
Например окно, унаследованное от JFrame, переопределяющее метод update(Graphics g). Вот этот g и передавайте

Это сообщение отредактировал(а) Nofate - 8.5.2010, 22:05


--------------------
The future is not set, there is no fate but what we make for ourselves.
Нофейтово пространство и смежные области 
PM MAIL WWW ICQ   Вверх
Yulia13666
Дата 9.5.2010, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package javaapplication5;
import java.awt.*;
import javax.swing.*;

class Square {
  public void draw(Graphics g) { ... }
}

 class StrokedSquare extends Square {
  public void draw(Graphics g) { ... }
}


public class Main {
    public static void main(String[] args) {
  JFrame jf = new JFrame("Пример "){};

   jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   jf.setSize(300 , 300);
    jf.setVisible(true);
  StrokedSquare f =new StrokedSquare();
   f.draw(g);

}
}

Nofate, помогите, куда здесь надо дописать update(Graphics g) чтобы заработало?

PM MAIL   Вверх
pathfinder
Дата 9.5.2010, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код писал с руки, поэтому косяки в написании методов/констант исправить вручную.

Код

public class JGraphicFrame extends JFrame {
    
    public JGraphicFrame() {
        super("GraphicFrame");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        JGraphicPanel gpanel = new JGraphicPanel();
        gpanel.add(/* todo добавить квадраты */);
        
        getContentPane().add(gpanel);
        
        setLocationRelativeTo(null);
    }
    
    public static class JGraphicPanel extends JPanel {
        
        public void add(Square ... squareList) {
            for (Square sq : squareList) {
                if (sq != null) {
                    list.add(sq);
                }
            }
            recalcPrefferedSize();
            repaint();
        }
        
        public void add(Square square) {
            if (square != null) {
                list.add(square);
            }
            recalcPrefferedSize();
            repaint();
        }
        
        protected void recalcPrefferedSize() {
            int width;
            int height;
            
            for (Square sq : list) {
                // todo width = max(положение_по_горизонтали + ширина)
                // todo height = max(положение_по_вертикали + высота)
            }
            
            setPrefferedSize(new Dimension(width, height));
        }
        
        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            
            for (Square sq : list) {
                sq.draw(g);
            }
        }
        
        /* DATA */
        ArrayList<Square> list = new ArrayList<Square>();
    }
}

PM MAIL   Вверх
Yulia13666
Дата 9.5.2010, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо, конечно pathfinder, но я только начала изучать Java, и этот код немного сложноват и не понятен. Мне бы как-то модифицировать код, который написан в предидущем сообщении.
PM MAIL   Вверх
pathfinder
Дата 9.5.2010, 12:48 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



В честь Дня Великой Победы минут через десять выложу полный, со всеми комментариями, готовый к работе пример
PM MAIL   Вверх
Yulia13666
Дата 9.5.2010, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо большое!! буду ждать!!!
PM MAIL   Вверх
pathfinder
Дата 9.5.2010, 13:32 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Проект для NetBeans 6.8. Посмотреть пример можно запустив /dist/JGraphic.jar

Проект

Если будут вопросы - помечай коментариями те места что не понятны и выкладывай код(тока заварчивай код в тэги)
PM MAIL   Вверх
Yulia13666
Дата 9.5.2010, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо большое за программу, очень выручил!!!
Я поняла все кроме вот этого. Напиши вообщем что этот код делает!
Код

public class JGraphicPanel extends JPanel {

    public void add(Square ... squareList) {
        if (squareList == null || squareList.length == 0) {
            return;
        }
        for (Square square : squareList) {
            if (square != null) {
                list.add(square);
            }
        }

        recalcPrefferedSize();
        repaint(); // принудительно перерисовываем компонент
    }
    
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        
        for (Square square : list) {
            square.draw(g);
        }
    }
    
    protected void recalcPrefferedSize() {
        int width = 0;
        int height = 0;

        for (Square square : list) {
            if (width < square.getPosition().x + square.getSize().width) {
                width = square.getPosition().x + square.getSize().width;
            }
            if (height < square.getPosition().y + square.getSize().height) {
                height = square.getPosition().y + square.getSize().height;
            }
        }

        width += 1;
        height += 1;

        setPreferredSize(new Dimension(width, height));
    }

    /* DATA */
    ArrayList<Square> list = new ArrayList<Square>();

}



Добавлено через 14 минут и 9 секунд
И еще несколько строк
Код


 getContentPane().add(gpanel);
        
  pack();

setLocationRelativeTo(null);

   SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new JGraphicFrame().setVisible(true);
            }
        });



PM MAIL   Вверх
pathfinder
Дата 9.5.2010, 14:30 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Рисовать можно только на графических компонентах. То на том, в чем встроена возможность рисовать на экране.

Поэтому в твоем случае можно было пойти двумя путями:
1) Square сделать потомком JComponent.
2) Дать возможность Square отрисовывать себя на другом компоненте.

1 подход дорогостоящий. 

Поэтому я использовал 2.

Что-бы вмешаться в процедуру отрисовки графического компонент необходимо переопределить метод paintComponent(Graphics g). Он вызывается всякий раз когда операционная система решит что необходимо перерисовать часть экрана(на которой расположен на компонент(хотя для Swing все чуть-чуть иначе). Метод repaint() позволяет нам самим сделать запрос на перерисовку компонента, которым мы и пользуемся после добавления новых Square(нам же надо их отрисовать, если не вызвать repaint они отрисуются только если мы растянем окно).

Вот собственно и все: в качестве графического компонента, на котором мы будем рисовать, берем JPanel(хотя можно взять любой другой), Square которые мы хотим отрисовать естественно необходимо где-то хранить(по-этому сохраняем их в ArrayList - динамический массив). 

Т.е. вся работа по отрисовке идет в методе paintComponent(Graphics g).
PM MAIL   Вверх
Yulia13666
  Дата 9.5.2010, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо большое за помощь, pathfinder!!!
PM MAIL   Вверх
pathfinder
Дата 9.5.2010, 15:52 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ю а, как говорится, вэлкам )
PM MAIL   Вверх
irdis13
Дата 10.5.2010, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А что значит в методе public void add(Square ... squareList) "..." я просто начинающий, пишу только пол года, но такого не встречал
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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