gpt4 book ai didi

Java - JFrame、JPanel、布局和裁剪

转载 作者:搜寻专家 更新时间:2023-11-01 03:14:00 25 4
gpt4 key购买 nike

我有三个问题。 (注意 - 我没有足够的声誉来发布图片,所以我将它们链接起来。我需要混淆它们......)

1) 我创建了一个面板来保存我的游戏图形(玩家区域)。该面板应该是 800x800 并剪掉位于下方和右侧的所有内容。但是当我将图形面板添加到 JFrame 时,它​​不会剪辑。所以图像从右到左移动。这是如何开始游戏的图片。理想情况下,图形始终从这个矩形开始:

图片#1:http://i.stack.imgur.com/idL8f.png

现在,这是当我按下播放开始时发生的情况。

图片#2:http://i.stack.imgur.com/dxtbe.png

如何设置面板/框架,使图形仅占用 800x800(如第一张图片)而其他所有内容都被裁剪掉?

2) 我对如何设置 JFrame 有点困惑。这就是我希望它的布局方式:

图片#3:http://i.stack.imgur.com/ZyJS5.png

您将如何布置 JFrame/Panels?我在考虑 BorderLayout,但我不确定它是否可行。

3) 对于这个游戏,我扩展 JFrame 的类也包含 main()。这是不好的做法吗?** 您是否应该不在主类上扩展 JFrame?

最佳答案

  1. 获得 800x800 面板的最简单方法是使用 setPreferredSize(),然后使用 pack() 包含的 JFrame。方便地,pack()“使此 Window 的大小适合其子组件的首选大小和布局。”

2).参见 A Visual Guide to Layout Managers布局建议。您可以使用嵌套面板来实现所需的布局。

3).扩展 JFrame 没有什么错误,但除非您修改 JFrame行为,否则没有什么意义。相比之下,JPanel 是一个方便的组件分组容器;它被设计用于扩展。你可以检查这个 example在这方面。

附录:

I don't want the panel to show anything but the 800 pixels in the x and y direction.

您可以覆盖 paintComponent() 并复制图像的任何所需部分。在下面的示例中,g.drawImage(img, 0, 0, null) 绘制图像左上角的 800 像素,而 g.drawImage(img, 0, 0, getWidth (), getHeight(), null) 缩放面板大小的图像。请注意,f.setResizable(false) 会阻止更改窗口的大小。

附录:您还可以将源图像的任意部分复制到目标面板,如下所示。还可以考虑覆盖 getPreferredSize(),如建议的那样 here .

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;

/** @see http://stackoverflow.com/q/3851847 */
public class MyPanel extends JPanel {

private BufferedImage img;

public MyPanel() {
this.setPreferredSize(new Dimension(800, 800));
try {
img = ImageIO.read(new File("../scratch/image.png"));
} catch (IOException ex) {
ex.printStackTrace(System.err);
}
}

@Override
protected void paintComponent(Graphics g) {
// g.drawImage(img, 0, 0, 800, 800, null);
// g.drawImage(img, 0, 0, getWidth(), getHeight(), null);
g.drawImage(img, 0, 0, 800, 800, 0, 0, 800, 800, this);
}

private void display() {
JFrame f = new JFrame("MyPanel");
// f.setResizable(false);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(this);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}

public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {

@Override
public void run() {
new MyPanel().display();
}
});
}
}

关于Java - JFrame、JPanel、布局和裁剪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3851847/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com