मैं JScrollPane
के अंदर स्थिति-संवेदनशील ज़ूमिंग को लागू करने की कोशिश कर रहा हूं। JScrollPane
में एक अनुकूलित paint
वाला एक घटक होता है जो इसे आवंटित किए गए स्थान के भीतर स्वयं खींच लेगा - इसलिए ज़ूमिंग MouseWheelListener
का उपयोग करने जितना आसान है जो आवश्यकतानुसार आंतरिक घटक का आकार बदलता है।आप JScrollPane के अंदर स्थिति-संवेदनशील ज़ूमिंग कैसे कार्यान्वित करते हैं?
लेकिन मैं उस बिंदु को ज़ूम करने के लिए एक बिंदु (या बाहर) ज़ूम करना चाहता हूं ताकि परिणामस्वरूप ज़ूम-इन (या-आउट) व्यू के भीतर जितना संभव हो सके केंद्र (यह वही है जिसे मैं 'स्थिति-संवेदनशील' के रूप में संदर्भित करता हूं) ज़ूमिंग), Google नक्शे में ज़ूमिंग कैसे काम करता है। मुझे यकीन है कि यह कई बार पहले किया गया है - क्या किसी को जावा स्विंग के तहत ऐसा करने का "सही" तरीका पता है? JScrollPanes
का उपयोग करने के बजाय Graphic2D
के परिवर्तनों के साथ खेलना बेहतर होगा?
नमूना कोड इस प्रकार है:
package test;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;
public class FPanel extends javax.swing.JPanel {
private Dimension preferredSize = new Dimension(400, 400);
private Rectangle2D[] rects = new Rectangle2D[50];
public static void main(String[] args) {
JFrame jf = new JFrame("test");
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setSize(400, 400);
jf.add(new JScrollPane(new FPanel()));
jf.setVisible(true);
}
public FPanel() {
// generate rectangles with pseudo-random coords
for (int i=0; i<rects.length; i++) {
rects[i] = new Rectangle2D.Double(
Math.random()*.8, Math.random()*.8,
Math.random()*.2, Math.random()*.2);
}
// mouse listener to detect scrollwheel events
addMouseWheelListener(new MouseWheelListener() {
public void mouseWheelMoved(MouseWheelEvent e) {
updatePreferredSize(e.getWheelRotation(), e.getPoint());
}
});
}
private void updatePreferredSize(int n, Point p) {
double d = (double) n * 1.08;
d = (n > 0) ? 1/d : -d;
int w = (int) (getWidth() * d);
int h = (int) (getHeight() * d);
preferredSize.setSize(w, h);
getParent().doLayout();
// Question: how do I keep 'p' centered in the resulting view?
}
public Dimension getPreferredSize() {
return preferredSize;
}
private Rectangle2D r = new Rectangle2D.Float();
public void paint(Graphics g) {
super.paint(g);
g.setColor(Color.red);
int w = getWidth();
int h = getHeight();
for (Rectangle2D rect : rects) {
r.setRect(rect.getX() * w, rect.getY() * h,
rect.getWidth() * w, rect.getHeight() * h);
((Graphics2D)g).draw(r);
}
}
}
जोड़ा इनाम देखने के लिए (आदर्श: कोड स्निपेट है कि, जब ऊपर कहा, सवाल का जवाब)। – tucuxi