powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Простенькая программа рисования, как реализовать такую концепцию ?
25 сообщений из 54, страница 2 из 3
Простенькая программа рисования, как реализовать такую концепцию ?
    #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
25 сообщений из 54, страница 2 из 3
Форумы / Java [игнор отключен] [закрыт для гостей] / Простенькая программа рисования, как реализовать такую концепцию ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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