JScrollPane
içine konum duyarlı yakınlaştırma uygulamak çalışıyorum. JScrollPane
, kendisine ayrılan alanın içine kendini çekecek özelleştirilmiş bir paint
ürününe sahip bir bileşen içerir; böylece yakınlaştırma, iç bileşeni gerektiği gibi yeniden boyutlandıran bir MouseWheelListener
kullanmak kadar kolaydır.JScrollPane içinde konuma duyarlı yakınlaştırma nasıl yapılır?
Ayrıca, bu noktaya yakınlaştırılmış (veya -out) görünümde bu noktayı olabildiğince merkezi tutmak için bir noktaya yakınlaştırmak veya uzaklaştırmak istiyorum (bu, 'konum duyarlı' olarak adlandırıyorum) yakınlaştırma, google haritalarda yakınlaştırma işlemine benzer. Bunun daha önce birçok kez yapıldığından eminim - Java Swing'in altında "doğru" yolu bilen var mı? JScrollPanes
yerine Graphic2D
's dönüşümleri ile oynamak daha iyi olur mu?
Örnek kod aşağıda:
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);
}
}
}
Eklendi kelle görmek için (ideal: Yukarıdaki kod eklendiğinde, soru cevaplar, o pasajı). – tucuxi