【发布时间】:2026-02-19 03:45:02
【问题描述】:
我正在创建一个应用程序,其中有一个带有主框架 (JFrame) 的类,以及一个名为 OvalPanelClass 的 JPanel 子类。我说主框架是因为用户可以选择打开另一个 JFrame(窗口)。此 OvalPanelClass 是动态的,并使用 BufferStrategy 显示其图像。它在某些情况下都被启动到一个单独的 JFrame 中,并且在某些时候也出现在主框架的右下部分,所以我觉得让这个类成为包含主框架的类的内部类没有意义.
问题在于,由于此 JPanel 不是具有 JFrame 的类的一部分,因此它无法调用以获取 BufferStrategy 等。所以为了克服这个问题,我尝试将对主框架的引用传递给 OvalPanelClass 构造函数,但我没有得到结果。我的问题是我的推理有什么缺陷?
FrameClass
import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class FrameClass extends JFrame {
public static void main(String[] args) {
FrameClass test = new FrameClass();
test.setup();
}
void setup() {
setPreferredSize(new Dimension(800, 800));
JPanel background = new JPanel(new BorderLayout());
getContentPane().add(background);
setVisible(true);
OvalPanelCanvas shape = new OvalPanelCanvas(this);
//shape.setup(this);
background.add(BorderLayout.CENTER, shape);
pack();
shape.repaint();
}
}
OvalPanelCanvas
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferStrategy;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class OvalPanelCanvas extends JPanel {
JFrame frame;
BufferStrategy bs;
public OvalPanelCanvas(JFrame frame) {
this.frame = frame;
setOpaque(false);
}
public void paintComponent(Graphics g) {
frame.createBufferStrategy(2);
bs = frame.getBufferStrategy();
Graphics bufferG = bs.getDrawGraphics();
for (int i = 0; i < 5; i++) {
int width = 50;
int height = 50;
bufferG.setColor(new Color(i*5,i*6,i*50));
bufferG.fillOval(0, 0, width*i, height*i);
}
bufferG.dispose();
bs.show();
}
}
感谢您的宝贵时间!我对项目是什么含糊其辞,并删除了我认为不相关的细节,但如果您需要更多背景信息,请告诉我。
【问题讨论】:
-
啊,JPanel 将使用 Swing 渲染引擎,它不会连接到您的 BufferStrategy ......这意味着除非 JPanel 被实现(附加到连接到本机对等的容器)它不会被画。你的方法的问题是它是错误的方法
-
“我说主框架是因为用户可以选择打开另一个 JFrame(窗口)。”见The Use of Multiple JFrames, Good/Bad Practice?
-
但是为什么它是错误的方法,什么是更好的方法?
标签: java swing graphics jframe bufferstrategy