powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / [Graphics2D] как организовать скролинг холста?
22 сообщений из 22, страница 1 из 1
[Graphics2D] как организовать скролинг холста?
    #39154086
I dont know
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приветствую, создал клас производный от JPanel, это типа холст и на нём рисую. Добавил масштабирование, при помощи AffineTransform, теперь интересует, как добавить скролинг, чтобы при увеличении масштаба, можно было скролбарами двигать картинку. Вижу несколько вариантов:
1. Поместить свой холст в JScrollPane и при изменении масштаба, изменять preferedSize у холста, тогда больше вроде как ничего делать не надо будет, скролбары будут сами менять размер и всё будет работать.
2. Добавить два отдельных скролбара и рулить ими самостоятельно.
3. Вроде как можно унаследоваться от Scrollable интерфейса и переопределить все необходимые методы самостоятельно.

Пункты 2 и 3 я себе представляю смутно(я бы даже сказал, очень смутно, от слова совсем). Подскажите как это делается, буду благодарен если подкинете пример)

Код класса:
Код: 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.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
public class DrawPanel extends JPanel  {

    private double gridSize;
    private boolean gridVisible;
    private boolean centerCrossVisible;
    private double zoom;
    private double zoomStep;
    private DPMouseListener dpMouseListener;

    public DrawPanel() {
        gridSize = 20;
        zoom = 1.0;
        zoomStep = 0.15;
        gridVisible = true;
        centerCrossVisible = true;

        dpMouseListener = new DPMouseListener();
        addMouseListener(dpMouseListener);
        addMouseMotionListener(dpMouseListener);
        addMouseWheelListener(dpMouseListener);
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D)g;

        prepareDrawArea(g2d);
        drawContent(g2d);
        drawCross(g2d);
        g2d.dispose();

    }

    private void prepareDrawArea(Graphics2D g2d) {

        RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING,
                                                RenderingHints.VALUE_ANTIALIAS_ON);

        rh.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
        g2d.setRenderingHints(rh);

        setBackground(Color.WHITE);

        // draw grid
        g2d.setColor(Color.DARK_GRAY);

        double w = getWidth();
        double h = getHeight();

        if(gridVisible) {
            for (int i = 0; i < w; i += gridSize*zoom) {
                for (int j = 0; j < h; j += gridSize*zoom) {
                    g2d.drawLine(i, j, i, j);
                }
            }
        }
    }

    private void drawContent(Graphics2D g2d) {
        AffineTransform old = g2d.getTransform();
        AffineTransform at = new AffineTransform();

        at.scale(zoom, zoom);
        g2d.setTransform(at);

        // DRAW HERE
        g2d.drawRect(10, 10, 100, 100);

        g2d.setTransform(old);

    }

    private void drawCross(Graphics2D g2d) {
        if(centerCrossVisible) {
            double w = getWidth();
            double h = getHeight();

            float[] dash = { 1f, 0f, 2f };

            BasicStroke bs = new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND, 1.0f, dash, 2f);
            g2d.setStroke(bs);

            g2d.setColor(Color.GRAY);
            g2d.drawLine((int) w / 2, 0, (int) w / 2, (int) h);
            g2d.drawLine(0, (int) h / 2, (int) w, (int) h / 2);
        }
    }



    public double getGridSize() { return gridSize; }
    public void setGridSize(double gs) { gridSize = gs; }

    public void setGridVisible(boolean visible) { gridVisible = visible; repaint(); }
    public void setCrossVisible(boolean visible) { centerCrossVisible = visible; repaint(); }

    public void setZoom(double z) {
        if(z > 0) {
            zoom = z;
            repaint();
        }
    }

    public void zoomIn() {
        zoom += zoomStep;
        repaint();
    }

    public void zoomOut() {
        double z = zoom - zoomStep;
        if(z > 0.3) {
            zoom = z;
            repaint();
        }
    }

    // Some service functions

    private Point2D getNearestGridPoint(Point currentPoint) {

        return null;
    }



    // ---------------- Mouse Listener --------------

    class DPMouseListener implements MouseListener, MouseMotionListener, MouseWheelListener {

        DPMouseListener() {}

        public void mouseClicked(MouseEvent e) {}
        public void mouseEntered(MouseEvent e) {}
        public void mouseExited(MouseEvent e) {}


        public void mousePressed(MouseEvent e) {

        }

        public void mouseReleased(MouseEvent e) {

        }

        public void mouseMoved(MouseEvent e) {

        }

        public void mouseDragged(MouseEvent e) {

        }

        public void mouseWheelMoved(MouseWheelEvent e) {
            int wheelRotation = e.getWheelRotation();

            if (wheelRotation > 0) {
                zoomIn();
            } else {
                zoomOut();
            }

        }
    }

}

...
Рейтинг: 0 / 0
[Graphics2D] как организовать скролинг холста?
    #39154236
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
I dont know,

А чем первый пункт не устраивает, что так остро захотелось второй и третий?
Вообще, по описанию, задача для JavaFX больше подходит. Он уже векторный.
...
Рейтинг: 0 / 0
[Graphics2D] как организовать скролинг холста?
    #39154345
I dont know
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

Т.е когда я скажем кручу колёсиком мыши, увеличивая масштаб, я должен увеличивать размер компонента, т.е. делать ему setSize(w*zoom, h*zoom), я вот и не знаю, по фен-шую ли это, стою на распутье? а то может это и не правильный способ и народ делает всё по другому, а у меня велосипед получится.
...
Рейтинг: 0 / 0
[Graphics2D] как организовать скролинг холста?
    #39154354
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
I dont knowи народ делает всё по другому, а у меня велосипед
все по разному. В автокаде есть Модель, в которой есть класс Рисовалка, Масштаб, Стили и т.д.
Рисуется всё без всяких компонентов.
Но ты делай по простому.
...
Рейтинг: 0 / 0
[Graphics2D] как организовать скролинг холста?
    #39154382
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
I dont knowТ.е когда я скажем кручу колёсиком мыши, увеличивая масштаб, я должен увеличивать размер компонента, т.е. делать ему setSize(w*zoom, h*zoom), я вот и не знаю, по фен-шую ли это, стою на распутье? а то может это и не правильный способ и народ делает всё по другому, а у меня велосипед получится.
setSize и setPreferredSize очень разные. Всё упирается в LayoutManager.
Для Java2D это по фен-шую. Там ничего такого нет.
Для JavaFX - не думаю. Дам должна быть камера и много чего подобного. Но на 2D уровне я его не ковырял.
...
Рейтинг: 0 / 0
[Graphics2D] как организовать скролинг холста?
    #39154404
I dont know
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пример бы мне: форма, в неё лежит панелька, в которой что-либо нарисовано, крутим колёсиком - увеличивается масштаб и в соответствии с ним меняются размеры скроллбаром, так что можно прокручивать нарисованную картинку туда-сюда... много е понятней стало (
...
Рейтинг: 0 / 0
[Graphics2D] как организовать скролинг холста?
    #39154412
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
I dont knowв неё лежит панелька, в которой что-либо нарисовано
нарисовано чем?
Если рисовал сам типа 5,5, 100, 100 то нужно пересчитывать координаты на масштабе.
Если это сцена FX то там Модель и приблуды для масштаба
...
Рейтинг: 0 / 0
[Graphics2D] как организовать скролинг холста?
    #39154414
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
I dont knowПример бы мне: форма, в неё лежит панелька, в которой что-либо нарисовано, крутим колёсиком - увеличивается масштаб и в соответствии с ним меняются размеры скроллбаром, так что можно прокручивать нарисованную картинку туда-сюда... много е понятней стало (
Такой?
http://stackoverflow.com/a/19646246
...
Рейтинг: 0 / 0
[Graphics2D] как организовать скролинг холста?
    #39154430
I dont know
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123,

Обычным graphics2d.
Ещё такой вопрос: вот я положил в JScrollPane свою панельку(холст, на которой рисую), затем в ходе "манипуляций", увеличил размер этой панельки, соответственно появились скролбары. Если я этим скролбаром немножко сдвину в сторону, скажем на 10 пикселей, правильно ли я понимаю, что взяв у Scrollpane.getView().getX() я получу как раз эти 10 пикселей, т.е отступ от края панели?
...
Рейтинг: 0 / 0
[Graphics2D] как организовать скролинг холста?
    #39154432
I dont know
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

Ща попробую, кажется то что надо...
...
Рейтинг: 0 / 0
[Graphics2D] как организовать скролинг холста?
    #39154444
I dont know
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пример как раз из той области что мне надо, только всплыла проблема с getPreferredSize().
В своей панели добавил:
Код: java
1.
2.
3.
4.
5.
6.
7.
@Override
    public Dimension getPreferredSize() {
        Dimension size = getPreferredSize();
        size.width = (int)Math.round(size.width * zoom);
        size.height = (int)Math.round(size.height * zoom);
        return size;
    }


И при сборке это дело зависло, зациклилось(Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError) на строке
Dimension size = getPreferredSize();
рекурсивно вызывает до посинения (
...
Рейтинг: 0 / 0
[Graphics2D] как организовать скролинг холста?
    #39154453
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
I dont know
Код: java
1.
2.
3.
4.
5.
6.
7.
@Override
    public Dimension getPreferredSize() {
        Dimension size = getPreferredSize();
        size.width = (int)Math.round(size.width * zoom);
        size.height = (int)Math.round(size.height * zoom);
        return size;
    }


И при сборке это дело зависло, зациклилось(Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError) на строке
Dimension size = getPreferredSize();
рекурсивно вызывает до посинения (
Блин, ну ты же сам так написал. Какого ты ожидал результата вызывая метод из самого себя?
Не, ну можно, конечно super. влепить. Но это не то.
Тебе нужен какой-то базовый размер, и где ты его будешь брать - твоя забота а не Swing. А Swing-у ты говоришь какой нужен Preferred Size в зависимости от масштаба.
...
Рейтинг: 0 / 0
[Graphics2D] как организовать скролинг холста?
    #39154458
I dont know
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кажется понял, надо было вызывать super.getPreferredSize(). Сейчас скролбары появляются автоматически, только какие-то косяки с прорисовкой. Подвигаешь скролом и нарисованный прямоугольник не обновляется, хотя до него рисую деления(крест на экране) и они перерисовываются нормально. из-за чего так?
...
Рейтинг: 0 / 0
[Graphics2D] как организовать скролинг холста?
    #39154499
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
I dont knowиз-за чего так?
Из-за твоего кода. Начни с того что в Swing надо переопределять метод paintComponent().
...
Рейтинг: 0 / 0
[Graphics2D] как организовать скролинг холста?
    #39154506
I dont know
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

Так оно и так переопределено
Код: 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.
@Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D)g;

        prepareDrawArea(g2d); // сетка из точек, при движении скролом - нормально
        drawContent(g2d); // здесь отчего-то косяки
        drawCross(g2d); // крест - тоже нормально
        g2d.dispose();

    }


 private void drawContent(Graphics2D g2d) {
        AffineTransform old = g2d.getTransform();
        AffineTransform at = new AffineTransform();

        at.scale(zoom, zoom);
        g2d.setTransform(at);

        // DRAW HERE
        g2d.drawRect(10, 10, 100, 100);

        g2d.setTransform(old);

    }


:(
...
Рейтинг: 0 / 0
[Graphics2D] как организовать скролинг холста?
    #39154509
arswars
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();

double width = getWidth();
double height = getHeight();

double zoomWidth = width * zoom;
double zoomHeight = height * zoom;

double anchorx = (width - zoomWidth) / 2;
double anchory = (height - zoomHeight) / 2;

AffineTransform at = new AffineTransform();
at.translate(anchorx, anchory);
at.scale(zoom, zoom);
at.translate(-100, -100);

g2d.setTransform(at);
g2d.drawImage(img, 0, 0, this);

g2d.dispose();
}
...
Рейтинг: 0 / 0
[Graphics2D] как организовать скролинг холста?
    #39154514
arswars
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
addMouseWheelListener(new MouseAdapter() {
@Override
public void mouseWheelMoved(MouseWheelEvent e) {
if (e.getPreciseWheelRotation() < 0) {
zoom -= 0.1;
} else {
zoom += 0.1;
}
// zoom += e.getPreciseWheelRotation();
if (zoom < 0.01) {
zoom = 0.01;
}

repaint();

}
});
...
Рейтинг: 0 / 0
[Graphics2D] как организовать скролинг холста?
    #39154537
I dont know
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
arswars,

У меня сейчас всё это дело выглядит вот так(отрисовка - примерно тоже самое что у вас, только пока без translate):
Код: 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.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
public class DrawPanel extends JPanel  {

    private double gridSize;
    private boolean gridVisible;
    private boolean centerCrossVisible;
    private double zoom;
    private double zoomStep;
    private DPMouseListener dpMouseListener;
    private Dimension currentSize;

    public DrawPanel() {
        gridSize = 20;
        zoom = 1.0;
        zoomStep = 0.15;
        gridVisible = true;
        centerCrossVisible = true;

        dpMouseListener = new DPMouseListener();
        addMouseListener(dpMouseListener);
        addMouseMotionListener(dpMouseListener);
        addMouseWheelListener(dpMouseListener);
        //setPreferredSize(super.getPreferredSize());
        currentSize = new Dimension(300, 300);
    }
    
    @Override
    public Dimension getPreferredSize() {
        currentSize.width = (int)Math.round(currentSize.width * zoom);
        currentSize.height = (int)Math.round(currentSize.height * zoom);
        
        return currentSize;
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D)g;

        prepareDrawArea(g2d);
        drawContent(g2d);
        drawCross(g2d);
        g2d.dispose();

    }

    private void prepareDrawArea(Graphics2D g2d) {

        RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING,
                                                RenderingHints.VALUE_ANTIALIAS_ON);

        rh.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
        g2d.setRenderingHints(rh);

        setBackground(Color.WHITE);

        // draw grid
        g2d.setColor(Color.DARK_GRAY);

        double w = getWidth();
        double h = getHeight();

        if(gridVisible) {
            for (int i = 0; i < w; i += gridSize*zoom) {
                for (int j = 0; j < h; j += gridSize*zoom) {
                    g2d.drawLine(i, j, i, j);
                }
            }
        }
    }

    private void drawContent(Graphics2D g2d) {
        AffineTransform old = g2d.getTransform();
        AffineTransform at = new AffineTransform();

        at.scale(zoom, zoom);
        g2d.setTransform(at);

        // DRAW HERE
        g2d.drawRect(10, 10, 100, 100);

        g2d.setTransform(old);

    }

    private void drawCross(Graphics2D g2d) {
        if(centerCrossVisible) {
            double w = getWidth();
            double h = getHeight();

            float[] dash = { 1f, 0f, 2f };

            BasicStroke bs = new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND, 1.0f, dash, 2f);
            g2d.setStroke(bs);

            g2d.setColor(Color.GRAY);
            g2d.drawLine((int) w / 2, 0, (int) w / 2, (int) h);
            g2d.drawLine(0, (int) h / 2, (int) w, (int) h / 2);
        }
    }



    public double getGridSize() { return gridSize; }
    public void setGridSize(double gs) { gridSize = gs; }

    public void setGridVisible(boolean visible) { gridVisible = visible; repaint(); }
    public void setCrossVisible(boolean visible) { centerCrossVisible = visible; repaint(); }

    public void setZoom(double z) {
        if(z > 0) {
            zoom = z;
            repaint();
        }
    }
    
    public void changeZoom(double step) {
        double z = zoom + step;
        if(z > 0.25) {
            zoom = z;
        }
    }

    // Some service functions

    private Point2D getNearestGridPoint(Point2D currentPoint) {

        return null;
    }



    // ---------------- Mouse Listener --------------

    class DPMouseListener implements MouseListener, MouseMotionListener, MouseWheelListener {

        DPMouseListener() {}

        @Override
        public void mouseClicked(MouseEvent e) {}
        @Override
        public void mouseEntered(MouseEvent e) {}
        @Override
        public void mouseExited(MouseEvent e) {}


        @Override
        public void mousePressed(MouseEvent e) {

        }

        @Override
        public void mouseReleased(MouseEvent e) {

        }

        @Override
        public void mouseMoved(MouseEvent e) {

        }

        @Override
        public void mouseDragged(MouseEvent e) {

        }

        @Override
        public void mouseWheelMoved(MouseWheelEvent e) {
            double step = 0.15f * e.getPreciseWheelRotation();
            changeZoom(step);
            repaint();
        }
    }

}

...
Рейтинг: 0 / 0
[Graphics2D] как организовать скролинг холста?
    #39155254
I dont know
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я всё таки решил проблему с отрисовкой(не обновлялось изображение). Как выяснилось, это возникало из-за AffineTransform, по совету на каком-то англ. форуме, сделал так:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
 private void drawContent(Graphics2D g2d) throws NoninvertibleTransformException {
        Graphics2D g2 = (Graphics2D)g2d.create();  // Делаю новый graphic и рисую уже в нём
        AffineTransform at = new AffineTransform();

        at.scale(zoom, zoom);
        g2.transform(at);

        // DRAW HERE
        g2.drawRect(10, 10, 100, 100);
       
       
        //g2d.transform(old);
        g2.dispose();  // надо ли это делать ил достаточно написать: g2 = null?
       
    }



В связи с этим появилась пара вопросов:
- Это вообще нормально, что в методе перерисовки постоянно создаётся новый объект(graphics2d)?
- Нужно ли после использования удалять этот объект и как будет правильнее: dispose() или просто присвоить null?

Кстати, по поводу использования оператора new(), смотрю примеры по java, как-то имхо часто он применяется, например в getPreferredSize() компонента, обязательно будет создаваться новый Dimension, это вообще нормально, что так часто используется оператор new(), расходуется память?
...
Рейтинг: 0 / 0
[Graphics2D] как организовать скролинг холста?
    #39155265
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
I dont knowЯ всё таки решил проблему с отрисовкой(не обновлялось изображение). Как выяснилось, это возникало из-за AffineTransform, по совету на каком-то англ. форуме, сделал так:
Я бы не рекомендовал подход "Фиг знает почему так, но работает"
Ссылка есть?

I dont knowВ связи с этим появилась пара вопросов:
- Это вообще нормально, что в методе перерисовки постоянно создаётся новый объект(graphics2d)?
- Нужно ли после использования удалять этот объект и как будет правильнее: dispose() или просто присвоить null?

От присвоения null пользы вообще никакой не будет. Это действие на объект никак не влияет.

I dont knowКстати, по поводу использования оператора new(), смотрю примеры по java, как-то имхо часто он применяется, например в getPreferredSize() компонента, обязательно будет создаваться новый Dimension, это вообще нормально, что так часто используется оператор new(), расходуется память?
Это палка о двух концах. С одной стороны, да, Java, в целом, любит пожрать память. С другой стороны производительность GC от количества мусора страдает не сильно. И сам GC через поколения оптимизирован так, чтобы короткоживущие объекты собирались быстро и легко.
...
Рейтинг: 0 / 0
[Graphics2D] как организовать скролинг холста?
    #39155321
I dont know
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

Насколько помню вот тут: http://www.coderanch.com/t/461376/GUI/java/Resetting-AffineTransforms. Использование копии Graphics2D было связано с тем, что необходимо было сбрасывать матрицу преобразований после зума, т.к g2d.setTransform(AffineTransform at) не всегда работал корректно(оставляя следы от нарисованного при прокрутке), но сегодня с g2d.transform(at) работает вроде нормально:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
private void drawContent(Graphics2D g2d) throws NoninvertibleTransformException {
      //  Graphics2D g2 = (Graphics2D)g2d.create();
        AffineTransform old = g2d.getTransform();
        AffineTransform at = new AffineTransform();
            
        at.scale(zoom, zoom);
       // g2d.setTransform(at);  // если использовать эту функцию, то при прокрутке будут "следы"
        g2d.transform(at);  // если эту, то вроде как всё нормально

        // DRAW HERE
        g2d.drawRect(10, 10, 100, 100);
        g2d.setTransform(old); // вчера с этим были проблемы(в сочетании с setTransform в начале функции), не знаю почему.
       
        //g2d.transform(old);
       // g2.dispose();
       
    }
...
Рейтинг: 0 / 0
[Graphics2D] как организовать скролинг холста?
    #39155325
I dont know
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczОт присвоения null пользы вообще никакой не будет. Это действие на объект никак не влияет.
Я думал GC в этом случае освободит память )
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / [Graphics2D] как организовать скролинг холста?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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