2009-09-22 6 views
2

У меня есть JPanel, на который я нарисован, и я пытаюсь его получить, чтобы вы могли использовать колесо мыши для «масштабирования» входов и выходов путем изменения переменной масштаб. Прямо сейчас, что происходит, вы можете увеличивать или уменьшать масштаб, но все чертежи сдвигаются вправо и вниз, когда вы увеличиваете масштаб, а затем создаете резервную копию и выходите при масштабировании.Java Graphics2D Панорамирование и масштабирование/преобразование и масштабирование

Я хочу сделать так, что он регулирует, как если бы вы были наезд на точке в центре JPanel, но я не могу понять, как вычислить право смещения перевести на ...

Любого получили представление о том, как это сделать, или еще лучше - более чистый способ достижения этой цели и масштабирования?

я в основном черчения кучу координат, которые пришли из системы, где 0,0 находится в левом нижнем углу и попадают между границами:

xMin = 661208 
xMax = 662618 

yMin = 4291657 
yMax = 4293285 

@Override 
protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 

    Graphics2D g2 = (Graphics2D) g; 

    double scale = details.getScale(); 
    double xOffset = details.getxOffset(); 
    double yOffset = details.getyOffset(); 

    g2.scale(scale, -scale); 

    // Dividing offset by scale makes panning 1:1 with the cursor still. yMax to account for the 
    // fact we needed to flip around the y axis to make it right-side up. 
    g2.translate((-xMin + xOffset/scale), (-yMax + yOffset/scale)); 

    // Code to draw stuff goes here. It uses coordinates between xMin-xMax and yMin-yMax to draw. 
    . 
    . 
    . 
} 
+0

Этот вопрос может помочь вам [http://stackoverflow.com/questions/690871/affinetransform-scaling-a-shape-from-its-center](http://stackoverflow.com/questions/690871/affinetransform -scaling-а-образную форму из-ее-центра) – Pierre

ответ

-1

Вот пример с колесом:

public class GraphicsOnly extends JPanel implements MouseWheelListener { 
     Shape[] shapes; 
     Dimension size; 
     double scale = 1.0; 
     private static int source = 100; 
     public GraphicsOnly() { 
     addMouseWheelListener(this); 
     size = new Dimension(10,10); 
     setBackground(new Color(240,200,200)); 
    } 



    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2 = (Graphics2D)g; 
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
          RenderingHints.VALUE_ANTIALIAS_ON); 
     if(shapes == null) initShapes(); 
     // Keep shapes centered on panel. 
     double x = (getWidth() - scale*size.width)/2; 
     double y = (getHeight() - scale*size.height)/2; 
     AffineTransform at = AffineTransform.getTranslateInstance(x, y); 
     at.scale(scale, scale); 
     g2.setPaint(Color.blue); 
     g2.draw(at.createTransformedShape(shapes[0])); 
     g2.setPaint(Color.green.darker()); 
     g2.draw(at.createTransformedShape(shapes[1])); 
     g2.setPaint(new Color(240,240,200)); 
     g2.fill(at.createTransformedShape(shapes[2])); 
     g2.setPaint(Color.red); 
     g2.draw(at.createTransformedShape(shapes[2])); 
    } 

    public Dimension getPreferredSize() { 
     int w = (int)(scale*size.width); 
     int h = (int)(scale*size.height); 
     return new Dimension(w, h); 
    } 

    private void initShapes() { 
     shapes = new Shape[3]; 
     int w = getWidth(); 
     int h = getHeight(); 
     shapes[0] = new Rectangle2D.Double(w/16, h/16, w*7/8, h*7/8); 
     shapes[1] = new Line2D.Double(w/16, h*15/16, w*15/16, h/16); 
     shapes[2] = new Ellipse2D.Double(w/4, h/4, w/2, h/2); 
     size.width = w; 
     size.height = h; 
    } 


    public static void main(String[] args) { 
     GraphicsOnly app = new GraphicsOnly(); 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.getContentPane().add(new JScrollPane(app)); 
     f.setSize(400, 400); 
     f.setLocation(200,200); 
     f.setVisible(true); 
    } 

    @Override 
    public void mouseWheelMoved(MouseWheelEvent e) { 
     // TODO Auto-generated method stub 
     if(e.getWheelRotation() >0){ 
      source = source-e.getScrollAmount(); 
     }else{ 
      source = source+e.getScrollAmount(); 
     } 
     scale = source/100.0; 
     System.out.println(scale); 
     repaint(); 
     revalidate(); 
    } 
} 
Смежные вопросы