我有一个 JFrame,我向其中添加了一个 JPanel。我正在做一些动画,所以我实现了一个 BufferStrategy 来渲染。我还有一个渲染循环,以在运行时保持渲染。
如果我像往常一样运行程序,JPanel 就会正确呈现。当然,然后没有动画。如果我使用循环和 hte BufferedStrategy 运行它,则 JPanel 将扩展到应用程序的完整大小,并位于 JFrame 的标题栏下方。我找不到发生这种情况的充分理由,但这令人沮丧,因为我需要做一些精确的绘图,并且不能将其中的一些隐藏在标题栏下方。
我认为这是因为我没有调用super.paintComponent(),但无论如何我真的不应该调用它,因为我是自己渲染的,而不是在正常的 Swing 管道中。
是否需要进行一些 API 调用才能使 JPanel 在渲染调用中正确定位?
import java.awt.Graphics;
import java.awt.image.BufferStrategy;
import javax.swing.JFrame;
public class MainFrame extends JFrame implements Runnable {
private static final long serialVersionUID = 2190062312369662956L;
protected ViewPanel _viewPanel = null;
public MainFrame() {
setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
createGui();
}
protected void createGui() {
setSize( 600, 400 );
setTitle( "Exact Positioning" );
setVisible( true );
setResizable( false );
_viewPanel = new ViewPanel();
_viewPanel.init();
// the layout type shouldn't matter since this is the only component in the frame
add( _viewPanel );
}
@Override
public void run() {
// setup
this.createBufferStrategy( 2 );
BufferStrategy buffStrategy = this.getBufferStrategy();
// render loop
while( true ) {
Graphics g = null;
try {
g = buffStrategy.getDrawGraphics();
_viewPanel.render( g );
} finally {
g.dispose();
}
buffStrategy.show();
// pause a tad
try {
Thread.sleep( 500 );
} catch (InterruptedException e) {
// Required catch block
e.printStackTrace();
} catch (Exception e) {
System.out.println( "Sorry, don't know what happened: " + e.toString() );
e.printStackTrace();
}
}
}
PIPIONE
相关分类