Java Swing поворот и масштабирование

У меня есть JPanel, окруженный JScrollPane. Эта панель JPanel используется для отображения изображения. Мне нужно предоставить такие функции, как zoomIn, zoomOut, clockwiseRotate и antiClockwiseRotate. Все эти функции работают нормально по отдельности. Для увеличения я называю масштаб графического объекта. Это происходит сверху слева направо снизу. Для вращения я сбрасываю масштаб и перемещаю, вращаю и перемещаю обратно графический объект. Но когда я комбинирую масштабирование с поворотом, он ведет себя иначе. Например, я поворачиваю по часовой стрелке, и изображение поворачивается на 1,57079633 радиан (примерно на 90 градусов). Теперь, когда я нажимаю кнопку масштабирования, изображение увеличивается, но масштабирование происходит на основе верхнего правого и нижнего левого базиса, а не верхнего левого и нижнего правого базиса. Если я снова поверну изображение по часовой стрелке, я сбрасываю масштаб, то есть масштабирую изображение до его исходного размера и вызываю translate, rotate и translate обратно для графического объекта. Теперь, если я снова нажму кнопку масштабирования, масштаб будет увеличиваться в зависимости от нижнего правого и верхнего левого угла.

Следовательно, проблема в том, что координаты изображения не меняются при изменении координат панелей. Может кто-нибудь помочь мне изменить координаты изображения?

public void paint(Graphics g)
{     
    Graphics2D g2d = (Graphics2D)g;
    g2d.translate((tempWidth/2), (tempHeight/2));
    g2d.rotate(m_rotate);
    g2d.translate(-(tempWidth/2), -(tempHeight/2));
    g2d.scale(m_zoom, m_zoom); 
    if(this.image != null && this.image.getHeight(null) > 0)
    {
        g2d.drawImage(this.image, 0, 0,302,312,this);         
    } 
    else
    {
        g2d.drawString("View Image Here!. ", 20, 20);
    }    
} 

person Praveen Vijayaraghavan    schedule 09.04.2012    source источник
comment
1) Чтобы быстрее получить помощь, опубликуйте SSCCE. 2) Переопределить paintComponent() в JPanel, а не paint() 3) this.image.getHeight(null) должно быть this.image.getHeight(this)   -  person Andrew Thompson    schedule 09.04.2012
comment
См. Также этот ответ.   -  person trashgod    schedule 09.04.2012


Ответы (1)


Спасибо за вашу помощь. Это заставило меня задуматься в новом измерении, которое помогло мне решить проблему. Все, что я сделал, это просто масштабировал изображение перед поворотом, и теперь оно работает нормально.

public void paint(Graphics g) 
{          
    Graphics2D g2d = (Graphics2D)g; 
    g2d.scale(m_zoom, m_zoom);//This is what made the magic    
    g2d.translate((tempWidth/2), (tempHeight/2));     
    g2d.rotate(m_rotate);     
    g2d.translate(-(tempWidth/2), -(tempHeight/2)); 
    /*g2d.scale(m_zoom, m_zoom); removed this and placed above */
    if(this.image != null && this.image.getHeight(null) > 0)     
    {         
        g2d.drawImage(this.image, 0, 0,302,312,this);
    }
    else
    {         
        g2d.drawString("View Image Here!. ", 20, 20);
    }     
}
person Praveen Vijayaraghavan    schedule 10.04.2012