2015-12-09 2 views
0

В настоящее время я пытаюсь выяснить, как увеличить масштаб изображения JPanel, на котором нарисована графика. В настоящее время JPanel встроен в JScrollPane, что позволяет пользователю прокручивать, когда уровень масштабирования превышает 100%.Увеличение графики на JPanel

Прямо сейчас, я могу правильно масштабировать панель, но AffineTransform не применяется к событиям мыши. Также, когда видны scrollBars, они слишком длинны. Я не хочу, чтобы они были длиннее исходного размера JPanel.

private AffineTransform m_zoom; 

@Override 
protected void paintComponent(Graphics p_g) { 
    if (m_mainWindow != null) { 
     m_zoom = ((Graphics2D) p_g).getTransform(); 
     m_zoom.scale(m_scale, m_scale); 
     ((Graphics2D) p_g).transform(m_zoom); 

     super.paintComponent(p_g); 
    } 
    p_g.dispose(); 
} 

public void setScale(double p_scale) { 
    m_scale = p_scale; 
    repaint(); 
    revalidate(); 
} 

Если кто-то может помочь мне со всем этим, это было бы очень признательно! Спасибо

+1

События мыши будут * никогда * изменяться в соответствии с вашим увеличением. В Swing нет концепции масштабирования. Вы должны сделать математику самостоятельно в своих (мышах) слушателях. Что касается полосы прокрутки, которая слишком длинна, снова ее * ваш код *, который управляет предпочтительным размером вашей панели, правильно установите его для уровня масштабирования, и полосы прокрутки будут соответствовать ему. Также вы должны * никогда не удалять графический объект, переданный вашему методу paintComponent. – Durandal

+0

Вы можете делать то, что вы пытаетесь сделать с использованием JXLayer/JLayer. Связанный дублированный вопрос/ответ имеет runnable пример, который не только позволит вам масштабировать графику, но и события по мере их возникновения, что действительно круто об этом, это работает в основном на всех компонентах Swing – MadProgrammer

ответ

0

Хорошо, я выяснил, что происходило с JScrollPane. Я отрегулировал размер JPanel вручную в соответствии с новым уровнем масштабирования, и он сработал.

public void setScale(double p_newScale) { 
    m_scale = p_newScale; 
    int width = (int) (getWidth() * m_scale); 
    int height = (int) (getHeight() * m_scale); 
    setPreferredSize(new Dimension(width, height)); 
    repaint(); 
    revalidate(); 
} 

мне еще нужно найти способ, чтобы вычислить положение мыши с JPanel увеличенными в/из. Должен ли я переопределить методы mouseClicked и mouseMoved непосредственно в моем классе JPanel?

EDIT:

Я использовал простое деление для относительных координат на моих JPanel. Он отлично работает для mouseMoved и mouseClicked.

Point zoomedLocation = new Point((int)(evt.getPoint().x/m_zoomFactor), 
      (int)(evt.getPoint().y/m_zoomFactor)); 

И я использую zoomedLocation везде вместо evt.getPoint().