使用仿射变换缩放时,JPanel不会绘制

3
我的应用程序布局类似于: 自定义的JFrame(仅处理GUI的创建),其中包含一个标准的JPanel,该面板又包含一个自定义的JPanel。
在名为MinimapPanel的自定义JPanel中,我更改了paint方法:
    //in a constructor:
    scaledTransform = new AffineTransform(); = new AffineTransform();
    scaledTransform = new AffineTransform();
    scaledTransform.scale(scaleAmount, scaleAmount);
    //...
@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);

    Graphics2D g2d = (Graphics2D) g;
    g2d.setTransform(scaledTransform);
    mapDrawer.paintMinimap(g, seatMap, miniViewHandler);//it just calls a bunch of fillRect

    if (viewRect != null) {
        g.setColor(new Color(255, 0, 0));
        int x = viewRect.x;
        int y = viewRect.y;
        g.drawRect(x, y, Math.abs(viewRect.width), Math.abs(viewRect.height));
    }
    g2d.setTransform(plainTransform);
}

如果我不应用转换,或者缩放比例为1.0(无),一切都正常工作,但是如果我进行缩放,每次JFrame重新绘制时,MinimapPanel都会保持空白。

您觉得我可能做错了什么?


为了更快地获得更好的帮助,请发布一个SSCCE - Andrew Thompson
1个回答

5
不要使用清除变换。之前的组件会为子元素位置添加自己的变换,例如 translate()。更好的方法是像这样调用代码。
AffineTransform old=g2d.getTransform();
//do your changes here
g2d.scale(scaleAmount, scaleAmount);
//paint
g2d.setTransform(old);

谢谢你提醒我,我对Swing还很陌生。实际上解决问题的方法是使用"g2d.scale(amount, amount)"而不是"g2d.setTransform(trasform)"。你有任何想法为什么会这样吗? - Enoon
正如我所说,JComponents会通过使用translate()来更改变换矩阵以将位置定位到绘制子组件之前的0坐标点(对于每个子组件的0坐标点)。 - StanislavL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接