Изменения представления Java AffineTransform

Я пытаюсь построить простой график и использовать следующий код для управления системой координат графика:

Graphics2D g2d = (Graphics2D) g;

// Save the current transform to put it back the way I found it
saveAT = g2d.getTransform();

int height = getHeight();
// Get the get the magnitude of the sample
long scale = thePlotArray.getRealScale();

// Set the x origin at 0 and the y origin in the center of the window
double yTrans = ((double)height)/2.0;
AffineTransform tform = AffineTransform.getTranslateInstance( 0.0, yTrans);

// set the y scale to show all of the sample
double yScale = ((double)height) / ((double)scale);
tform.scale(1, yScale);
g2d.setTransform(tform);

// Plot the data with a series of 
g2d.drawLine(x1,  y1, x2, y2);

// reset the transform back
g2d.setTransform(saveAT);

Кажется, это работает хорошо, пока я не изменю размер окна, а затем источник подпрыгнет примерно на 1/10 окна. Все числа кажутся одинаковыми, когда я распечатываю высоту, масштаб, yTrans и т. д.

Есть ли что-то, что я не делаю?


person Sting    schedule 14.02.2014    source источник


Ответы (1)


Я столкнулся с той же проблемой (для простой гистограммы). Метод покраски такой:

public void paintComponent(Graphics g){
    super.paintComponent(g);
    if(_data==null){
        return;
    }

    int bars = _data.length;
    int width = this.getSize().width/bars;
    int height = this.getSize().height;

    Graphics2D g2d = (Graphics2D)g.create();
    AffineTransform flip = new AffineTransform();
    flip.translate(0, height);
    flip.scale(1, -1);
    g2d.setTransform(flip);

    //Painting code via g2d.drawRect(), g2d.fillRect()

}

Мои панели дисплея встроены в другую панель. Всякий раз, когда вызывается display.componentResized(), кажется, что источник перемещается примерно на 24 точки. У меня это есть как часть демонстрации MVC, и для некоторых событий, которые генерируют перерисовку (с настройкой значений на дисплее или без нее), исходная точка выглядит правильно сброшенной на (0,0).

Дальнейшее устранение неполадок показывает, что ошибка присутствует только тогда, когда эта панель отображения присутствует в JTabbedPane. Например, добавление MouseListener для перерисовки отображения в действии mouseMoved() разрешает источник.

Переключение между вкладками восстанавливает проблему. Попытка перекрасить дисплей как часть обработки ChangeEvent не дала результата.

Пока нет решения.

person FormerLurker    schedule 08.11.2014