powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Простенькая программа рисования, как реализовать такую концепцию ?
54 сообщений из 54, показаны все 3 страниц
Простенькая программа рисования, как реализовать такую концепцию ?
    #39370810
I dont know
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток. Застопорился на таком вопросе, небольшая программа рисования, хочу реализовать "концепцию" когда на экране отображается как бы документ. Т.е некоторый белый прямоугольник с тенью, как например в офисных пакетах(помните раньше в программах некоторых было, или скажем когда режим предпросмотра печати включаешь).
Я себе представляю это как, "белый прямоугольник" это у нас JPanel, от неё можно унаследовать свой класс, залить её белым цветом и рисовать на ней(отслеживать координаты мыши и т.д) а как сделать например тень под ней, или серую область вокруг? Далее, если мы делаем зум, то надо оставить некоторый зазор между краем белой области и краем экрана, и скролы включать только если границы окна "наезжают" на белую область, как этого добиться? Может есть примеры? Поделитесь пожалуйста :)
...
Рейтинг: 0 / 0
Простенькая программа рисования, как реализовать такую концепцию ?
    #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
Простенькая программа рисования, как реализовать такую концепцию ?
    #39370842
I dont know
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

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

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

Сейчас просто панель растягиваю на всё окно и в ней рисую. Колёсиком мыши зуммирую, путём изменения размера панели(размер панели на коэффициент зума). В зуме еще одна загвоздка, например если мы рисуем сетку, то размер её линий не должен зависеть от зума, а в остальном, просто вызываю метод scale у Grapchics2D.
...
Рейтинг: 0 / 0
Простенькая программа рисования, как реализовать такую концепцию ?
    #39370973
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
I dont knowесли мы рисуем сетку, то размер её линий не должен зависеть от зума
рисовать отдельно с шагом по настройкам от юзверя.
I dont knowа в остальном, просто вызываю метод scale у Grapchics2D.
тогда линии (толщина) становятся масштабируемыми и некрасивыми. Так?
Вообще, скриншот бы пригодился.
...
Рейтинг: 0 / 0
Простенькая программа рисования, как реализовать такую концепцию ?
    #39370988
Фотография Нахлобуч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
I dont know...залить её белым цветом и рисовать на ней(отслеживать координаты мыши и т.д)...
А, допустим, сохранять данные вы как планируете?
...
Рейтинг: 0 / 0
Простенькая программа рисования, как реализовать такую концепцию ?
    #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
Простенькая программа рисования, как реализовать такую концепцию ?
    #39371013
I dont know
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нахлобуч,
Сохранить данные можно просто записав нужные значения в файл, в данном случае для примера не принципиально. А так скорее всего xml в который буду писать то что мне нужно. Предполагаю создать класс, скажем Document, у него определить список примитивов(линий, кружков и т.д, всего что нарисовали и натыкали мышкой на экране) и функцию, скажем saveData(fileName) которая будет пробегать по этому списку и записывать его содержимое в файл.
...
Рейтинг: 0 / 0
Простенькая программа рисования, как реализовать такую концепцию ?
    #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
Простенькая программа рисования, как реализовать такую концепцию ?
    #39371027
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
I dont knowДелал ещё концептуальные изыски, типа абстрактный класс "Документ", который сам знает что рисовать и отрисовывает своё содержимое, достаточно подсунуть его в панель для рисования, в методе paintComponent() которой вызвать метод рисования документа, но получилось какая-то лабуда :(
Для подобных изысков, хорошо бы разобраться в истории вопроса: MVC, MVP, MVVM. Тогда, возможно, вместо лабуды получилось бы что-то путное.
Можно было бы хотя бы следовать подходу Swing - Model, Component, UI. UI, правда в Swing не шибко предназначен для расширения.
...
Рейтинг: 0 / 0
Простенькая программа рисования, как реализовать такую концепцию ?
    #39371042
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
I dont knowПока у меня так(скриншот).
дак у вас ничего нет. Вы же писали что рисунок масштабируете. Где он?
Стратап? Только начали?
...
Рейтинг: 0 / 0
Простенькая программа рисования, как реализовать такую концепцию ?
    #39371043
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123Стратап?
Стартап?
...
Рейтинг: 0 / 0
Простенькая программа рисования, как реализовать такую концепцию ?
    #39371051
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
I dont knowкоторой вызвать метод рисования документа,
для графического редактора делают векторный движок.
Для текстового редактра делают текстовый редактор с подсветкой и т.д.
А потом уже обрамление в виде документа.
IMHO
Начните не с рамки документа, а с движка сердцевины-ядра. Если у вас стартап.
Удачи!
...
Рейтинг: 0 / 0
Простенькая программа рисования, как реализовать такую концепцию ?
    #39371103
Фотография Нахлобуч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
I dont knowПредполагаю создать класс, скажем Document...
Вот это правильное направление. Тут уже упомянули MVC, MVVM и прочее -- послушайте совет, почитайте, что это за звери.

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

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

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

Завтра доберусь до проекта(на работе), попробую нарисовать что-нибудь... линии какие-нибудь...
...
Рейтинг: 0 / 0
Простенькая программа рисования, как реализовать такую концепцию ?
    #39371320
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
I dont know,
завтра. Конец рабочего.
...
Рейтинг: 0 / 0
Простенькая программа рисования, как реализовать такую концепцию ?
    #39371698
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
I dont knowТут не понял, можно подробнее или пример?
что именно не понял?
.....
- нужны 2 массива-коллекции с объектами 1)Сцена 2) Отрисовка
- базовый класс у всех имеет метод .Draw(куда рисовать). Т.е. полиморфизм
- сначала вызвать массив сцены, а потом массив Отрисовка
- при выводе координаты пересчитывать из глобальных в локальные канвы.
...
Рейтинг: 0 / 0
Простенькая программа рисования, как реализовать такую концепцию ?
    #39371711
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
4.
Class Координаты{
инициализация(2 прямоугольника в локальных и глобальных для "Вписать")
getЛокальные(глобX, глобY);
}


- когда рисуем
Код: java
1.
2.
3.
4.
for Коллекция{
  локКоорд = Class Координаты.getЛокальные(obj);
  obj.Draw(локКоорд);
}


В первой коллекции писал выше, рисуется лист A4 заливками сереньким.
...
Рейтинг: 0 / 0
Простенькая программа рисования, как реализовать такую концепцию ?
    #39371900
I dont know
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,

Пока пытаюсь сделать сам холст с тенью под ним, никак не удаётся добиться того, чтобы добавляемая JScrollPane панель(мой холст) не растягивалась на всё окно, какие размеры не задам(setSize), всё равно на весь холст, хотя казалось бы всё просто :(

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
private static void createAndShowGUI() {
JPanel p = new JPanel();
//p.setPreferredSize(new Dimension(420,280));
p.setBackground(Color.yellow);
JScrollPane scrollPane = new JScrollPane(p);
frame.getContentPane().add(scrollPane/*, BorderLayout.CENTER*/);
        
        frame.pack();
        frame.setSize(1000, 800);
        frame.setLocationRelativeTo(null); /* center frame on screen */
        frame.setVisible(true);
    }
...
Рейтинг: 0 / 0
Простенькая программа рисования, как реализовать такую концепцию ?
    #39371938
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
I dont know,
это не нужно.
Именно на весь холст панель и панель на всё окно.
Вы ведь увеличивать будете лупой и сдвиг руками.
В результате рисовать будете по краю холста.
...
Рейтинг: 0 / 0
Простенькая программа рисования, как реализовать такую концепцию ?
    #39372035
I dont know
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,

А как тогда обеспечить скроллбары при увеличении? Как-то вручную их создавать и устанавливать их параметры?
Сейчас я пытаюсь это делать просто путём изменения размеров вложенной в scrollPane панели, т.е когда кручу колёсиком мыши - меняю scale Factor, пересчитываю размер панели и задаю его, скролы сами меняются.
...
Рейтинг: 0 / 0
Простенькая программа рисования, как реализовать такую концепцию ?
    #39372082
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
I dont knowА как тогда обеспечить скроллбары при увеличении? Как-то вручную их создавать и устанавливать их параметры?
да. Мы вручную делали.
Это уже дело десятое. Т.к. лупа и рука будет.
Не надо украшательством заниматься. Позже скролл сделаешь.
...
Рейтинг: 0 / 0
Простенькая программа рисования, как реализовать такую концепцию ?
    #39372085
I dont know
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,

Понял, попробую накидать, потом по результатам отпишусь )
...
Рейтинг: 0 / 0
Простенькая программа рисования, как реализовать такую концепцию ?
    #39372087
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
I dont know,
OK
лупа и рука - это просто метод в Коорд{} который смещает внутреннее поле на дельту или внутренний коэффициент.
Потом сразу перерисовка.
Удачи!
...
Рейтинг: 0 / 0
Простенькая программа рисования, как реализовать такую концепцию ?
    #39372870
I dont know
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такой затык, как менять размер холста?

Класс фрейма:

Код: 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.
public class DrawEx {
    public static void createGUI() {
        JFrame.setDefaultLookAndFeelDecorated(true);
        JFrame frame = new JFrame("Draw Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        DrawArea da = new DrawArea();
        frame.getContentPane().add(da, BorderLayout.CENTER);

        frame.setPreferredSize(new Dimension(800, 600));

        frame.pack();
        frame.setVisible(true); 
        frame.setLocationRelativeTo(null);
     }
     
     public static void main(String[] args) {
          javax.swing.SwingUtilities.invokeLater(new Runnable() {
               public void run() {
                    createGUI();
               }
          });
     }
}


Сам класс панели(моего холста)
При рисовании надо как-то задавать длину и ширину холста. Для этого завёл две переменные W и H, пытаюсь им присвоить размеры в setPrefferedSize, но они пусты. Я так понимаю, что когда мой холст будет располагаться во фрейме(или я буду менять размер фрейма), эти размеры будут пересчитываться? Или надо изначально в функции createGUI() задавать размеры холста?


Код: 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.
public class DrawArea extends JComponent {
    
    private int originX = 0; 
    private int originY = 0;
    private int W = 0;
    private int H = 0;
    
    public DrawArea() {
        
    }
    
    
    public void paintComponent(Graphics g) {
        // устанавливаем цвет холста
        Graphics2D g2d = (Graphics2D)g;
        
        g2d.setColor(Color.WHITE);
        g2d.fillRect(0, 0, W, H);
        
        
        // рисуем что-нибудь
        g2d.setColor(Color.DARK_GRAY);
        g2d.drawLine(10, 10, 100, 100);
        
        g2d.drawRect(50, 50, 100, 80);
    }
    
  
    public Dimension getPrefferedSize() {
        //System.out.print("W: " + getWidth() + " H: " + getHeight() + "\n");
        return new Dimension(W, H);
    }
    
    public void setPrefferedSize(Dimension d) {
        super.setPreferredSize(d);
        W = d.width;
        H = d.height;
        System.out.print("W: " + W + " H: " + H);
    }
    
    
}

...
Рейтинг: 0 / 0
Простенькая программа рисования, как реализовать такую концепцию ?
    #39372889
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
I dont know
Код: java
1.
2.
3.
    // рисуем что-нибудь
        g2d.setColor(Color.DARK_GRAY);
        g2d.drawLine(10, 10, 100, 100);


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

Пока для простоты. В дальнейшем будет несколько классов(Line, Rect...), унаследованных от одного(скажем Primitive) и у каждого будет метод draw(Graphics g) и набор точек в относительных координатах(координаты относительно "центра" примитива, сам центр задаётся в момент клика мышки на канве, т.е куда кликнули там и центр и относительно этой точки рисуем).
...
Рейтинг: 0 / 0
Простенькая программа рисования, как реализовать такую концепцию ?
    #39372906
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
I dont knowИли надо изначально в функции createGUI() задавать размеры холста?
у JComponent есть ширина и высота в пикселях(локальных коорд)?

Код: java
1.
2.
3.
 public void paintComponent(Graphics g) {
   Graphics2D g2d = (Graphics2D)g;
   objDraw.draw(g2d);


тогда внутри objDraw.draw у g2d ты их и получишь.
...
Рейтинг: 0 / 0
Простенькая программа рисования, как реализовать такую концепцию ?
    #39372919
I dont know
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,

А как тогда холст подготовить? В paintComponent(Graphics g) залить цветом, рамку там нарисовать. Если брать getWidth() getHeight() то это всегда будут размеры текущего окна, как тогда потом использовать зум и сдвиг?
...
Рейтинг: 0 / 0
Простенькая программа рисования, как реализовать такую концепцию ?
    #39372920
I dont know
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чёт ваще запутался... кажется, вроде просто всё... а так туплю :(
...
Рейтинг: 0 / 0
Простенькая программа рисования, как реализовать такую концепцию ?
    #39372921
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
I dont knowнабор точек в относительных координатах(координаты относительно "центра" примитива, сам центр задаётся в момент клика мышки на канве, т.е куда кликнули там и центр и относительно этой точки рисуем).
не так.
- есть объекты в глобальных координатах.
Отрезок (5342.2,233.0)(5355.2,23.1)
В прямоугольных координатах Пулковских Московской области.
- ты вписал классом выше Коорд габарит всей сцены в ширину фрейма с маркером выраснивания.
- дальше автоматом пересчёт уже без тебя и отрисовка.
...
Рейтинг: 0 / 0
Простенькая программа рисования, как реализовать такую концепцию ?
    #39372923
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
I dont knowPetro123,

А как тогда холст подготовить? В paintComponent(Graphics g) залить цветом, рамку там нарисовать. Если брать getWidth() getHeight() то это всегда будут размеры текущего окна, как тогда потом использовать зум и сдвиг?
нарисуй отрезок с лупой и рукой.
А потом сделаем рамку. Как делает автокад. Там у рамки глобальные координаты как у самого чертежа.
Ждём с отрезком и лупой скрины.
Удачи!
...
Рейтинг: 0 / 0
Простенькая программа рисования, как реализовать такую концепцию ?
    #39372928
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
I dont knowкак тогда потом использовать сдвиг?
выше писал.
Код: java
1.
2.
objKoord.setMoveLokal(35, -44);
repaint;


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

Набросал зум с рукой

Код: 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.
public class DrawArea extends JComponent {
    private float zoom = 1.0f;
    int lastX = 0;
    int lastY = 0;
    
    int offsetX = 0;
    int offsetY = 0;
    
    public DrawArea() {
        
        addMouseWheelListener(new MouseAdapter() {
            @Override
            public void mouseWheelMoved(MouseWheelEvent e) {
                double delta = 0.075f * e.getPreciseWheelRotation();
                setZoom(getZoom() + (float)delta);
                repaint();
                System.out.print("wheel! Zoom: " + getZoom() + "\n");
            }
        });
        
        addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                if(SwingUtilities.isMiddleMouseButton(e)){
                    // capture starting point
                    lastX = e.getX();
                    lastY = e.getY();
                }
            }
        });
        
        addMouseMotionListener(new MouseMotionAdapter() {
            @Override
            public void mouseDragged(MouseEvent e) {
                if(SwingUtilities.isMiddleMouseButton(e)){
                    int dx = e.getX() - lastX;
                    int dy = e.getY() - lastY;
                    
                    offsetX = dx; 
                    offsetY = dy;
                    
                    repaint();
                }
            }
        });
    }
    
    public float getZoom() { return zoom; }
    
    public void setZoom(float value) {
        if(zoom != value) {
            zoom = value;
            
            if(zoom < 0.1) zoom = 0.1f;
            if(zoom > 10) zoom = 10f;
        }
    }
    
    
    @Override
    public void paintComponent(Graphics g) {
        // устанавливаем цвет холста
        Graphics2D g2d = (Graphics2D)g;
        AffineTransform at = new AffineTransform();
        
        at.translate(offsetX, offsetY);
        at.scale(zoom, zoom);
        g2d.setTransform(at);
        
        // рисуем что-нибудь
        g2d.setColor(Color.DARK_GRAY);
        // просто добавляем смещение, надо же как-то мышкой двигать, для примера
        g2d.drawLine(20, 20, 100, 100);
        g2d.drawRect(50, 50, 100, 80);
        
        g2d.dispose();
    }
}



Авось меня так за ручку и выведут к правильному решению, хоть пойму, как это делается ))
...
Рейтинг: 0 / 0
Простенькая программа рисования, как реализовать такую концепцию ?
    #39373620
I dont know
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, я так и не понял, что это за объект "Координаты", за что он отвечает и как должен работать. Что в данном случае есть глобальные и локальные координаты, вернее с глобальными всё понятно, а что есть локальные? Координаты элементов нарисованного объекта, относительно какой-либо его точки? Если так, зачем оно, если у нас всё в глобальных координатах будет?
...
Рейтинг: 0 / 0
Простенькая программа рисования, как реализовать такую концепцию ?
    #39373636
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
I dont knowНабросал зум с рукой
зум с лупой, это ВИ:
- открыл окно и по умолчанию там отрезок напр. от центра на 100 пикселей.
- нажал на кнопку Лупа и кликнул по отрезку
- он стал уже 200 пикселей.
Вот эти скрины и давай.
...
Рейтинг: 0 / 0
Простенькая программа рисования, как реализовать такую концепцию ?
    #39373671
I dont know
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,

Нужно именно кликнуть по отрезку? У меня зум колёсиком мышки сделан? первая - изначально, вторая - несколько раз крутанул колёсиком - увеличил. Линия от (0,0) до (100,100)
...
Рейтинг: 0 / 0
Простенькая программа рисования, как реализовать такую концепцию ?
    #39373693
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
I dont knowНужно именно кликнуть по отрезку?
ну, ты ни разу не видел лупу и руку?
Сомневаюсь.
Вот когда начнёшь делать и твой код с zoom = 0.1f станет расти в 300 строк в компоненте.
Тогда и поймёшт зачем класс координат.
Сейчас у тебя НИ ОДНОГО своего класса нет.
Если не считать наследника.
...
Рейтинг: 0 / 0
Простенькая программа рисования, как реализовать такую концепцию ?
    #39373697
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
I dont know,
просмотрел.
Линия должна быть при увеличении одной толщины.
Если по ТЗ - вектор.
...
Рейтинг: 0 / 0
Простенькая программа рисования, как реализовать такую концепцию ?
    #39373700
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
I dont know
Код: java
1.
2.
 g2d.drawLine(20, 20, 100, 100);
        g2d.drawRect(50, 50, 100, 80);


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

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

Это тестовый пример, я пытаюсь понять суть, как такое делается, пока я себе не могу это представить. Все ответы/примеры что я видел, всё какими-то кусками, урывками, цельной картины нет.

Сейчас у тебя НИ ОДНОГО своего класса нет.

Какой "свой" класс должен быть? И для чего? Класс какого-либо "примитива", который должен отображаться на экране? И нужен ли он на данном этапе? Для примера: создам я класс "Line", объявлю у него метод draw, далее создам этот объект, инициализирую, теми же координатами(0,0-100,100) а в paintComponent() вызову Line.draw(g), это что-то изменит? Или речь о каком-то другом "своем" классе?
...
Рейтинг: 0 / 0
Простенькая программа рисования, как реализовать такую концепцию ?
    #39373929
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
I dont know,
Тебе тяжело сделать кнопку Лупа?
Через пару шагов все поймешь.
...
Рейтинг: 0 / 0
Простенькая программа рисования, как реализовать такую концепцию ?
    #39373937
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
I dont know,
Я писал про толщину. Ты ноль реакции
...
Рейтинг: 0 / 0
54 сообщений из 54, показаны все 3 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Простенькая программа рисования, как реализовать такую концепцию ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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