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


Автор: Yulia13666 8.5.2010, 11:18
Мне необходимо чтобы от фигуры квадрат наследовался перечеркнутый квадрат. Я так понимаю мне надо сначала создать абстрактный класс с методом для прорисовки, а в производных классах уже реализовать этот метод. Но я не знаю как передать в этот метод параметр Graphics g, который необходимый для рисования. Помогите пожалуйста! 
      

Автор: Nofate 8.5.2010, 13:32
Код

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

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


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

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

 StrokedSquare SS=new StrokedSquare();
 SS.draw(???)

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

Автор: Yulia13666 9.5.2010, 11:00
/*
 * 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) чтобы заработало?

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

Код

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>();
    }
}

Автор: Yulia13666 9.5.2010, 12:28
Спасибо, конечно pathfinder, но я только начала изучать Java, и этот код немного сложноват и не понятен. Мне бы как-то модифицировать код, который написан в предидущем сообщении.

Автор: pathfinder 9.5.2010, 12:48
В честь Дня Великой Победы минут через десять выложу полный, со всеми комментариями, готовый к работе пример

Автор: Yulia13666 9.5.2010, 13:12
Спасибо большое!! буду ждать!!!

Автор: pathfinder 9.5.2010, 13:32
Проект для NetBeans 6.8. Посмотреть пример можно запустив /dist/JGraphic.jar

http://narod.ru/disk/20548482000/JGraphic.zip.html

Если будут вопросы - помечай коментариями те места что не понятны и выкладывай код(тока заварчивай код в тэги)

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

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);
            }
        });



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

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

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

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

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

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

Т.е. вся работа по отрисовке идет в методе paintComponent(Graphics g).

Автор: Yulia13666 9.5.2010, 14:35
Спасибо большое за помощь, pathfinder!!!

Автор: pathfinder 9.5.2010, 15:52
Ю а, как говорится, вэлкам )

Автор: irdis13 10.5.2010, 16:53
А что значит в методе public void add(Square ... squareList) "..." я просто начинающий, пишу только пол года, но такого не встречал

Автор: pathfinder 10.5.2010, 17:12
"..." - означает что можно подставить от 0 и больше аргументов(в данном случае Square).

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