[英]Java - JFrame, JPanel, Layout, and Clipping
我有三个问题/问题。 (注意 - 我没有足够的声誉来发布图片,所以我链接了它们。我需要混淆它们......)
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 吗?
setPreferredSize()
然后pack()
包含的JFrame
。 方便地, pack()
“使这个Window
大小适合其子组件的首选大小和布局。”2)。 有关布局建议,请参阅布局管理器可视指南。 您可以使用嵌套面板来实现所需的布局。
3)。 扩展JFrame
没有任何问题,但除非您修改JFrame
的行为,否则没有什么意义。 相比之下, JPanel
是一个方便的组件分组容器; 它旨在扩展。 您可以在这方面检查此示例。
附录:
除了 x 和 y 方向的 800 像素之外,我不希望面板显示任何内容。
您可以覆盖paintComponent()
并复制所需的图像部分。 在下面的示例中, g.drawImage(img, 0, 0, null)
绘制图像的左上角 800 像素,而g.drawImage(img, 0, 0, getWidth(), getHeight(), null)
缩放面板大小的图像。 请注意, f.setResizable(false)
可防止更改窗口的大小。
附录:您还可以将源图像的任意部分复制到目标面板的任意区域,如下所示。 也可以考虑覆盖getPreferredSize()
作为建议在这里。
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();
}
});
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.