在JFrame中移动和调整JPanels对象的大小

时间:2010-04-13 01:16:27

标签: java jcomponent

通过做一个简单的游戏继续我学习Java的过程,我偶然发现了一个问题。我的游戏板扩展了JPanel以及每块板子。现在,这提出了一些问题:

  1. 不能设置每件作品的大小,因此,JPanel每件作品都是整个JFrame,隐藏其余部分和背景(游戏板)。

  2. 无法确定棋子的位置。

  3. 我有默认的流管理器。尝试过setbounds,没有运气。

    也许我应该让这篇文章扩展其他JComponent? 添加图片: 这是件,现在灰色的区域也是一块!通过制作一个mousePressed监听器并为其分配一些东西来检查它。在灰色区域下方,是游戏板(或者至少应该是!),另一个是JPanel。

    alt text http://img42.imageshack.us/img42/2227/screenshotvdy.png

    一些代码:

    package TheProject;
    
    import java.awt.Color;
    import java.awt.Dimension;
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    
    public class GameWindow extends JFrame {
    public GameWindow() {
        setSize(800, 600);
        setLocationRelativeTo(null);
        Map map = new Map(800, 600, 2);
        add(map);
    
        MilitaryUnit imperialRussia = new MilitaryUnit(30, Color.BLACK, Color.YELLOW, Color.WHITE);
        imperialRussia.setPreferredSize(new Dimension(30, 30));
        add(imperialRussia);
    
    }
     }
    

    当我应用pack()方法时会发生这种情况: alt text http://img442.imageshack.us/img442/5813/screenshot2ml.png

    在单位周围打包,而不是更大的地图并填充JFrame。

4 个答案:

答案 0 :(得分:1)

对于随机移动棋子的游戏,您可能会使用“空布局”。

阅读Absolute Positioning上的Swing教程中的部分以获取更多信息。

答案 1 :(得分:0)

您是否尝试过setPreferredSize(Dimension d)

修改:在添加组件后,您需要在JFrame上调用pack()

JFrame frame = new JFrame();
frame.setPreferredSize(new Dimension(800,600));
JPanel panel = new JPanel();
panel.setPreferredSize(new Dimension(200,200));
frame.add(panel);
frame.pack();
frame.setvisible(true);

另外,您向JFrame添加了一个Map,它与JFrame具有相同的尺寸 - 很好。但之后,您将另一个组件添加到默认的flowlayout。这不适合您的框架,因为地图已经占据了100%的空间。

答案 2 :(得分:0)

您是否尝试过NetBeans的可视化编辑器?您可以使用它在设计视图中拖放,调整大小以方便Swing对象,然后可以切换到代码视图以查看生成的代码。你可以这样学习。

答案 3 :(得分:0)

我使用JPanel写了几个游戏。基本上我使用JPanel的方式就像我正在使用Canvas,即我通过覆盖paint()方法直接绘制它。我使用JPanel的原因是因为我可以确定游戏世界的大小,然后使用setPreferredSize()来设置面板的大小。然后我将面板添加到JScrollPane。所以这将照顾平移等。

说我正在写一个2D游戏。这就是我使用JPanel的方式。我有一个逻辑地图(一个2D数组)来保存我的游戏地图。假设每个位置都是32x32像素。所以你开始绘制地面以及该地点的地面。例如,在x = 1,y = 2,即屏幕位置x = 32,y = 64,首先绘制地面,然后绘制地面上的内容。因此渲染循环的粗略轮廓将是这样的

for (int y = 0; y < map.length; y++)
   for (int x = 0; x < map[y].length; x++) {
      drawGround(map[y][x])
      for very element on on map[y][x] - render them
}      

您为JPanel设置了一个MouseListener侦听器,因此每次点击鼠标都会转换回地图,例如。鼠标点击x = 54,y = 72对应于x = 1,y = 2。如果你有一个等轴测视图,计算有点棘手。

这里需要注意的是,每次通过滚动面板滚动面板时,都会调用paint()。所以最好用BufferedImage渲染你的游戏板,然后在paint()方法中绘制BufferedImage,否则它会太慢。