首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AffineTransform似乎忽略了组件边界

AffineTransform似乎忽略了组件边界
EN

Stack Overflow用户
提问于 2013-12-24 15:10:12
回答 2查看 123关注 0票数 6

我有以下几点:

代码语言:javascript
复制
public class ParametricEQView extends JPanel implements PluginView {
    private static final int BAND_WIDTH = 3;
    private static final int THROW_HEIGHT = 64;

    private static final int WIDTH = 128*BAND_WIDTH + 2*MARGIN;
    private static final int HEIGHT = 2*THROW_HEIGHT + 2*MARGIN;
    private static final int MID_HEIGHT = THROW_HEIGHT + MARGIN;

    private final ParametricEQ _peq;

    public ParametricEQView(ParametricEQ peq) {
        super();
        _peq = peq;

        SwingUtils.freezeSize(this, WIDTH, HEIGHT);
        setToolTipText("Parametric Equalizer");
    }

    @Override
    public void paint(Graphics g) {
        final Graphics2D g2d = (Graphics2D) g;
        final int max = findMax();

        g.setColor(BACKGROUND);
        g.fillRect(0, 0, WIDTH, HEIGHT);

        g.setColor(DATA);
        final double scalingFactor = -((double) THROW_HEIGHT) / max;
        final double[] fineLevels = _peq.getFineLevels();
        int x = MARGIN;
        int h;
        final int[] xPoints = new int[128];
        final int[] yPoints = new int[128];
        for (int i = 0; i < 128; ++i) {
            h = (int) (fineLevels[i] * scalingFactor);
            xPoints[i] = x;
            yPoints[i] = MID_HEIGHT + h;
            x += BAND_WIDTH;
        }
        g.drawPolyline(xPoints, yPoints, 128);

        g.setColor(AXES);
        g.drawLine(MARGIN, MARGIN, MARGIN, HEIGHT-MARGIN);
        g.drawLine(MARGIN, MID_HEIGHT, WIDTH-MARGIN, MID_HEIGHT);

        g.setFont(AXIS_FONT);
        final FontMetrics metrics = g.getFontMetrics();
        int width = (int) metrics.getStringBounds(AXIS_LABEL_INPUT_MIDINUM, g).getWidth();
        g.drawString(AXIS_LABEL_INPUT_MIDINUM, WIDTH-MARGIN-width, HEIGHT-3);

        final AffineTransform atx = new AffineTransform();
        atx.setToRotation(-Math.PI/2, 0, HEIGHT);
        g2d.setTransform(atx);
        final String topLabel = "+" + max;
        width = (int) metrics.getStringBounds(topLabel, g).getWidth();
        g2d.drawString(topLabel, HEIGHT-MARGIN-width, HEIGHT+10);

        width = (int) metrics.getStringBounds(AXIS_LABEL_OUTPUT_VELOCITY, g).getWidth();
        g2d.drawString(AXIS_LABEL_OUTPUT_VELOCITY, MID_HEIGHT-(width/2), HEIGHT+10);

        g2d.drawString("-" + max, MARGIN, HEIGHT+10);
    }

    private int findMax() {
        int max = 3;
        for (int i = 0; i < 128; ++i)
            max = Math.max(max, (int) Math.ceil(Math.abs(_peq.getFineLevels()[i])));
        return max;
    }
}

看上去是这样的:

ParametricEQView是白色背景填充大部分窗口的组件。在这个图像中,它的坐标在包含的帧中是(0,0),一切都很好。但是,如果我调整窗口的大小,使ParametricEQView移动超过一个位(它有固定的大小,并设置为在其可用空间中的中心位置),则旋转的文本相对于框架的(0,0)而不是组件:

其他的东西都是相对于面板绘制的,只是旋转的文本没有。我做错了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-24 15:43:15

当您调用g2d.setTransform(atx);时,您将覆盖Graphics对象中当前设置的转换,即面板与其父框架之间的转换。这就是为什么文本在框架引用中绘制,而不是在面板引用中绘制的原因。

正确的代码是获取当前转换并修改它或直接调用Graphics2D.rotate(double)

票数 1
EN

Stack Overflow用户

发布于 2013-12-24 15:32:27

1)对于自定义绘画,您需要重写protected void paintComponent(Graphics g)而不是public void paint(Graphics g)。阅读更多关于customPaintings的信息。

(2)您似乎遇到了问题,因为您在创建GUI时做了类似于下一步的事情:

代码语言:javascript
复制
JFrame frame = new JFrame();
JPanel p = new JPanel();
ParametricEQView view = new ParametricEQView();
view.setPreferredSize(new Dimension(200,200));
p.add(view);
frame.add(p);

在这种情况下,ParametricEQView不会根据需要调整大小,因为JPanel使用FlowLayout作为默认值。

您需要为您的面板使用另一个LayoutManager,例如BorderLayout

尝试下面这样的方法:

代码语言:javascript
复制
JFrame frame = new JFrame();
ParametricEQView view = new ParametricEQView();
frame.add(view);

代码语言:javascript
复制
JPanel panel = new JPanel(new BorderLayout());
panel.add(view,BorderLayout.CENTER);
frame.add(panel);

在这种情况下,您的ParametricEQView面板将以适当的方式绘制。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20763027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档