Форум программистов, компьютерный форум, киберфорум
Наши страницы
Java: GUI, Графика
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
LanGrande
6 / 6 / 1
Регистрация: 15.09.2013
Сообщений: 149
1

Zoom! В JFrame

19.11.2013, 11:52. Просмотров 677. Ответов 1
Метки нет (Все метки)

Приветствую дорогие форумчане!
Задумался я над задачкой, а можно ли сделать zoom в приложении на Java ?
Допустим,имеется обычный JFrame, в нем нарисованы кружочки и т д.Так вот крутим колесиком и объекты у нас то уменьшаются,то увеличиваются..Такое можно сделать подскажите, пожалуйста. без особо монструозного кода,нашел в интернетах такую интересную реализацию:

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
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.AffineTransform;
 
import javax.swing.JComponent;
import javax.swing.JFrame;
 
public class tests {
 
    private static TransformingCanvas canvas;
 
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        canvas = new TransformingCanvas();
        TranslateHandler translater = new TranslateHandler();
        canvas.addMouseListener(translater);
        canvas.addMouseMotionListener(translater);
        canvas.addMouseWheelListener(new ScaleHandler());
        frame.setLayout(new BorderLayout());
        frame.getContentPane().add(canvas, BorderLayout.CENTER);
        frame.setSize(500, 500);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.setVisible(true);
    }
 
    private static class TransformingCanvas extends JComponent {
        
        private static final long serialVersionUID = 1L;
        private double translateX;
        private double translateY;
        private double scale;
 
        TransformingCanvas() {
            translateX = 0;
            translateY = 0;
            scale = 1;
            setOpaque(true);
            setDoubleBuffered(true);
        }
 
        @Override 
        public void paint(Graphics g) {
            AffineTransform tx = new AffineTransform();
            tx.translate(translateX, translateY);
            tx.scale(scale, scale);
            Graphics2D ourGraphics = (Graphics2D) g;
            ourGraphics.setColor(Color.WHITE);
            ourGraphics.fillRect(0, 0, getWidth(), getHeight());
            
            
            ourGraphics.setColor(Color.RED);
            ourGraphics.drawString("Game Test", 10, 20);
            
            
            ourGraphics.setTransform(tx);
            ourGraphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                    RenderingHints.VALUE_ANTIALIAS_ON);
            ourGraphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
                    RenderingHints.VALUE_TEXT_ANTIALIAS_ON);            
            ourGraphics.setColor(Color.BLACK);
            ourGraphics.drawRect(50, 50, 50, 50);
            ourGraphics.fillOval(100, 100, 100, 100);
            ourGraphics.fillOval(300, 300, 100, 100);
            ourGraphics.drawString("Test Affine Transform", 50, 30);
            // super.paint(g);
        }
    }
 
    private static class TranslateHandler implements MouseListener,
            MouseMotionListener {
        private int lastOffsetX;
        private int lastOffsetY;
 
        public void mousePressed(MouseEvent e) {
            // capture starting point
            lastOffsetX = e.getX();
            lastOffsetY = e.getY();
        }
 
        public void mouseDragged(MouseEvent e) {
            
            // new x and y are defined by current mouse location subtracted
            // by previously processed mouse location
            int newX = e.getX() - lastOffsetX;
            int newY = e.getY() - lastOffsetY;
 
            // increment last offset to last processed by drag event.
            lastOffsetX += newX;
            lastOffsetY += newY;
 
            // update the canvas locations
            canvas.translateX += newX;
            canvas.translateY += newY;
            
            // schedule a repaint.
            canvas.repaint();
        }
 
        public void mouseClicked(MouseEvent e) {}
        public void mouseEntered(MouseEvent e) {}
        public void mouseExited(MouseEvent e) {}
        public void mouseMoved(MouseEvent e) {}
        public void mouseReleased(MouseEvent e) {}
    }
 
    private static class ScaleHandler implements MouseWheelListener {
        public void mouseWheelMoved(MouseWheelEvent e) {
            if(e.getScrollType() == MouseWheelEvent.WHEEL_UNIT_SCROLL) {
                
                // make it a reasonable amount of zoom
                // .1 gives a nice slow transition
                canvas.scale += (.1 * e.getWheelRotation());
                // don't cross negative threshold.
                // also, setting scale to 0 has bad effects
                canvas.scale = Math.max(0.00001, canvas.scale); 
                canvas.repaint();
            }
        }
    }
 
}
Но больно она монструозна,нельзя ли как то покороче сделать/придумать?)
Можно , конечно, сделать так создать обработчик для колесика изменять там переменную,а потом плюсовать к ширине - высоте,но может есть вариант лучше.. Заранее благодарю за помощь!)
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.11.2013, 11:52
Ответы с готовыми решениями:

Проходил ли кто-то видео-курс techpro? Как у них получилось JFrame в JFrame добавить
Проходил ли кто-то видео-курс techpro? Как у них получилось JFrame в JFrame добавить? ...

Как закрыть один JFrame и открыть новый JFrame?
привет подскажите как реализовать. есть отдельный класс с выпадающим меню(там три пункта). есть...

Как сделать Jframe внутри другого JFrame
Доброго времени суток джентльмены и леди. Как сделать так, что бы внутри главного JFrame запустить...

JFrame
У меня есть ResultSet данных из базы MySQL. При помощи чего вывести данные в графическом...

JFrame
java.awt.EventQueue.invokeLater(new Runnable() { public void run() { ...

1
Skipy
1996 / 1419 / 91
Регистрация: 25.11.2010
Сообщений: 3,611
19.11.2013, 13:12 2
Цитата Сообщение от LanGrande Посмотреть сообщение
Можно , конечно, сделать так создать обработчик для колесика изменять там переменную,а потом плюсовать к ширине
А мне казалось, что Вы уже должны были познакомиться с LayoutManager-ами и понять, что Ваш подход просто не сработает...

То, что Вы привели, - это элегантно, компактно и просто. Знал бы автора, пожал бы руку.
2
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2013, 13:12

JFrame и БД
Доброго времени суток. И так, такая проблема. Есть код который Выводит базу данных в таблицу,...

JFrame
У меня есть две панели в которых я произвожу размещение элементов и я хочу между ними переключаться...

JFrame
Привет... Ответьте пожалуйста на вопросик. Вот например в NetBeans'е я создал пример формы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru