我正在用Java制作简单的游戏,而我正在使用Swing。我有JFrame,在里面我想要两个JPanels - 一个用于得分等等,第二个用于实际游戏。我读到每个JPanel都有自己的坐标,所以point(0,0)位于该面板的左上角。
我覆盖方法paintComponent()im我的类GameView显示游戏(所以这是我提到的第二个JPanel)。但是当我想在gameView的左上角绘制一些东西并将该图像的坐标设置为(0,0)时,它会在BarView上绘制。
我阅读了许多有关绘图的教程和帖子,但我看不出我做错了什么。所以我的问题是,如何使用JPanel坐标绘制一些东西,而不是JFrame坐标?这是一些代码:
添加将JPanel扩展到JFrame的对象:
GameView v = new GameView();
BarView bv = new BarView();
frame.getContentPane().add(bv);
frame.getContentPane().add(v);
frame.setVisible(true);
v.requestFocus();
v.repaint();
bv.repaint();
在JPanel中绘图:
public class GameView extends JPanel implements View, Commons{
public static final int WIDTH=WINDOW_WIDTH, HEIGHT=ARENA_HEIGHT;
private GameScene gameScene;
private TexturePaint paint;
private BufferedImage bi;
public GameView(){
addKeyListener(new CustomKeyListener());
addMouseMotionListener(new CustomMouseListener());
setSize(WINDOW_WIDTH, ARENA_HEIGHT);
setFocusable(true);
try {
bi = ImageIO.read(new File("src/res/texture.png"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
this.paint = new TexturePaint(bi, new Rectangle(0, 0, bi.getWidth(), bi.getHeight()));
}
@Override
public void paintComponent(Graphics g1) {
Graphics2D g = (Graphics2D) g1;
g.setPaint(paint);
g.fillRect(0, 0, WINDOW_WIDTH, ARENA_HEIGHT);
for(Iterator<Drawable> it = gameScene.models.iterator(); it.hasNext();)
{
Drawable d = it.next();
d.draw(g1);
}
Toolkit.getDefaultToolkit().sync();
}
和gameScene中模型的方法绘制通常如下所示:
public void draw(Graphics g1){
Graphics2D g = (Graphics2D) g1.create();
int cx = image.getWidth(null) / 2;
int cy = image.getHeight(null) / 2;
g.rotate(rotation, cx+x, cy+y);
g.drawImage(image, x, y, null);
}
答案 0 :(得分:3)
您的frame
似乎未指定LayoutManager
,因此默认为BorderLayout
。
当您随后在未传递位置常数的情况下致电frame.getContentPane().add(component)
时,位置BorderLayout.CENTER
将被默认。
结果是,您的GameView
和BarView
组件将在彼此之上呈现。
作为快速测试,请尝试按如下方式指定组件位置:
GameView v = new GameView();
BarView bv = new BarView();
frame.getContentPane().add(bv, BorderLayout.LINE_START);
frame.getContentPane().add(v, BorderLayout.LINE_END);
除非您的UI非常简单,否则您可能会发现需要使用其他布局管理器。有关此主题的更多信息,请参阅'How to Use Various Layout Managers'。