我想在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,它显示了这个:
这几乎是:它只在一个256x256的盒子(图像尺寸)中从0,0描绘图像,无论它被重新定位到哪里。
任何建议,帮助,解决方案和建议? 如果您需要更多代码,请问我,不要在这里放置所有内容;)
答案 0 :(得分:4)
无需自定义绘画:
或者,如果您进行自定义绘制,则不需要空布局。
getPreferredSize()
方法并将面板添加到框架中。 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);
在您的情况下,您应该移动组件而不是图像。
就个人而言,我会使用JPanel
将JFrame
添加到BorderLayout
,然后您只需将图片移动到组件本身的上下文中的任何位置即可。请务必覆盖getPreferredSize
以便为您的目的返回合适的尺寸,以便更有效地将框架打包在其周围。
使用组件制作动画很棘手(并非不可能,需要考虑很多),通常直接绘制到像JPanel
这样的画布更容易,但那就是我
有关绘画如何运作的详细信息,请参阅Painting in AWT and Swing和Performing Custom Painting