[英]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.