Java-JFrame、JPanel、布局和剪辑
我有三个问题。(注意-我没有足够的声誉来发布图片,所以我链接了它们。我需要混淆它们…) 1) 我创建了一个面板来保存我的游戏图形(玩家区域)。面板应为800x800,并夹住下方和右侧的所有部件。但当我将图形面板添加到JFrame时,它不会剪辑。所以图像在左右两边都有。 这是一张如何开始游戏的图片。理想情况下,图形将始终在此矩形中开始: 图#1: 现在,当我按play开始时会发生什么 图2: 如何设置面板/框架,使图形仅占800x800(如第一张图片),其他所有内容都被剪裁 2) 我对如何设置JFrame有点困惑。这就是我想要的布局: 图片#3: 您将如何布置框架/面板?我在考虑边界布局,但我不确定它是否可行 3) 对于这个游戏,扩展JFrame的类还包含main()。这种做法不好吗?**您不应该在主类上扩展JFrame吗Java-JFrame、JPanel、布局和剪辑,java,swing,layout,jframe,jpanel,Java,Swing,Layout,Jframe,Jpanel,我有三个问题。(注意-我没有足够的声誉来发布图片,所以我链接了它们。我需要混淆它们…) 1) 我创建了一个面板来保存我的游戏图形(玩家区域)。面板应为800x800,并夹住下方和右侧的所有部件。但当我将图形面板添加到JFrame时,它不会剪辑。所以图像在左右两边都有。 这是一张如何开始游戏的图片。理想情况下,图形将始终在此矩形中开始: 图#1: 现在,当我按play开始时会发生什么 图2: 如何设置面板/框架,使图形仅占800x800(如第一张图片),其他所有内容都被剪裁 2) 我对如何设置JF
setPreferredSize()
,然后使用pack()
包含is的JFrame
。方便地,pack()
“使此窗口的大小符合其子组件的首选大小和布局。”
JFrame
没有什么错,但除非修改JFrame
的行为,否则没有什么意义。相比之下,JPanel
是一个方便的组件分组容器;它被设计用来扩展。你可以从这方面来研究这一点
增编:
我不希望面板显示任何东西,除了x和y方向的800像素
您可以覆盖paintComponent()
并复制所需图像的任何部分。在下面的示例中,g.drawImage(img,0,0,null)
绘制图像的左上800像素,而g.drawImage(img,0,0,getWidth(),getHeight(),null)
缩放图像并调整面板大小。请注意,f.setresizeable(false)
防止更改窗口大小
附录:您还可以将源图像的任意部分复制到源图像的任意区域
目标面板,如下所示。也可以考虑重写<代码> GETAPYRESSIZE()<代码>,如建议的。< /P>
编辑;如果不正确,请还原。你是指剪裁、裁剪还是缩放?@trashgood:我的意思是,我希望游戏包含在其中,并显示它原来所在的800x800矩形。我不希望面板在x和y方向上显示800像素的任何内容。(因此,溢出的图像在每个方向上仍将超过800,但不会显示。)对于#3,修改行为需要什么?扩展与实例化JFrame是否会改变一个人以任何方式使用JFrame的方式?@Dan James:根据我对上面评论的理解,我添加了一个例子。
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();
}
});
}
}