Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Простенькая программа рисования, как реализовать такую концепцию ? / 25 сообщений из 54, страница 1 из 3
20.12.2016, 11:12
    #39370810
I dont know
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простенькая программа рисования, как реализовать такую концепцию ?
Доброго времени суток. Застопорился на таком вопросе, небольшая программа рисования, хочу реализовать "концепцию" когда на экране отображается как бы документ. Т.е некоторый белый прямоугольник с тенью, как например в офисных пакетах(помните раньше в программах некоторых было, или скажем когда режим предпросмотра печати включаешь).
Я себе представляю это как, "белый прямоугольник" это у нас JPanel, от неё можно унаследовать свой класс, залить её белым цветом и рисовать на ней(отслеживать координаты мыши и т.д) а как сделать например тень под ней, или серую область вокруг? Далее, если мы делаем зум, то надо оставить некоторый зазор между краем белой области и краем экрана, и скролы включать только если границы окна "наезжают" на белую область, как этого добиться? Может есть примеры? Поделитесь пожалуйста :)
...
Рейтинг: 0 / 0
20.12.2016, 11:21
    #39370824
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простенькая программа рисования, как реализовать такую концепцию ?
Почему бы не взять JavaFX где уже куча свистелок в виде CSS имеется?
http://docs.oracle.com/javafx/2/get_started/css.htm

I dont knowЯ себе представляю это как, "белый прямоугольник" это у нас JPanel

JPanel это контейнер для других контролов. С тем же успехом можно взять JComponent, например.

I dont know, от неё можно унаследовать свой класс, залить её белым цветом и рисовать на ней(отслеживать координаты мыши и т.д) а как сделать например тень под ней, или серую область вокруг?

Border с кастомной отрисовкой.
https://docs.oracle.com/javase/tutorial/uiswing/components/border.html#custom

I dont knowДалее, если мы делаем зум, то надо оставить некоторый зазор между краем белой области и краем экрана, и скролы включать только если границы окна "наезжают" на белую область, как этого добиться? Может есть примеры? Поделитесь пожалуйста :)
http://docs.oracle.com/javase/tutorial/uiswing/components/scrollpane.html

I dont knowМожет есть примеры? Поделитесь пожалуйста :)
Java SE Development Kit 8u111 Demos and Samples Downloads
...
Рейтинг: 0 / 0
20.12.2016, 11:30
    #39370842
I dont know
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простенькая программа рисования, как реализовать такую концепцию ?
Blazkowicz,

Спасибо, а есть разница в скорости отрисовки графики, если использовать JPanel или JComponent?
...
Рейтинг: 0 / 0
20.12.2016, 11:32
    #39370847
I dont know
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простенькая программа рисования, как реализовать такую концепцию ?
P.S. C JavaFX дел никогда не имел, думается мне, что там это сделать сложнее будет + много сначала нужно изучить, прежде чем на ней кодить. Swing проще, имхо )
...
Рейтинг: 0 / 0
20.12.2016, 11:38
    #39370855
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простенькая программа рисования, как реализовать такую концепцию ?
I dont knowP.S. C JavaFX дел никогда не имел, думается мне, что там это сделать сложнее будет + много сначала нужно изучить, прежде чем на ней кодить. Swing проще, имхо )
ошибаетесь. Потом пожалеете.
...
Рейтинг: 0 / 0
20.12.2016, 11:44
    #39370858
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простенькая программа рисования, как реализовать такую концепцию ?
I dont knowСпасибо, а есть разница в скорости отрисовки графики, если использовать JPanel или JComponent?
Нет. Если хотите с какой-то непонятной целью освоить Swing, то очень рекомендую научиться смотреть в исходники. Там много такого что из документации выудить не так просто. В часности можно посмотреть на JPanel и понять что толку от этого класса для вашей задачи нет.
...
Рейтинг: 0 / 0
20.12.2016, 11:54
    #39370863
I dont know
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простенькая программа рисования, как реализовать такую концепцию ?
Blazkowicz,

Почему? в данном случае же это просто холст. Я тогда возьму вместо него JComponent. )
...
Рейтинг: 0 / 0
20.12.2016, 12:09
    #39370878
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простенькая программа рисования, как реализовать такую концепцию ?
I dont know,
сейчас вы как рисуете? Лупа есть? Если есть, то вам проще всё с нуля.
Т.е. считаете что страничка это тоже A4. Сначала заливка серым, потом отрисовка рамки и потом белым+рисунки.
...
Рейтинг: 0 / 0
20.12.2016, 12:10
    #39370880
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простенькая программа рисования, как реализовать такую концепцию ?
I dont know,
если у вас векторные рисунки на основе объектов платформы, тогда и панель-подложка повыше в иерархии классов.
imho
...
Рейтинг: 0 / 0
20.12.2016, 12:14
    #39370886
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простенькая программа рисования, как реализовать такую концепцию ?
I dont knowP.S. C JavaFX дел никогда не имел, думается мне, что там это сделать сложнее будет + много сначала нужно изучить, прежде чем на ней кодить. Swing проще, имхо )
На Swing всё намного сложнее. Любые украшения - рисовать самому в 2D. Анимация - самому. Анонимые классы вместо биндинга - куча синтаксического шума. Ну, и рисовать в 2D, правильно учитывая размеры шрифтов и DPI вы не сможете. В векторе с этим проще.
...
Рейтинг: 0 / 0
20.12.2016, 13:10
    #39370961
I dont know
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простенькая программа рисования, как реализовать такую концепцию ?
Petro123,

Сейчас просто панель растягиваю на всё окно и в ней рисую. Колёсиком мыши зуммирую, путём изменения размера панели(размер панели на коэффициент зума). В зуме еще одна загвоздка, например если мы рисуем сетку, то размер её линий не должен зависеть от зума, а в остальном, просто вызываю метод scale у Grapchics2D.
...
Рейтинг: 0 / 0
20.12.2016, 13:20
    #39370973
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простенькая программа рисования, как реализовать такую концепцию ?
I dont knowесли мы рисуем сетку, то размер её линий не должен зависеть от зума
рисовать отдельно с шагом по настройкам от юзверя.
I dont knowа в остальном, просто вызываю метод scale у Grapchics2D.
тогда линии (толщина) становятся масштабируемыми и некрасивыми. Так?
Вообще, скриншот бы пригодился.
...
Рейтинг: 0 / 0
20.12.2016, 13:29
    #39370988
Нахлобуч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простенькая программа рисования, как реализовать такую концепцию ?
I dont know...залить её белым цветом и рисовать на ней(отслеживать координаты мыши и т.д)...
А, допустим, сохранять данные вы как планируете?
...
Рейтинг: 0 / 0
20.12.2016, 13:43
    #39371007
I dont know
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простенькая программа рисования, как реализовать такую концепцию ?
Petro123,

Пока у меня так(скриншот).

Код пока прост:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
//В классе фрейма
DrawArea da = new DrawArea();
da.setDrawableContent(doc);  
// doc в данном случае "класс-контейнер", содержит отображаемые данные, а так же данные о размере холста 
// это мой способ передать в панель то что на ней надо нарисовать 
        
JScrollPane scrollPane = new JScrollPane(da);
...



Далее класс самой панели рисования(в дальнейшем унаследую её от JComponent а не от JPanel)

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
public class DrawArea extends JPanel implements MouseListener, 
                                                MouseMotionListener, 
                                                MouseWheelListener  {


@Override
    public Dimension getPreferredSize() {
        return new Dimension(operateAreaSize);
    }


// само рисование на панели, пока упрощённо, закливаем панель белым и рисуем рамку

@Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g); 
        Graphics2D g2d = (Graphics2D) g;
        
        setBackground(new Color(225, 225, 225));
        
        g2d.translate(drawOrigin, drawOrigin);
        // если здесь производить масшабирование путём вызова g2d.scale() то будет улощаться так же и рамка вокруг области рисования, что не нужно     
   
        // if draw shadow
        Dimension d = drawable.getSize();
        g2d.setColor(Color.WHITE);
        g2d.fillRect(0, 0, (int)Math.round(d.width*scaleFactor), (int)Math.round(d.height*scaleFactor));

        g2d.setColor(Color.DARK_GRAY);
        g2d.drawRect(0, 0, (int)Math.round(d.width*scaleFactor), (int)Math.round(d.height*scaleFactor));

     ...
}



Вот так я меняю scaleFactor и размеры панели

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
@Override
    public void mouseWheelMoved(MouseWheelEvent mwe) {
        if(!isViewMode) {
            /* минус для изменения направления движения колесика при масштабировании, так удобнее */
            scaleFactor += -(0.1 * mwe.getWheelRotation());
            scaleFactor = Math.max(0.1, scaleFactor);
            scaleFactor = Math.min(scaleFactor, 20);
            
            /* пересчитываем размер области рисования */
            operateAreaSize.setSize((int)(aSize.width * scaleFactor), 
                                    (int)(aSize.height * scaleFactor));
            
            /* пересчитываем размер сетки */
            operateGridSize = (int)Math.round(aGridSize * scaleFactor);
            
            
           
            //at.translate(mwe.getX(), mwe.getY());
            //at.scale(scaleFactor, scaleFactor);
            //at.translate(-mwe.getX(), -mwe.getY());
            
            revalidate();
            repaint();
        }
    }
...
Рейтинг: 0 / 0
20.12.2016, 13:49
    #39371013
I dont know
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простенькая программа рисования, как реализовать такую концепцию ?
Нахлобуч,
Сохранить данные можно просто записав нужные значения в файл, в данном случае для примера не принципиально. А так скорее всего xml в который буду писать то что мне нужно. Предполагаю создать класс, скажем Document, у него определить список примитивов(линий, кружков и т.д, всего что нарисовали и натыкали мышкой на экране) и функцию, скажем saveData(fileName) которая будет пробегать по этому списку и записывать его содержимое в файл.
...
Рейтинг: 0 / 0
20.12.2016, 14:00
    #39371019
I dont know
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простенькая программа рисования, как реализовать такую концепцию ?
Делал ещё концептуальные изыски, типа абстрактный класс "Документ", который сам знает что рисовать и отрисовывает своё содержимое, достаточно подсунуть его в панель для рисования, в методе paintComponent() которой вызвать метод рисования документа, но получилось какая-то лабуда :(

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
public class TR_Document extends TR_AbstractDrawable {
    
    
    /** Ориентация листа 
     *  PARTRAIT - книжная
     *  LANDSCAPE - альбомная
     */
    public enum DocumentOrientation { PARTRAIT, LANDSCAPE };
    
    private int aDPI = 72;
    private DocumentOrientation orientation = DocumentOrientation.LANDSCAPE;
    // мои попытки привязаться к реальным размерам
    private Dimension size = TR_Utils.mmsToPixels(TR_Utils.A4_PAGE_SIZE_MM, aDPI);
    
    private AffineTransform at = new AffineTransform();
    
    public TR_Document() {
       
    }
    
    
    public TR_Document(Dimension aSize, DocumentOrientation orient) {
        orientation = orient;
        /* если альбомная ориентация листа, то повернём лист(поменяем размеры местами) */
        if(orient == DocumentOrientation.LANDSCAPE) {
            size.width = aSize.height;
            size.height = aSize.width;
        } else
            size = aSize;
    }
    
    public void loadfromFile(String fileName) {}
    
    public void setSize(Dimension s) {
        size.setSize(s);
    }

    @Override
    public Dimension getSize() {
        return new Dimension(size);
    }

    @Override
    public Rectangle getContentBBox() {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
    
    public void setOrientation(DocumentOrientation orient) {
        orientation = orient;
        if(orient == DocumentOrientation.LANDSCAPE) {
            int tmp = size.width;
            size.width = size.height;
            size.height = tmp;
        } 
    }
    

    @Override
    public void draw(Graphics g, double scaleFactor) {
        /*
        Graphics2D g2d = (Graphics2D)g;
        
        AffineTransform old = g2d.getTransform();
        AffineTransform at = new AffineTransform();
        
        g2d.setTransform(at);
        at.translate(50, 50);  // зазор между краем окна и нашей панелью для рисования
        at.scale(scaleFactor, scaleFactor);
        //g2d.scale(scaleFactor, scaleFactor);
        //size.setSize((int)Math.round(size.width * scaleFactor), 
        //             (int)Math.round(size.height * scaleFactor));
        g2d.setColor(Color.WHITE);
        g2d.fillRect(0, 0, size.width, size.height);
        
        g2d.setColor(Color.BLACK);
        g2d.drawRect(0, 0, size.width, size.height);
        
        
        //g2d.setColor(Color.GRAY);
        //g2d.drawRect(0, 0, size.width, size.height);
        
        g2d.setTransform(old);
        g2d.dispose();
        */
    }


...
Рейтинг: 0 / 0
20.12.2016, 14:07
    #39371027
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простенькая программа рисования, как реализовать такую концепцию ?
I dont knowДелал ещё концептуальные изыски, типа абстрактный класс "Документ", который сам знает что рисовать и отрисовывает своё содержимое, достаточно подсунуть его в панель для рисования, в методе paintComponent() которой вызвать метод рисования документа, но получилось какая-то лабуда :(
Для подобных изысков, хорошо бы разобраться в истории вопроса: MVC, MVP, MVVM. Тогда, возможно, вместо лабуды получилось бы что-то путное.
Можно было бы хотя бы следовать подходу Swing - Model, Component, UI. UI, правда в Swing не шибко предназначен для расширения.
...
Рейтинг: 0 / 0
20.12.2016, 14:20
    #39371042
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простенькая программа рисования, как реализовать такую концепцию ?
I dont knowПока у меня так(скриншот).
дак у вас ничего нет. Вы же писали что рисунок масштабируете. Где он?
Стратап? Только начали?
...
Рейтинг: 0 / 0
20.12.2016, 14:21
    #39371043
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простенькая программа рисования, как реализовать такую концепцию ?
Petro123Стратап?
Стартап?
...
Рейтинг: 0 / 0
20.12.2016, 14:29
    #39371051
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простенькая программа рисования, как реализовать такую концепцию ?
I dont knowкоторой вызвать метод рисования документа,
для графического редактора делают векторный движок.
Для текстового редактра делают текстовый редактор с подсветкой и т.д.
А потом уже обрамление в виде документа.
IMHO
Начните не с рамки документа, а с движка сердцевины-ядра. Если у вас стартап.
Удачи!
...
Рейтинг: 0 / 0
20.12.2016, 15:14
    #39371103
Нахлобуч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простенькая программа рисования, как реализовать такую концепцию ?
I dont knowПредполагаю создать класс, скажем Document...
Вот это правильное направление. Тут уже упомянули MVC, MVVM и прочее -- послушайте совет, почитайте, что это за звери.

И сразу: документ не должен знать, как себя рисовать.
...
Рейтинг: 0 / 0
20.12.2016, 18:01
    #39371269
I dont know
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простенькая программа рисования, как реализовать такую концепцию ?
Petro123,

Ну дык в paintComponent() и рисую, то что я в этом методе навставляю вызовов g2d.draw* сути не изменит, потому что не понимаю саму суть, как правильно представить этот вид, как он должен быть устроен, на чём основан, как правильно его смасштабировать.
Если я вначале этого метода поставлю например g2d.scale(), все что я нарисовал смасштабируется, но я не знаю, правильно ли это, и как при таком подходе добиться, чтобы масштабировалось только то что мне надо, оставив несмасштабированным например линии сетки.

По поводу документа, лабуда получается именно в части отображения, ввиду того что указал выше. Хранение данных сложностей не вызывает, их загрузка/сохранение в принципе тоже. Вот так вот у меня (
...
Рейтинг: 0 / 0
20.12.2016, 18:25
    #39371291
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простенькая программа рисования, как реализовать такую концепцию ?
I dont knowчтобы масштабировалось только то что мне надо, оставив несмасштабированным например линии сетки.
чтобы тОлщины линий не масштабировались (нулевая толщина) - рисовать надо уже в масштабе LineTo, LineTo()
Т.е. класс Объект Сетка и рисуй на канве. В чём проблема?
Проблема в масштабировании остального. Но ты не показал ничего.
Покажи хотя бы 1 элемент отрисовки.
...
Рейтинг: 0 / 0
20.12.2016, 18:26
    #39371293
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простенькая программа рисования, как реализовать такую концепцию ?
I dont knowкак правильно его смасштабировать.
у меня в проекте бы объект-класс Координаты. Который преобразовывал глобальные в локальные канвы и отрисовка.
...
Рейтинг: 0 / 0
20.12.2016, 18:41
    #39371306
I dont know
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простенькая программа рисования, как реализовать такую концепцию ?
Petro123чтобы тОлщины линий не масштабировались (нулевая толщина) - рисовать надо уже в масштабе LineTo, LineTo()
Т.е. класс Объект Сетка и рисуй на канве. В чём проблема?
Тут не понял, можно подробнее или пример?

Завтра доберусь до проекта(на работе), попробую нарисовать что-нибудь... линии какие-нибудь...
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Простенькая программа рисования, как реализовать такую концепцию ? / 25 сообщений из 54, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]