图像仅在原始范围内绘制

时间:2015-12-10 19:28:40

标签: java swing

我想在JFrame中为几个jpgs制作动画,我将向您展示一些摘录:

扩展JFrame的类构造函数

super(title);
setLayout(null);
setResizable(false);
setSize(Settings.windowWidth, Settings.windowHeight);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setVisible(true);

扩展JPanel的类构造函数

i = new ImageIcon(image).getImage();
setSize(i.getWidth(this),i.getHeight(this));
setBounds(x, y, i.getWidth(this), i.getHeight(this));

覆盖方法

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawImage(i, getX(), getY(), null);
}

是的,我知道null布局并不是优先考虑的,但除非你对绝对定位有更好的想法,否则我现在就坚持使用它。

上面的代码确实绘制了图像,从(x,y)开始,但不完全。 对于50和100,它显示了这个:

enter image description here

这几乎是:它只在一个256x256的盒子(图像尺寸)中从0,0描绘图像,无论它被重新定位到哪里。

任何建议,帮助,解决方案和建议? 如果您需要更多代码,请问我,不要在这里放置所有内容;)

2 个答案:

答案 0 :(得分:4)

无需自定义绘画:

  1. 将ImageIcon添加到JLabel并将JLabel添加到JPanel
  2. 如果要为其设置动画,请更改面板上标签的位置。
  3. 或者,如果您进行自定义绘制,则不需要空布局。

    1. 您覆盖JPanel的getPreferredSize()方法并将面板添加到框架中。
    2. 然后在paintComponent()方法中,您可以使用所设置的首选大小的边界在所需的位置绘制图像。

答案 1 :(得分:3)

我的直觉是你不明白组件绘画是如何运作的......

首先,你这样做......

i = new ImageIcon(image).getImage();
setSize(i.getWidth(this),i.getHeight(this));
setBounds(x, y, i.getWidth(this), i.getHeight(this));

然后你这样做......

g.drawImage(i, getX(), getY(), null);

似乎是在从组件原点偏移位置处绘制图像,但由于组件的大小与图像的大小相匹配,因此图像在组件边界处被裁剪。

绘制组件时,Graphics上下文的原点设置为组件位置,这意味着0x0现在是组件的上/左角。

您可以使用setBorder(new LineBorder(Color.RED))对此进行测试,这将显示组件的物理边界

在你的情况下,像

    g.drawImage(i, 0, 0, this);

在您的情况下,您应该移动组件而不是图像。

就个人而言,我会使用JPanelJFrame添加到BorderLayout,然后您只需将图片移动到组件本身的上下文中的任何位置即可。请务必覆盖getPreferredSize以便为您的目的返回合适的尺寸,以便更有效地将框架打包在其周围。

使用组件制作动画很棘手(并非不可能,需要考虑很多),通常直接绘制到像JPanel这样的画布更容易,但那就是我

有关绘画如何运作的详细信息,请参阅Painting in AWT and SwingPerforming Custom Painting

相关问题